ساخت Pagination شخصی سازی شده در Laravel
یکی از المان های شناخته شده و رایج در طراحی سایت ، صفحه بندی یا همان Pagination است که در صفحات مربوط به دسته بندی ، برچسب ، فروشگاه و … کاربرد فراوانی دارد. در این پست یکی از مشکلات رایج را حل میکنیم.
توضیح و نکات در مورد Pagination را به پستی دیگر منتقل می کنیم و فرض را بر این می گیریم که همه شما از آن اطلاع دارید. ساده ترین راه برای صفحه بندی در لاراول استفاده از تابع ()paginate است. به این صورت :
$posts = Post::orderBy('title')->paginate(10);
این دستور و روش برای وقتی است که در ساده ترین حالت ممکن ، داده ها را از دیتابیس دریافت کرده ، صفحه بندی می کنیم و به view ارسال می کنیم. حال اگر بخواهیم قبل از ارسال در آن ها تغییری ایجاد کنیم یا اصلا به جای داده های دیتابیس با یک آرایه معمولی طرف باشیم ، دیگر این روش کاربردی ندارد. برای مثال :
$posts = Post::orderBy('title')->get();
$posts_array = array();
foreach($posts as $post){
$post->custom_field = "value";
array_push($posts_array, $post);
}
return view('blog.post.index', compat('posts_array'));
یا حتی یک آرایه معمولی به این شکل :
$items = [
'item1',
'item2',
'item3',
'item4',
'item5',
'item6',
'item7',
'item8',
'item9',
'item10'
];
return view('view', compat('items'));
در مثال بالا ما دیگر با Collection پیشفرض لاراول سر و کار نداریم و تنها یک آرایه در اختیار ماست. حال سوال اینجاست که چطور باید یک آرایه را صفحه بندی کرد ؟
راه حل
برای اینطور موقعیت ها کلاسی های مختلفی وجود دارد که یکی از آن ها LengthAwarePaginator می باشد.
تابع قبلی تمام کارها را به صورت خودکار برای ما انجام میداد و فقط کافی بود تا تعداد آیتم در هر صفحه را به آن بدهیم. حال باید تمام مراحل را دستی انجام دهیم. این مراحل شامل موارد زیر است :
- دریافت شماره صفحه فعلی / درخواستی
- دریافت تعداد آیتم در هر صفحه
- تکه تکه کردن آرایه
- صفحه بندی داده ها
- تنظیم کردن URL ها
جهت انجام تمامی مراحل بالا به این صورت عمل می کنیم :
// دریافت شماره صفحه فعلی
$currentPage = LengthAwarePaginator::resolveCurrentPage();
// تبدیل آرایه به مجموعه
$itemCollection = collect($posts_array);
// تعداد آیتم در هر صفحه
$perPage = 10;
// قطعه قطعه کردن داده ها
$currentPageItems = $itemCollection->slice(($currentPage * $perPage) - $perPage, $perPage)->all();
// صفحه بندی کردن داده ها
$posts = new LengthAwarePaginator($currentPageItems, count($itemCollection), $perPage);
// تنظیم آدرس صفحه ها
$posts->setPath($request->url());
حال با ارسال posts$
به view می توانیم داده های صفحه بندی شده را مدیریت کرده و همانند قبل با استفاده از دستور ()posts->links$
لینک ها را ایجاد نماییم.
در مطلبی دیگر به Pagination و نکات و مزایای استفاده از آن می پردازیم.