Сниппеты в CMS MODX
В этой статье рассмотрим, что такое сниппет и зачем он нужен в MODX Revolution. Познакомимся с тем, как осуществляется вызов сниппета, чем отличается кэшированный вызов сниппета от не кэшированного, а также как осуществляется настройка, т.е. передача параметров или набора параметров, сниппету.
Назначение и способы вызова сниппета
Сниппет — это фрагмент php-кода, который в результате своего выполнения возвращает некоторый ответ. Для того чтобы сниппет приступил к выполнению своего кода, его необходимо вызвать. Вызов сниппета в MODX Revolution осуществляется с помощью следующего тега:
Отличается один способ вызова сниппета от другого только кэшированием.
Не кэшированный вариант вызова сниппета всегда возвращает текущие, полученные в результате выполнения кода, результаты. Применяется такой вариант вызова сниппета в тех случаях, когда он может вернуть при следующем запуске или в зависимости от некоторых других условий оличный (иной) результат. Не кэшированные вызовы сниппетов обычно используют для реализации системы авторизации на сайте, вывода блока комментариев и др.
В отличии от не кэшированного кэшированный вариант вызова сниппета в большинстве случаев возвращает результаты из кэша. Рассмотрим, как это работает. В момент вызова кэшированного сниппета, MODX сначала проверяет, есть ли результат его работы (ответ) в кэше. Если да, то использует его. В противном случае (если ответ сниппета не найден в кэше) запускает код этого сниппета на выполнение. Полученный в результате выполнения сниппета ответ, MODX не только использует для формирования содержимого ресурса (вывода), но также сохраняет его в кэш. После этого код сниппета уже не будет выполняться при формировании страницы, MODX просто будет использовать готовый результат его работы из кэша.
Кэшированный вариант вызова сниппета позволит не только снизить нагрузку на сервер, но также уменьшить время, необходимое для формирования страницы (ресурса), которую необходимо отдать пользователю. Поэтому на сайте где это возможно желательно использовать именно кэшированный способ вызова сниппета.
В каких элементах MODX можно вызвать сниппет с помощью тега
Тег вызова сниппета можно размещать в чанках, шаблонах, TV-параметрах и полях ресурсов MODX Revolution.
Где расположены сниппеты в админке
В админке CMF MODX Revolution все сниппеты расположены в разделе «Сниппеты». Данный раздел находится на левой панели во вкладке «Элементы».

Добавление (установка) новых сниппетов в систему MODX Revolution может осуществляться следующими способами:
- посредством установления пакетов (приложений), содержащих в своём наборе готовые сниппеты. Предназначены они в большинстве случаев для реализации определённого динамического функционала на сайте;
- с помощью создания своих собственных сниппетов.
Параметры сниппета
Сниппеты в MODX Revolution могут иметь параметры. Параметры — это php-переменные, которые можно инициализировать во время вызова сниппета.
Указываются параметры в вызове сниппета после знака воспроса ( ? ).

