description

تقویم شخصی

- 7 ماه پیش
توسط pedi آپدیت شد
محمد ( 32 تجربه )
7 ماه پیش

سلام میخواستم بپرسم توی برنامه لاراول چه جوری میشه یه تقویم شمسی خام توی برنامه داشت و کاربر هر جور که دلش میخاد اونو بتونه شخصی سازی کنه..مثلا یه روزایی رو تعطیل کنه یا کارایی مثل این.

بهترین پاسخ انتخاب شده توسط محمد
pedi
7 ماه پیش

یه جدول درست میکنی به نام calendar که این ستون هارو داشته باشه:

id(bigInt) | date(date) | day_of_week(enum) | is_off(tinyInteger)

ستون id باید تاریخ فارسی باشه بصورت به هم چسبیده. مثلا امروز میشه:

id => 13960901 | date => 2017-11-22 | day_of_week => 'wednesday' | is_off => 0

حالا میری داخل seeder یه حلقه درست میکنی به تعداد روزهایی که میخای تو تقویم داشته باشی مثلا 365 تا برای یک سال. جدولو پر میکنی. بعدش دیگه هرمدلی که میخای باهاش رابطه داشته باشی، براش relation تعریف میکنی. میتونی بسته به نیازت، ستون های دیگه هم اضافه کنی. من فقط ستون های اصلیو گفتم. حالا برای نشون دادنش:
کنترلر:

public function calendar($year = null, $month = null)
{
    $datelist = [];
    if ($year && $month) {
        $id_format = $year.$month;
    } else {
        $id = DB::table('calendars')->where('date', date('Y-m-d'))->value('id');
        $id_format = substr($id, 0, 6);
    }
    $res = Calendar::where('id', 'like', $id_format . '%')
        ->get(['id', 'date' ,'day_of_week',  DB::Raw("day_of_week * 1  AS day_num")])
        ->toArray();

    if (! empty($res)) {
        foreach ($res as $key => $val) {
            preg_match('/^(d{4})(d{2})(d{2})$/', $val['id'], $date);
            $val['date'] = $date;
            $current_month = $date[2];
            $current_year = $date[1];
            $firstDate = 7 -((7 + $date[3] - $val['day_num']) % 7);
            if ($date[3] == '01') {
                for ($i = 0; $i < $firstDate; $i++)
                    $datelist[floor(($date[3] + $firstDate - 1) / 7)][$i] = null;
            }

            $datelist[floor(($date[3] + $firstDate - 1) / 7)][($date[3] + $firstDate - 1) % 7] = $val;
        }

        if ($current_month == 12) {
            $next_month = 1;
            $next_year = $current_year + 1;
        } else {
            $next_month = $current_month + 1;
            $next_year = $current_year;
        }

        if ($current_month == 01) {
            $prev_month = 12;
            $prev_year = $current_year - 1;
        } else {
            $prev_month = $current_month - 1;
            $prev_year = $current_year;
        }

        if ($next_month <= 9) {
            $next_month = '0' . $next_month;
        }

        if ($prev_month <= 9 ) {
            $prev_month = '0' . $prev_month;
        }
    }

    return view('calendar', [
        'calendars' => $datelist,
        'current_year' => @$current_year,
        'current_month' => @$current_month,
        'next_year' => @$next_year,
        'next_month' => @$next_month,
        'prev_month' => @$prev_month,
        'prev_year' => @$prev_year
    ]);
}

داخل ویو:

<table class="table table-bordered">
  <thead>
    <tr>
      <th>شنبه</th>
      <th>یکشنبه</th>
      <th>دوشنبه</th>
      <th>سه شنبه</th>
      <th>چهارشنبه</th>
      <th>پنج شنبه</th>
      <th>جمعه</th>
    </tr>
  </thead>
  <tbody>
    @foreach($calendars as $calendar)
        <tr>
            @foreach($calendar as $cal)
                <td>
                    <div class="day">{{ substr($cal['id'], 6, 8) }}</div>
                </td>
            @endforeach
        </tr>
    @endforeach
  </tbody>
</table>
pedi ( 1926 تجربه )
7 ماه پیش

یه جدول درست میکنی به نام calendar که این ستون هارو داشته باشه:

id(bigInt) | date(date) | day_of_week(enum) | is_off(tinyInteger)

ستون id باید تاریخ فارسی باشه بصورت به هم چسبیده. مثلا امروز میشه:

id => 13960901 | date => 2017-11-22 | day_of_week => 'wednesday' | is_off => 0

حالا میری داخل seeder یه حلقه درست میکنی به تعداد روزهایی که میخای تو تقویم داشته باشی مثلا 365 تا برای یک سال. جدولو پر میکنی. بعدش دیگه هرمدلی که میخای باهاش رابطه داشته باشی، براش relation تعریف میکنی. میتونی بسته به نیازت، ستون های دیگه هم اضافه کنی. من فقط ستون های اصلیو گفتم. حالا برای نشون دادنش:
کنترلر:

public function calendar($year = null, $month = null)
{
    $datelist = [];
    if ($year && $month) {
        $id_format = $year.$month;
    } else {
        $id = DB::table('calendars')->where('date', date('Y-m-d'))->value('id');
        $id_format = substr($id, 0, 6);
    }
    $res = Calendar::where('id', 'like', $id_format . '%')
        ->get(['id', 'date' ,'day_of_week',  DB::Raw("day_of_week * 1  AS day_num")])
        ->toArray();

    if (! empty($res)) {
        foreach ($res as $key => $val) {
            preg_match('/^(d{4})(d{2})(d{2})$/', $val['id'], $date);
            $val['date'] = $date;
            $current_month = $date[2];
            $current_year = $date[1];
            $firstDate = 7 -((7 + $date[3] - $val['day_num']) % 7);
            if ($date[3] == '01') {
                for ($i = 0; $i < $firstDate; $i++)
                    $datelist[floor(($date[3] + $firstDate - 1) / 7)][$i] = null;
            }

            $datelist[floor(($date[3] + $firstDate - 1) / 7)][($date[3] + $firstDate - 1) % 7] = $val;
        }

        if ($current_month == 12) {
            $next_month = 1;
            $next_year = $current_year + 1;
        } else {
            $next_month = $current_month + 1;
            $next_year = $current_year;
        }

        if ($current_month == 01) {
            $prev_month = 12;
            $prev_year = $current_year - 1;
        } else {
            $prev_month = $current_month - 1;
            $prev_year = $current_year;
        }

        if ($next_month <= 9) {
            $next_month = '0' . $next_month;
        }

        if ($prev_month <= 9 ) {
            $prev_month = '0' . $prev_month;
        }
    }

    return view('calendar', [
        'calendars' => $datelist,
        'current_year' => @$current_year,
        'current_month' => @$current_month,
        'next_year' => @$next_year,
        'next_month' => @$next_month,
        'prev_month' => @$prev_month,
        'prev_year' => @$prev_year
    ]);
}

داخل ویو:

<table class="table table-bordered">
  <thead>
    <tr>
      <th>شنبه</th>
      <th>یکشنبه</th>
      <th>دوشنبه</th>
      <th>سه شنبه</th>
      <th>چهارشنبه</th>
      <th>پنج شنبه</th>
      <th>جمعه</th>
    </tr>
  </thead>
  <tbody>
    @foreach($calendars as $calendar)
        <tr>
            @foreach($calendar as $cal)
                <td>
                    <div class="day">{{ substr($cal['id'], 6, 8) }}</div>
                </td>
            @endforeach
        </tr>
    @endforeach
  </tbody>
</table>
محمد ( 32 تجربه )
7 ماه پیش

خیلی ممنون از پاسختون
فقط اگه میشه بگین داخل کنترلر متغیر p_date از کجا اومده و به چی اشاره میکنه

pedi ( 1926 تجربه )
7 ماه پیش

منظورم همون متغیر date بود اشتباه نوشته بودم درستش کردم. معذرت

برای ارسال پاسخ باید وارد سایت شوید