📖 Пагинация
Пагинация в третьей версии — это 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() и четыре шаблона
links() отдаёт готовый HTML. Какая будет разметка — задаётся именем шаблона; в поставке по умолчанию стоит pages:
| Имя | Разметка |
|---|---|
pages | по умолчанию — pagination Bootstrap, номера со стрелками « / » |
bootstrap | Bootstrap с подписями «Новые / Ранние» и иконками Bootstrap Icons |
tailwind | утилитарные классы Tailwind |
simple | голые <a> внутри .pagination, без фреймворка |
$paginator->links(); // 'pages'
$paginator->links('tailwind');Подписи не переводятся
Они зашиты в сам рендерер, а не читаются из лексикона, и часть из них по-русски. Рендерер ваш — он лежит в core/App/Services/PaginationViewFactory.php, куда пакет пишет один раз и больше не перезаписывает. Правьте его или собирайте навигацию сами из $paginator->items() и номеров страниц.
PaginationViewFactory::setDefaultTemplate('simple') меняет значение по умолчанию на весь сайт.
Сохранение строки запроса
По умолчанию ссылки страниц несут только ?page=N и теряют всё остальное, включая фильтры. withQueryString() сохраняет остаток:
$paginator = query('site_content')->paginate(10)->withQueryString();Это частая причина жалобы «перешёл на вторую страницу — фильтр слетел».
Двое рядом — когда withQueryString() много или мало:
$paginator->appends(['sort' => 'price']); // добавить свои параметры
$paginator->fragment('list'); // каждая ссылка кончается на #listВ шаблоне
{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.