Передаются параметры сниппету посредством пар &имяПараметра=`значение` . Пара начинается со знака & (амперсанда). Имя параметра отделяется от значения с помощью знака равно ( = ). Кроме этого значение параметра должно быть заключено в обратные одинарные кавычки ( ` ).
Например, выведем 7 последних тикетов (статей) из раздела 2, используя в качестве оформления каждого результата содержимое чанка tpl.Tickets.ticket.latest :
Наборы параметров
Передавать параметры сниппету можно не только посредством пар &имяПараметра=`значение` , но и в виде набора. Набор параметров — это некоторая сущность MODX, которая позволяет передать сниппету коллекцию параметров посредством указания только некоторого имени (имени этого набора).
Управление наборами параметров в MODX Revolution осуществляется на странице «Наборы параметров». Для открытия данной страницы необходимо в верхнем меню админки нажать на значок шестерёнки и выбрать из открывшегося списка пункт «Наборы параметров».

Страница «Наборы параметров» состоит из 2 частей:
1 часть (левая панель) — это имена наборов;
2 часть (правая панель) — это параметры, которые связаны с определённым именем набора. Представлены параметры в этой панели посредством таблицы, состоящей из 2 столбцов: имени параметра и значения.
На этой странице можно не только увидеть имена наборов и связанные с ними параметры, но также создать новые наборы или отредактировать существующие.
Например, создадим новый набор параметров для сниппета TicketLatest :
Откроем страницу «Наборы параметров» (в главном меню админки значок «Шестерёнка»->Наборы параметров).
Нажмём на кнопку «Новый набор параметров». В открывшемся диалоговом окне «Создать набор параметров» введём в поля следующие значения:
- имя — html;
- категория — не указано;
- описание — последние 7 статей по HTML.
Нажмём на кнопку «Сохранить».
Нажмём правой кнопкой мыши на только что созданный набор параметров и в открывшемся контекстном меню выберем пункт «Связать с элементом». В открывшемся диалоговом окне выберем имя класса modSnippet и элемент TicketLatest . Нажмём на кнопку «Сохранить».
После этого выберем в левой панели набор html , который связан с элементом TicketLatest (html->TicketLatest). Параметры и значения по умолчанию, которые имеет этот набор (а точнее связанный с этим набором сниппет TicketLatest ) отобразится в таблице.
Изменим значения необходимых параметров:
- parents — список разделов для поиска результатов (2);
- limit — количество записей для выборки (7);
- action — указывает на то, что необходимо выбрать (tickets);
- tpl — чанк, на основании которого оформляется каждый тикет (tpl.Tickets.ticket.latest).
Нажмём на кнопку «Сохранить набор параметров».
Укажем созданный набор в теге вызова сниппета TicketLatest.
Эта запись автоматически установит сниппету TicketLatest параметры, содержащиеся в наборе html .
Кроме этого параметры набора можно переопределить, если их указать непосредственно в вызове сниппета с помощью пар &ИмяПараметра=`значение` .
Параметр limit в этом примере будет иметь значение 10 вместо 7 (значение 7 имеет данный параметр в наборе html ).
MODx: ресурсы, чанки и какие-то телевизоры
После того как один мой знакомый спросил у меня про то, что за телевизоры используются в шаблонах, я решил отложить все дела на вечер и написать эту статью.
Речь пойдёт о том из чего состоит MODx, как его лучше «готовить», «подавать» и «употреблять».
Рассчитана она в первую очередь на новичков т.к. содержит базовый минимум того, что нужно знать любому modxоводу, ну и конечно на тех кому просто интересно.
Статья ориентирована в основном на Revolution и отражает основные отличия в синтаксисе её от предшественницы, но для обратной совместимости буду вставлять иногда аналогии с Evolution.
Ресурсы (Resources)
Зачастую ресурс представляет собой страницу сайта. Кроме того существуют другие типы ресурсов, такие как, ссылки, сами файлы, и т.д. По умолчанию тип нового ресурса — документ, точнее представление одной страницы вашего сайта.
- Документ — самый распространённый ресурс, по сути веб-страница сайта. В основной массе состоит из заголовка, аннотации, подробного текста, различных дат, мета-тегов и дополнительных полей (TV-параметров);
- Web-ссылка — ссылка на внешний ресурс или веб-страницу;
- Символическая ссылка — внутренняя ссылка на другой ресурс;
- Статический ресурс — файл.
Шаблоны (Templates)
- < html >
- < head >
- < title > [[*pagetitle]] < / title >
- < meta name = «description» content = «[[*description]]» / >
- < / head >
- < body >
- < h1 > [[*longtitle]] < / h1 >
- ID страницы: [[*id]] < br / >
- Анонс: [[*introtext]] < br / >
- Заголовок в меню: [[*menutitle]]
- < hr / >
- [[*content]]
- < / body >
- < / html >
Параметры
Используются для вывода значений полей ресурса.
Вызов осуществляется так:
| Evolution | Revolution |
| [*field*] | [[*field]] |
Полный список полей можно посмотреть в документации здесь.
TV параметры
ТелевизорДополнительное поле или переменная шаблона (TV) — это настраиваемое поле, или, точнее это настраиваемое поле для ресурсов MODx. TV-параметры используются для расширения стандартных полей ресурса. Каждый ресурс в MODx имеет определенное количество полей по умолчанию см. выше в разделе про ресурсы.
Если встаёт задача добавить некоторые дополнительные поля на страницу, например, выпадающий список названий месяцев или дополнительное изображение, или любой другой тип пользовательских данных, это можно сделать добавив TV-параметр соответствующего типа. MODx позволяет иметь практически неограниченное количество TV-параметров.
TV-тег заменяется соответствующим значением заполненным пользователем при обработке ресурса. Так же каждый такой параметр привязан к какому либо шаблону и может использоваться лишь в совокупности с ним.
Вызов осуществляется так:
| Evolution | Revolution |
| [*tv*] | [[*tv]] |
TV параметры можно использовать как чанки добавляя им параметры. Например если есть TV-параметр ‘intromsg’ со значением:
- Привет [[+name]], у тебя [[+messageCount]] непрочитанных.
- [[*intromsg?name=`Гриша` &messageCount=`123`]]
- Привет Гриша, у тебя 123 непрочитанных сообщений.
- [[*bioMessage:limit=`100`]]
Полный список фильтров можно посмотреть тут. Кроме того фильтры можно применять к чанкам и сниппетам.
Комментарии
- [[# В шаблоне допускается оставлять комментарии, этот код который будет удалён из страницы после её рендеринга. ]]
Чанки (Chunks)
Чанк — кусок статического текста который можно встроить в шаблон, в другой чанк, либо вызвать в снипете. Чанк обладает теми же свойствами что и шаблон за исключением того, что не содержит TV-параметров и не может быть назначен ресурсу напрямую.
Чанк не может содержать какой-либо исполняемый код, но в нём можно вызывать сниппеты для вывода динамического контента.
Вызов чанка осуществляется так:
| Evolution | Revolution |
| < |
[[$chunk]] |
В чанк можно передавать параметры. К примеру мы создадим чанк с таким содержанием:
- Привет, [[+name]]. У тебя [[+messageCount]] непрочитанных сообщений.
- [[$intro? &name=`Василий` &messageCount=`12`]]
- Привет, Василий. У тебя 12 непрочитанных сообщений.
- [[!$intro? &name=`[[*usersName]]` &messageCount=`[[*messageCount]]`]]
Сниппеты (Snippets)
Сниппет — PHP код который исполняется во время обработки шаблона MODx. Результат работы его может быть расположен либо на месте его вывода, либо в плейсхолдерах, специальных тегах определяющими куда поместить те или иные результаты.
Вызов сниппета осуществляется так:
| Evolution | Revolution |
| [[snippet]] | [[snippet]] |
Размещение плейсхолдера:
| Evolution | Revolution |
| [+placeholder+] | [[+placeholder]] |
Как и чанки в сниппеты можно передавать параметры, например так:
- [[!Wayfinder? &startId=`0` &level=`1`]]
- [[!Wayfinder@Menu]]
- [[!Wayfinder &startId=`0` &level=`1`]]
- [[!Wayfinder@Menu? &level=`2`]]
Чтобы указать системе не кешировать сниппет требуется добавить восклицательный знак перед именем:
- [ [ ! noCacheSnippet ] ]
Синтаксис тегов
Каждый тег MODx Revolution может содержать в себе другие теги MODx. Для того что бы код был более менее читаем разрешено размещать код тега на нескольких строках придерживаясь такого общего формата (в скобках мои комментарии, которые писать не надо =)):
Терминология MODX Evo ✈ Evolution CMS
MODX достаточно сильно отличается от многих CMS и благодаря этому позволяет быстро создавать отличные сайты. Не смотря на кажующуюся простоту, MODX предлагает разработчикам полную свободу и богатый инструментарий.
Шаблоны, сниппеты, чанки и т.д.
На поверхностном уровне существуют различные варианты ресурсов, которые можно использовать:
Шаблоны — задают общее оформление для разных типов страниц
Сниппеты — расширения, написанные на PHP, которые добавляют разные возможности на сайте
Чанки — небольшие куски (X)HTML-кода, которые можно использовать для повторяющихся частей в шаблонах, а также для работы сниппетов
TV-параметры — позволяют добавить к странице сайта любой кусочек информации. Это может быть баннер, уникальное изображение, время, дополнительная колонка
Плагины — обработчики на PHP, которые могут выполняться при заданных событиях (например при выводе документа)
Модули — расширения системы управления, которые добавляют новые возможности в редактировании сайта.
API
MODX имеет собственный API, который позволяет производить стандартные действия на сайте без особых усилий.
MODX использует собственный синтаксис шаблонов, который полностью соответствует концепции «быть простым и очень гибким». Достаточно взглянуть на некоторые примеры и сравнить с другими CMS.
Вызов сниппета по умолчанию:
Вызов сниппета с определенными параметрами, где один из параметров задается через TV-параметр:
Стоит ли говорить, что в чанках также могут вызываться сниппеты, а сниппетам передаваться чанки в качестве шаблонов? Количество этих вариаций бесконечное множество и разработчики работая на MODX несколько лет продолжают открывать для себя новые возможности.
Написание сниппетов
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
$292 per month—let’s make that $500!
Общее представление¶
Сниппеты — это метод, с помощью которого MODX позволяет вам запускать динамический код PHP на любой из ваших страниц. Они являются основным средством разработки для большинства разработчиков.
Что такое сниппет?¶
Согласно одному определению, «сниппет» — это «короткий повторяющийся сниппет компьютерного исходного кода». Некоторым людям трудно отличить это от «чанка», поэтому полезная мнемоника может выглядеть так: сниппет это как «PHP», например, sni-P(h)P-et.
Как они работают?¶
Большинство сниппетов кэшируются, то есть они хранятся как временная динамическая функция в кэше. Если они помечены как некэшированные, они не анализируются, пока синтаксический анализатор не выполнит все остальное кэшированное содержимое.
Затем, как только они будут кэшированы, сниппеты затем обрабатываются парсером MODX. У них есть доступ к объекту $modx.
Простой пример¶
Вот базовый пример того, как может выглядеть код сниппета:
Если вы назвали этот сниппет «helloWorld», вы можете вызвать его, используя [[helloWorld]] в ваших документах, шаблонах или чанках (см. Синтаксис тегов). Вы также можете вызвать сниппет из другого сниппета, используя метод API runSnippet.
Обратите внимание, что мы возвращали код, а не выводили его содержимое. Никогда не используйте echo в сниппете — всегда возвращайте вывод.
Передача значений в сниппет¶
Значения передаются в ваш сниппет с использованием модифицированной нотации типа веб-формы CGI, которая следует за именем сниппета. Если ваш сниппет был назван «mySnippet», вы можете вызвать его, используя что-то вроде этого:
И код вашего сниппета может выглядеть примерно так:
Обратите внимание, что имена переменных в вызывающем бите должны точно соответствовать именам переменных в сниппете (регистр имеет значение, т.е. ‘input’, а не ‘INPUT’ или ‘Input’. Во-вторых, не забывайте «&» перед потенциальными именами переменных. И, наконец, что не менее важно, обратите внимание, что это обратные кавычки, а не одинарные кавычки!
Чтение значений в ваших сниппетах¶
В общем, вы можете прочитать ваши значения, сославшись на переданные аргументы: &someParameter в вызове преобразуется в $someParameter в коде PHP.
Вы также можете прочитать все параметры, используя встроенный массив $scriptProperties. Это полезно, если ваш сниппет принимает переменные параметры, т.е. он обрабатывает тот же вариант использования, что и PHP-функция func_get_args().
Например, если вы вызываете свой сниппет следующим образом:
Тогда массив $scriptProperties будет содержать следующее:
Взаимодействие с базой данных в сниппетах¶
Доступ к слою базы данных в MODX основан на объектно-реляционной модели (ORM), называемой xPDO для подключения к базе данных, поэтому, чаще всего, вам не придется писать необработанные запросы к базе данных, как вы могли бы делать в других CMS. Обычно вы получаете доступ к данным из базы данных, используя несколько объектов и методов MODX, таких как getObject и getCollection. Это зависит от базовой структуры xPDO.
Почему ОРМ?¶
Вы можете спросить, зачем использовать ОРМ вместо простого SQL? Ну, хотя бы несколько причин ниже:
- Абстракция SQL — это означает, что вы можете писать код, который работает с различными типами баз данных, такими как MySQL, SQLite, PostgreSQL и т. д., когда MODX расширяется до этих баз данных. Все без необходимости переписывать ни единой строки кода. Это делает его идеальным для авторов плагинов, которые хотят, чтобы их код был исполняемым на самых разнообразных системах.
- Экранирование параметров — больше не нужно беспокоиться о внедрении SQL; xPDO использует PDO PHP для экранирования всех передаваемых в вызов SQL переменных для предотвращения любых злонамеренных вызовов.
- Более чистый, короткий код — то, что ранее могло быть сделано в более, чем 40 строках в вызовах функций mysql_ *, теперь можно сделать в 10 строках или менее.
Есть и другие причины, но это для краткости. Давайте посмотрим на несколько примеров:
Пример кода БД¶
Давайте возьмем чанк с названием LineItem и изменим в нем плейсхолдеры (выполненные с помощью синтаксиса [[+placeholderName]]) на некоторые пользовательские значения:
Этот код получит чанк с именем LineItem и вернет его обработанным с установленным плейсхолдером. Переменная $chunk на самом деле представляет собой xPDOObject, который является объектным представлением ресурса.
Как насчет более сложных запросов? Как, скажем, получение первых 10 ресурсов с родителями 23, 24 или 25. И давайте сделаем так, чтобы они не были скрыты от меню или удалены, опубликованы и отсортированы по menuindex. Вот когда мы используем мощный метод $modx->newQuery():
Обратите внимание, как мы сначала создаем объект xPDOQuery ($c), используя $modx->newQuery(). Мы передали имя класса, из которого мы хотели построить запрос — здесь ‘modResource’ или ресурсы — и затем использовали нашу функцию where(), чтобы добавить некоторые ограничения. Затем мы отсортировали и ограничили их.
И, наконец, мы вызвали getCollection, которая — в отличие от getObject — возвращает коллекцию или массив xPDOObjects. Затем мы можем перебирать коллекцию, используя цикл foreach, и делать с элементами коллекции все, что мы хотим.
Дальнейшие подробности о работе с базой данных¶
Чтобы узнать больше о xPDO, прочитайте следующее:
- xPDO в пространстве xPDO
- Получение объектов в xPDO
- Объект xPDOQuery
Рекомендуемые методы и советы¶
Пишите свои сниппеты за пределами менеджера MODX¶
Начиная с 2.2.0, вы можете просто добавить «статический» сниппет: просто сослаться на статический файл.
До 2.2.0 это все еще довольно легко сделать — просто создайте сниппет ‘include’, но сделайте так, чтобы его содержимое было таким:
Вы можете использовать сниппет ‘include’ на странице, например:
И запускайте свои cниппеты извне, пока вы их разрабатываете!
Затем вы можете проверить их, чтобы убедиться, что они работают (например, в командной строке bash вы можете использовать команду php -l my_script.php, чтобы проверить скрипт на наличие синтаксических ошибок). В зависимости от вашей среды вы можете также получить несколько полезных сообщений об ошибках, которые помогут вам в отладке. Скопируйте и вставьте код в MODX, только когда вы уверены, что он работает.
Помните, что любой сниппет в файле на вашем веб-сайте может выполнить любой, у кого есть веб-браузер, поэтому не оставляйте его на живом сайте, если вы не разместили код сниппета вне корневого веб-каталога таким образом, чтобы файл не мог быть доступным через Интернет. В MODX Revolution вы можете поместить файлы сниппетов в основной каталог и переместить весь каталог за пределы корневого веб-каталога. Вы также можете поместить тест в сниппет, который заставляет его завершиться, если сниппет не работает внутри MODX. Однако безопаснее всего просто переместить файл или вставить код в сниппет в менеджере и удалить файл.
Не пытайтесь смешивать коды PHP и HTML в сниппете¶
Сниппеты выполняют PHP-код. Они всегда должны начинаться с <?php **<php> <em data-md-type=»emphasis»>Нельзя смешивать PHP и HTML в сниппете!</em></php> ** Например, следующий код работать не будет:
Вы обнаружите, что MODX будет добавлять теги PHP в начало и конец сниппета, создавая неверный синтаксис, например:
Если вам нужно сделать что-то вроде этого, используйте чанк — выделите PHP в сниппет, загрузите его вывод в плейсхолдер с помощью функций-плейсхолдеров MODX API или обработайте сниппетом, и включите плейсхолдеры сниппета в чанк:
Не работайте с работающими сниппетами¶
Если вы пишете новые версии сниппетов, продублируйте старую версию! Таким образом, вы можете вернуться к старой версии кода, если что-то работает неправильно! MODX по своей сути не управляет версиями, поэтому вы должны сделать резервную копию кода самостоятельно.
Используйте свойства по умолчанию¶
Попробуйте добавить свойства по умолчанию для вашего сниппета на вкладку «Свойства», чтобы другой разработчик мог добавить пользовательские наборы свойств для их переопределения.
Смотрите также¶
- Шаблонизируйте свои сниппеты
- Добавление CSS и JS на ваши страницы с помощью сниппетов
- Как написать хороший сниппет
- Как написать хороший чанк
- modX.runSnippet
- modX.setPlaceholder
- modX.regClientCSS
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.











