محمد
7 سال پیش توسط محمد مطرح شد
3 پاسخ

تقویم شخصی

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


ثبت پرسش جدید
عمو پدی
تخصص : برنامه نویس خرده پای ری اکت
@pedram6195 7 سال پیش آپدیت شد
2

یه جدول درست میکنی به نام 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>

محمد
@mradaei7 7 سال پیش آپدیت شد
0

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


عمو پدی
تخصص : برنامه نویس خرده پای ری اکت
@pedram6195 7 سال پیش مطرح شد
0

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام