📖 Пагинация
Пагинация в третьей версии — это illuminate/pagination. Собственного класса Paginator у PageBlocks больше нет: paginate() возвращает стандартный Illuminate\Pagination\LengthAwarePaginator.
Чаще всего вам нужен pbList
pbList уже собирает постраничный список вместе с AJAX и без контроллера. Браться за пагинатор напрямую стоит, только когда вы пишете свой контроллер.
Постраничная выборка
Работает одинаково на конструкторе запросов и на модели:
$paginator = query('site_content')
->where('template', 5)
->whereNotNull('publishedon')
->orderByDesc('publishedon')
->paginate(5);
$paginator = model('PbResource')->published()->paginate(10);Текущая страница берётся из параметра запроса page.
Что умеет пагинатор
$paginator->items(); // массив строк текущей страницы
$paginator->total(); // 92 - всего строк
$paginator->currentPage(); // 1
$paginator->lastPage(); // 19
$paginator->perPage();
$paginator->hasPages();
$paginator->links(); // готовая навигацияlinks() отдаёт готовый HTML с классами Bootstrap, подписи берутся из лексикона — то есть следуют языку менеджера.
Сохранение строки запроса
По умолчанию ссылки страниц несут только ?page=N и теряют всё остальное, включая фильтры. withQueryString() сохраняет остаток:
$paginator = query('site_content')->paginate(10)->withQueryString();Это частая причина жалобы «перешёл на вторую страницу — фильтр слетел».
В шаблоне
{foreach $paginator->items() as $item}
<article>
<a href="{$item->uri}">{$item->pagetitle}</a>
</article>
{/foreach}
<nav>{$paginator->links()}</nav>Пример контроллера
class NewsController
{
public function index()
{
$paginator = query('site_content')
->where('template', 5)
->orderByDesc('publishedon')
->paginate(5)
->withQueryString();
return view('file:templates/news', [
'paginator' => $paginator,
]);
}
}AJAX
Сам пагинатор рисует обычные ссылки. Если нужна смена страницы без перезагрузки — либо берите pbList, он держит запрос на сервере под непрозрачным ключом и подменяет строки по AJAX, либо управляйте ссылками сами через pbPagination.