Skip to content

pbList ​

Универсальный листер с пагинацией из коробки. Указываете модель и чанк — получаете постраничный список, не написав под него контроллер.

[[!pbList]]
[[!pbList? &model=`PbResource` &parent=`[[*id]]` &tpl=`myItem` &limit=`10`]]

Голый вызов — это не описка: без единого параметра сниппет выводит опубликованные строки PbResource через дефолтный чанк pageblocks.resource, который пакет ставит обычным чанком — его видно в дереве элементов и можно править на месте.

Параметры ​

ПараметрПо умолчаниюОписание
modelPbResourceКороткое имя модели, ищется в PageBlocks\App\Models\. Неизвестное имя пишется в лог, вывод пустой.
tplpageblocks.resourceЧанк одной строки, получает item. Запись та же, что и во всём PageBlocks: голое имя — чанк из базы, file:chunks/card — файл, @INLINE <b>{$item->pagetitle}</b> — шаблон строкой.
parentСокращение для «принадлежит ресурсу N» (model_id = N).
parent_typemodDocumentМорф-класс владельца, если это не ресурс.
whereУсловия JSON-ом: {"template":4} или [["price",">=","100"]].
scopespublishedСкоупы Eloquent через запятую. Пустое значение отключает.
orderBy / sortbymenuindex"menuindex", "menuindex desc" или JSON {"price":"desc"}.
limit10Строк на страницу.
offset0Пропустить столько строк до первой страницы. total уменьшается на столько же, иначе последняя страница обещала бы строки, которых уже нет.
sortdirascНаправление для тех колонок sortby, у которых оно не написано. Явное sortby='price desc' сильнее.
tplWrapperЧанк, оборачивающий весь вывод — контейнер #pb-items и пагинацию, — получает output и total. Снаружи он намеренно: AJAX заменяет внутренность #pb-items, а «показать ещё» туда дописывает, поэтому обёртка внутри дублировалась бы на каждой догрузке.
tplEmptyЧанк вместо строк, когда ничего не нашлось. Пагинация и кнопка «показать ещё» тогда не рисуются вовсе.
outputSeparator\nЧем склеивать строки; действует и на AJAX-страницах.
toPlaceholderВывод уходит в плейсхолдер MODX, сниппет возвращает пустоту.
classd-flex flex-column gap-3CSS-классы обёртки.
loadmoreКнопка «показать ещё» вместо номеров страниц.
loadmoreLabelПоказать ещёНадпись на кнопке.
showLogПечатает причину пустого списка рядом с выводом; видно только в менеджере. См. Intro.

Что выводится ​

html
<div class="d-flex flex-column gap-3" id="pb-items"
     data-pb-key="pblist2_a1b2…" data-pb-total="137" data-pb-last-page="14">
  <!-- строки через tpl -->
</div>
<div class="pb-pagination mt-4" pb-pagination>
  <!-- номера страниц -->
</div>

data-pb-key — хэш разобранного запроса, сам запрос лежит в кэше на сервере. Пагинация отправляет обратно только этот ключ, поэтому браузер не видит условий выборки и не может их подменить. Без JavaScript тоже работает: ссылки несут ?page=N, и сниппет отрабатывает на сервере заново.

Примеры ​

Дети текущего ресурса ​

[[!pbList? &parent=`[[*id]]` &tpl=`childItem` &limit=`20`]]

Другая модель, с фильтром и сортировкой ​

[[!pbList?
    &model=`PbVacancy`
    &tpl=`vacancyCard`
    &where=`{"city_id":7}`
    &orderBy=`{"published_at":"desc"}`
    &limit=`12`
]]

«Показать ещё» вместо номеров страниц ​

[[!pbList? &parent=`[[*id]]` &tpl=`childItem` &loadmore=`1` &limit=`9`]]

Из шаблона Fenom ​

Именованные параметры в стиле Smarty — через пробел, без скобок и без запятых:

php
{pbList model='PbResource' parent=$modx->resource->id tpl='childItem' limit=10}

tpl здесь значит то же, что и в теге выше: голое имя — чанк childItem из базы. Нужен файл — назовите источник: tpl='file:chunks/childItem'.

chunk: устарел

До alfa16 pbList читал голое имя как файл из core/App/elements/chunks/, а chunk: был способом дойти до базы — ровно наоборот по сравнению с остальными сниппетами, из-за чего &tpl=`card` означал разное в pbList и в pbResources. Теперь голое имя — база везде. chunk: работает ещё одну мажорную версию и пишет в лог MODX, что устарел; уберите префикс, и вызов будет значить то же самое.

Несуществующий чанк выводится пустотой

Отсутствующий шаблон не роняет страницу: вывод пустой, а причина уходит в лог MODX. Чтобы увидеть её прямо на странице, добавьте &showLog=`1` — блок покажется тому, кто вошёл в менеджер.

© PageBlocks 2019-present