یکی از اولین مواردی که برنامه نویسان در طراحی وبسایت با لاراول با آن مواجه می شوند بکار گیری تاریخ شمسی در وبسایت است. استفاده از تاریخ میلادی بسیار آسان بوده و با فراخوانی یک تابع php و یا استفاده از پکیج carbon مشکل حل خواهد شد اما در مورد تاریخ شمسی اینگونه نیست و گاهی اوقات دوستان برنامه نویس مثل خود من که تازه وارد این زمینه شده اند به مشکل بر می خورند.
یکی از بهترین پکیج ها برای به کارگیری تاریخ شمسی morilog/jalali است و با کمی مطالعه می توانید آن را در پروژه خود نصب و از آن استفاده کنید.
استفاده از این پکیج بسیار آسان است و تنها کافی است پس از نصب برای مثال در controller خود به صورت زیر از آن استفاده کنید.
$date = Jalalian::forge('last sunday')->format('date');
البته توجه داشته باشید که کلاس Jalalian
رو در بالای کنترلر وارد کنید
use MorilogJalaliJalalian;
نکته ای که من با اون خیلی کلنجار رفتم استفاده از تاریخ شمسی در سمت view و در blade بود
فرض کنید در یک کنترلر مثلا PostsController شما تمام پست ها رو دریافت کردید و می خواهید تمام پست ها را در یک لوپ در blade نمایش بدهید. در این سناریو شما مجبور هستید تا تاریخ پست ها را در دیتابیس به میلادی ذخیره کنید اما در زمان نمایش تاریخ ها را به شمسی تغییر دهید.
اکنون چگونه می توانید تاریخ پست ها را با استفاده از پکیج morilog/jalali در blade به شمسی تبدیل کنید؟
راه حل من:
راه حل من استفاده از traits است. در این صورت در هر زمان که بخواهید میتوانید تریت را در مدل خود فراخوانی کنید.
در دایرکتوری app در پروژه لاراول یک پوشه به نام Traits ایجاد کرده و سپس یک فایل به نام persianDate.php ایجاد کنید.
سپس در فایل ایجاد شده کد زیر را وارد کنید
<?php
namespace AppTraits;
use MorilogJalaliJalalian;
trait PersianDate{
public function PersianCreatedAt($format = "%d %B %Y")
{
return Jalalian::forge($this->created_at)->format($format);
}
}
اکنون در هر مدلی که می خواهید تاریخ را به شمسی تغییر دهید این تریت را استفاده کنید.
Post Model
<?php
namespace App;
use AppTraitsPersianDate;
use IlluminateDatabaseEloquentModel;
class Post extends Model
{
use PersianDate;
}
در PostsController تمام پست ها را دریافت کنید
PostController
<?php
namespace AppHttpControllers;
use AppPost;
class PostsController extends Controller
{
public function index(){
$posts= Post::all();
return view('index',compact('posts'));
}
}
اکنون در بخش view می توانید به راحتی به زمان شمسی هر پست به صورت زیر دسترسی داشته باشید. اگر دقت کرده باشید دیگر نیاز نیست تا زمان به صورت شمسی در دیتابیس ذخیره شود و در صورت نیاز شما به تاریخ میلادی نیز دسترسی دارید.
بخش index.blade.php
@foreach($posts as $post)
<div>{{$post->title}}</div>
<div>$post->PersianCreatedAt()}}</div>
@endforeach
راه حل شما چیست؟ اگر شما راه حل بهتر و کوتاه تری دارید حتما در قسمت کامنت با من در میان بگذارید
{{MorilogJalaliCalendarUtils::strftime('Y-m-d' , strtotime($legal->reception_notice_date))}}