Skip to content

📖 Пагинация

Пагинация в третьей версии — это illuminate/pagination. Собственного класса Paginator у PageBlocks больше нет: paginate() возвращает стандартный Illuminate\Pagination\LengthAwarePaginator.

Чаще всего вам нужен pbList

pbList уже собирает постраничный список вместе с AJAX и без контроллера. Браться за пагинатор напрямую стоит, только когда вы пишете свой контроллер.

Постраничная выборка

Работает одинаково на конструкторе запросов и на модели:

php
$paginator = query('site_content')
    ->where('template', 5)
    ->whereNotNull('publishedon')
    ->orderByDesc('publishedon')
    ->paginate(5);

$paginator = model('PbResource')->published()->paginate(10);

Текущая страница берётся из параметра запроса page.

Что умеет пагинатор

php
$paginator->items();        // массив строк текущей страницы
$paginator->total();        // 92  - всего строк
$paginator->currentPage();  // 1
$paginator->lastPage();     // 19
$paginator->perPage();
$paginator->hasPages();
$paginator->links();        // готовая навигация

links() отдаёт готовый HTML с классами Bootstrap, подписи берутся из лексикона — то есть следуют языку менеджера.

Сохранение строки запроса

По умолчанию ссылки страниц несут только ?page=N и теряют всё остальное, включая фильтры. withQueryString() сохраняет остаток:

php
$paginator = query('site_content')->paginate(10)->withQueryString();

Это частая причина жалобы «перешёл на вторую страницу — фильтр слетел».

В шаблоне

php
{foreach $paginator->items() as $item}
    <article>
        <a href="{$item->uri}">{$item->pagetitle}</a>
    </article>
{/foreach}

<nav>{$paginator->links()}</nav>

Пример контроллера

php
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.

© PageBlocks 2019-present