pbList
Универсальный листер с пагинацией из коробки. Указываете модель и чанк — получаете постраничный список, не написав под него контроллер.
[[!pbList]]
[[!pbList? &model=`PbResource` &parent=`[[*id]]` &tpl=`myItem` &limit=`10`]]Голый вызов — это не описка: без единого параметра сниппет выводит опубликованные строки PbResource через дефолтный чанк pageblocks.resource, который пакет ставит обычным чанком — его видно в дереве элементов и можно править на месте.
Параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
model | PbResource | Короткое имя модели, ищется в PageBlocks\App\Models\. Неизвестное имя пишется в лог, вывод пустой. |
tpl | pageblocks.resource | Чанк одной строки, получает item. Запись та же, что и во всём PageBlocks: голое имя — чанк из базы, file:chunks/card — файл, @INLINE <b>{$item->pagetitle}</b> — шаблон строкой. |
parent | Сокращение для «принадлежит ресурсу N» (model_id = N). | |
parent_type | modDocument | Морф-класс владельца, если это не ресурс. |
where | Условия JSON-ом: {"template":4} или [["price",">=","100"]]. | |
scopes | published | Скоупы Eloquent через запятую. Пустое значение отключает. |
orderBy / sortby | menuindex | "menuindex", "menuindex desc" или JSON {"price":"desc"}. |
limit | 10 | Строк на страницу. |
offset | 0 | Пропустить столько строк до первой страницы. total уменьшается на столько же, иначе последняя страница обещала бы строки, которых уже нет. |
sortdir | asc | Направление для тех колонок sortby, у которых оно не написано. Явное sortby='price desc' сильнее. |
tplWrapper | Чанк, оборачивающий весь вывод — контейнер #pb-items и пагинацию, — получает output и total. Снаружи он намеренно: AJAX заменяет внутренность #pb-items, а «показать ещё» туда дописывает, поэтому обёртка внутри дублировалась бы на каждой догрузке. | |
tplEmpty | Чанк вместо строк, когда ничего не нашлось. Пагинация и кнопка «показать ещё» тогда не рисуются вовсе. | |
outputSeparator | \n | Чем склеивать строки; действует и на AJAX-страницах. |
toPlaceholder | Вывод уходит в плейсхолдер MODX, сниппет возвращает пустоту. | |
class | d-flex flex-column gap-3 | CSS-классы обёртки. |
loadmore | Кнопка «показать ещё» вместо номеров страниц. | |
loadmoreLabel | Показать ещё | Надпись на кнопке. |
showLog | Печатает причину пустого списка рядом с выводом; видно только в менеджере. См. Intro. |
Что выводится
<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 — через пробел, без скобок и без запятых:
{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` — блок покажется тому, кто вошёл в менеджер.