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. Какая будет разметка — задаётся именем шаблона; в поставке по умолчанию стоит pages:

ИмяРазметка
pagesпо умолчанию — pagination Bootstrap, номера со стрелками « / »
bootstrapBootstrap с подписями «Новые / Ранние» и иконками Bootstrap Icons
tailwindутилитарные классы Tailwind
simpleголые <a> внутри .pagination, без фреймворка
php
$paginator->links();            // 'pages'
$paginator->links('tailwind');

Подписи не переводятся

Они зашиты в сам рендерер, а не читаются из лексикона, и часть из них по-русски. Рендерер ваш — он лежит в core/App/Services/PaginationViewFactory.php, куда пакет пишет один раз и больше не перезаписывает. Правьте его или собирайте навигацию сами из $paginator->items() и номеров страниц.

PaginationViewFactory::setDefaultTemplate('simple') меняет значение по умолчанию на весь сайт.

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

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

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

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

Двое рядом — когда withQueryString() много или мало:

php
$paginator->appends(['sort' => 'price']);  // добавить свои параметры
$paginator->fragment('list');              // каждая ссылка кончается на #list

В шаблоне ​

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