pdoTools: как выводить и фильтровать ресурсы в MODX
В pdoTools выборка ресурсов строится вокруг pdoResources: можно ограничить её родителями, задать условия через where и оформить результат чанком. Разбираем, какой фильтр выбрать и где типичные настройки дают пустой список.

Если список ресурсов в MODX показывает лишнее или не показывает ничего, причина часто в сочетании условий выборки: pdoResources ограничивает ресурсы по родителям, а параметр where добавляет условия к запросу. Ниже — практический разбор для pdoTools 2.x в MODX Revolution 2.x и 3.x: как настроить вывод, проверить фильтры и не перепутать фильтрацию по полям ресурса с отбором по TV.
Из чего складывается вывод
Основной сниппет для списка ресурсов — pdoResources. Он получает ресурсы из MODX и передаёт каждый результат в чанк, указанный в tpl. В чанке задаётся разметка одной строки или карточки. Так данные и HTML остаются отдельно: условия меняются в вызове сниппета, а внешний вид — в чанке.
Пример выводит до десяти ресурсов из дочерних страниц текущего ресурса. Создайте чанк catalog.row с разметкой карточки, затем вызовите сниппет:
[[!pdoResources?
&parents=`[[*id]]`
&depth=`2`
&limit=`10`
&tpl=`catalog.row`
]]
Вызов с восклицательным знаком не кэшируется. Это важно, если результат зависит от текущей страницы или параметров запроса; для статичного списка вопрос кэширования можно решать отдельно.
Перед настройкой проверьте: установлен ли pdoTools, существует ли чанк с указанным именем и есть ли у пользователя доступ к редактированию элементов. Синтаксис ниже рассчитан на pdoTools 2.x; если у вас другая версия, сверяйте параметры с документацией именно установленного релиза.
Три способа сузить выборку
| Задача | Параметр | Когда применять | На что смотреть |
|---|---|---|---|
| Выбрать раздел | parents, depth | Нужны потомки одного или нескольких ресурсов | Проверьте ID родителя и глубину вложенности |
| Указать конкретные ресурсы | resources | Список заранее известен | Убедитесь, что ID перечислены корректно |
| Добавить условие по полю ресурса | where | Нужно отобрать ресурсы по значению поля, например по шаблону | Проверьте название поля и формат JSON |
Условия по полям ресурса можно передать в where в JSON-формате. Например, чтобы оставить ресурсы с шаблоном 5:
[[!pdoResources?
&parents=`12`
&where=`{"template":5}`
&limit=`10`
&tpl=`catalog.row`
]]
Число в условии — пример ID шаблона, а не универсальное значение: подставьте ID из своей установки. Если указываете несколько условий, проверьте, что JSON остаётся корректным. Кавычки, запятые и скобки здесь не декоративны: ошибка в формате может привести к пустой выборке.
Фильтр работает не «по смыслу», а по точному условию запроса. Когда список пуст, сначала проверьте входные параметры и существование подходящих ресурсов — и только потом переписывайте чанк.
Как искать причину пустого результата
- Уберите фильтры по одному. Временно оставьте только
parentsиtpl. Если ресурсы появились, добавляйте ограничения обратно по одному. Проверка: после каждого изменения понятно, какое условие обнуляет список. - Проверьте ID раздела. Убедитесь, что число в
parentsсовпадает с ID нужного ресурса. Если указан родитель, но нужные страницы лежат глубже, проверьте значениеdepth. Проверка: тестовый ресурс находится в пределах заданной глубины. - Проверьте условие where. Сверьте название поля и значение с данными ресурса, затем проверьте JSON. Проверка: тот же ресурс проходит выборку, если временно убрать
where. - Проверьте чанк. Убедитесь, что имя в
tplсовпадает с именем чанка и в чанке есть выводимые поля, например заголовок ресурса. Проверка: вместо пустой области появляется карточка. - Проверьте кэш. Если настройки уже изменились, а результат прежний, очистите кэш MODX и повторите проверку. Проверка: после очистки отображается актуальный результат.
Ресурсы и TV — не одно и то же
where подходит для условий по полям ресурса. TV — отдельные дополнительные поля MODX, и вывод значения TV в чанке не означает, что ресурс автоматически отфильтрован по этому значению. В pdoTools для TV предусмотрены отдельные параметры фильтрации; их точный формат лучше сверить в документации версии, установленной на сайте. Не подменяйте TV условием по одноимённому полю ресурса: это разные источники данных.
Если выборка должна учитывать пользовательский ввод, например фильтр каталога из GET-параметра, не вставляйте значение напрямую в строку условия без проверки. Ограничьте допустимые значения и изучите рекомендации документации pdoTools по параметрам фильтрации. Иначе можно получить некорректный запрос или нежелательное поведение.
Где ломается такой подход
Параметры parents, depth и where решают разные задачи, поэтому не стоит компенсировать ошибку одного параметра другим. Большой depth может расширить выборку сильнее, чем нужно; слишком узкое условие where исключит подходящие ресурсы. А если результатов много, вывод всех элементов без ограничения увеличит нагрузку и время ответа.
Для проверки сравните результат с небольшим limit, затем откройте страницу с реальными условиями и измерьте время ответа и число возвращаемых элементов. Универсальной цифры безопасного лимита нет: она зависит от объёма контента, шаблона, TV и нагрузки на сервер.
Сниппет — небольшой фрагмент логики MODX, который вызывают в содержимом страницы или шаблоне. TV — дополнительное поле ресурса, созданное в системе управления контентом.
Что делать дальше
Начните с одной выборки: задайте раздел через parents, выведите результат знакомым чанком и убедитесь, что он работает без дополнительных условий. Затем добавьте один фильтр и проверьте его на ресурсе с известными данными. После этого отдельно настройте TV-фильтрацию, если она нужна, и следите в рабочей среде за временем ответа и корректностью списка после изменения контента. Формат параметров сверяйте с документацией pdoTools для вашей версии.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Документация pdoTools: pdoResources, Репозиторий pdoTools на GitHub
Частые вопросы
Почему pdoResources ничего не выводит?
Как показать ресурсы только из одного раздела?
Можно ли фильтровать ресурсы по TV через where?
Почему значение TV не появляется в карточке?
Подойдут ли эти примеры для любой версии pdoTools?
Как понять, что фильтрация создаёт лишнюю нагрузку?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.