سلام میخواستم بپرسم توی برنامه لاراول چه جوری میشه یه تقویم شمسی خام توی برنامه داشت و کاربر هر جور که دلش میخاد اونو بتونه شخصی سازی کنه..مثلا یه روزایی رو تعطیل کنه یا کارایی مثل این.
بهترین پاسخ
انتخاب شده توسط محمد
عمو پدی
3 سال پیش
یه جدول درست میکنی به نام 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>