Сниппет в MODX: выводим последние опубликованные страницы
Сниппет MODX может собрать свежие страницы и вывести их списком без отдельного компонента. Покажем пример для MODX Revolution 2.8 и 3.x: с ограничением выборки, проверкой входных параметров и безопасным выводом заголовков.

Чтобы вывести на странице пять последних опубликованных материалов из заданного раздела MODX Revolution, не нужен отдельный компонент: достаточно создать сниппет и вызвать его тегом. Ниже — рабочий пример для MODX Revolution 2.8 и 3.x; он принимает ID родительского ресурса, количество строк и формирует список ссылок.
Что понадобится
Нужен доступ к менеджеру MODX с правами на создание элементов, а также опубликованные ресурсы в нужном разделе. Пример рассчитан на MODX Revolution 2.8 и 3.x, не на MODX Cloud или MODX Evolution. Код использует встроенный объект MODX и не требует установки дополнений.
Сниппет — PHP-скрипт, который MODX запускает при обработке специального тега в содержимом страницы.1 Здесь скрипт получит дочерние ресурсы и вернёт HTML-список.
Создайте сниппет
- В менеджере откройте раздел «Элементы» → «Сниппеты» и создайте новый сниппет. Назовите его
LatestChildren. Проверка: сниппет появился в списке элементов. - Вставьте в поле кода полный фрагмент ниже и сохраните. Проверка: MODX не показывает ошибку сохранения, а в поле остаётся PHP-код без обрезанных строк.
- Вызовите сниппет в содержимом ресурса, подставив ID родительской страницы. Проверка: после очистки кэша и перезагрузки страницы появляется список ссылок.
Пример рассчитан на стандартный объект ресурса MODX. Входные параметры проверяются до запроса, а заголовок экранируется перед вставкой в HTML.
<?php
$parent = isset($scriptProperties['parent'])
? (int) $scriptProperties['parent']
: 0;
$limit = isset($scriptProperties['limit'])
? (int) $scriptProperties['limit']
: 5;
if ($parent < 1) {
return '';
}
$limit = max(1, min($limit, 20));
$resources = $modx->getCollection('modResource', array(
'parent' => $parent,
'published' => 1,
'deleted' => 0,
));
$items = array();
foreach ($resources as $resource) {
$items[] = $resource;
}
usort($items, function ($first, $second) {
return (int) $second->get('publishedon')
<=> (int) $first->get('publishedon');
});
$items = array_slice($items, 0, $limit);
if (!$items) {
return '';
}
$output = '<ul class="latest-children">';
foreach ($items as $resource) {
$id = (int) $resource->get('id');
$title = htmlspecialchars(
$resource->get('pagetitle'),
ENT_QUOTES,
'UTF-8'
);
$url = htmlspecialchars(
$modx->makeUrl($id),
ENT_QUOTES,
'UTF-8'
);
$output .= '<li><a href="' . $url . '">'
. $title
. '</a></li>';
}
$output .= '</ul>';
return $output;
Функция usort сортирует уже полученные объекты в PHP. Для небольшого раздела это понятно и достаточно. Если в разделе тысячи ресурсов, такой вариант сначала загрузит их все, поэтому лучше перейти на запрос с сортировкой и лимитом на стороне базы данных — например, использовать pdoResources из пакета pdoTools и свериться с документацией установленной версии.
Вызов на странице
Вставьте тег в содержимое ресурса или в чанк:
[[!LatestChildren? &parent=`12` &limit=`5`]]
Замените 12 на ID родительского ресурса. Параметр limit задаёт число ссылок; сниппет ограничивает его диапазоном от 1 до 20. Восклицательный знак означает некэшируемый вызов: MODX выполнит сниппет при каждом обращении к странице. Для свежего списка это удобно, но на посещаемой странице увеличивает число запросов к базе.
Если список может обновляться с задержкой, уберите восклицательный знак и используйте кэшируемый вызов. Тогда результат может оставаться прежним до очистки или обновления кэша. Это не ошибка сниппета, а выбор между свежими данными и меньшей нагрузкой.
Сниппет или готовое дополнение
Самописный сниппет подходит, когда вывод простой и вы готовы поддерживать код. Готовое дополнение имеет смысл, если нужны фильтры, шаблоны, пагинация и выборка на стороне базы. Это не два способа получить одинаковую стоимость: короткий код проще контролировать, а сложная выборка в самописном решении быстрее превращается в собственный мини-фреймворк.
| Подход | Что выигрываете | Чем платите |
|---|---|---|
| Сниппет на встроенном API | Нет внешней зависимости, логика видна в одном месте | Нужно самостоятельно поддерживать сортировку, фильтры и вывод |
| pdoResources из pdoTools | Удобнее задавать выборку и шаблон вывода для больших списков | Появляется зависимость от дополнения и его версии |
| Чанк без сниппета | Можно оформить повторяющуюся HTML-разметку | Сам по себе чанк не выбирает ресурсы из базы |
Что ломается и как исправить
- Список пустой. Проверьте ID в параметре
parent, публикацию дочерних ресурсов и то, что у них действительно указан этот родитель. Не забудьте сохранить сниппет и очистить кэш сайта. - Ссылки есть, но ведут не туда. Проверьте настройки URI и контекст ресурса. Сниппет получает адрес через
makeUrl; если сайт использует нестандартную схему URL, проверьте итоговый адрес непосредственно в браузере. - Появилась ошибка PHP на операторе сравнения. В примере используется оператор сравнения
<=>, который доступен начиная с PHP 7.0. Проверьте версию PHP сайта; для более старой версии замените сортировку на совместимый вариант или обновите окружение. - Сниппет отдаёт ошибку после вставки. Проверьте, что скопировали весь код, включая начальное
<?php, и что в поле сниппета нет лишнего закрывающего тега PHP. Точный текст ошибки ищите в журнале ошибок MODX или PHP. - Страница стала медленнее. В этом примере загружаются все опубликованные дочерние ресурсы, а лимит применяется после сортировки. На большом разделе измерьте время ответа и число ресурсов; если выборка велика, используйте дополнение с ограничением запроса на стороне базы.
Когда выбирать каждый вариант
Оставьте сниппет, если раздел небольшой, список нужен в одном-двух местах, а порядок по дате публикации устраивает. Берите pdoResources, если важны пагинация, шаблоны, фильтры или большой объём данных. Чанк используйте вместе со сниппетом, когда нужно отделить HTML-разметку от логики, но не как замену выборке ресурсов.
Ключевое ограничение примера — не PHP-код, а то, что он загружает все дочерние ресурсы до применения лимита. Проверяйте размер раздела, прежде чем ставить этот сниппет на часто посещаемую страницу.
Что делать дальше
Проверьте результат на разделе с несколькими опубликованными ресурсами, затем на самом крупном разделе сайта. Сравните время ответа страницы с кэшируемым и некэшируемым вызовом. Если список должен обновляться сразу после публикации, оставьте некэшируемый вызов; если важнее нагрузка, настройте кэширование и проверьте, как редакторы будут обновлять его после изменений.
1 В MODX термин «сниппет» означает выполняемый PHP-элемент, а не просто фрагмент HTML. Сниппет возвращает результат, который MODX подставляет в место вызова.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: MODX Revolution: документация по элементам, pdoTools: репозиторий проекта
Частые вопросы
Можно ли вставить вызов сниппета в шаблон или чанк?
Почему в вызове стоит восклицательный знак?
Подойдёт ли пример для MODX Evolution?
Почему порядок по дате может быть неправильным?
Что делать, если в разделе очень много страниц?
Нужно ли очищать кэш после изменения сниппета?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.