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

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

<!-- Вызов сниппета "ИмяСниппета" без кэширования результатов с 2 параметрами. 1 параметр имеет имя param1 и значение value1, 2 параметр имеет имя param2 и значение value2 --> [[!ИмяСниппета? ¶m1=`value1` ¶m2=`value2`]]
Передаются параметры сниппету посредством пар &имяПараметра=`значение`
. Пара начинается со знака &
(амперсанда). Имя параметра отделяется от значения с помощью знака равно (=
). Кроме этого значение параметра должно быть заключено в обратные одинарные кавычки (`
).
Например, выведем 7 последних тикетов (статей) из раздела 2, используя в качестве оформления каждого результата содержимое чанка tpl.Tickets.ticket.latest
:
[[!TicketLatest? &parent=`2` &limit=`7` &action=`tickets` &tpl=`tpl.Tickets.ticket.latest` ]] <!-- Имя сниппета: TicketLatest Параметры сниппета: parent - список разделов для поиска результатов (2); limit - количество записей для выборки (7); action - указывает на то, что необходимо выбрать (tickets); tpl - чанк, на основании которого оформляется каждый тикет (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]]
Эта запись автоматически установит сниппету
TicketLatest
параметры, содержащиеся в набореhtml
.Кроме этого параметры набора можно переопределить, если их указать непосредственно в вызове сниппета с помощью пар
&ИмяПараметра=`значение`
.[[!TicketLatest@html? &limit=`10`]]
Параметр limit в этом примере будет иметь значение 10 вместо 7 (значение 7 имеет данный параметр в наборе
html
).
Я перевоу весь свой сайт на феном, т.к. в итоговом выводе иногда на страничке формируется сетка более чем из 1000ссылок, я прочитал гдето на modxpro что fenom быстрее формирует и выводит большой объем ссылок
раньше был чанк и вывод такой:
Сейчас нужно выводить tpl через сниппет из-за totalvar, вывожу так:
Но в выводе красуются пустые блоки вывода, т.e. {$id | url} и {$pagetitle} в параметре placeter не формируются {$pagetitle}, подскажите пожалуйста как правильно вывести и куда мне копать, хочу научиться делать сниппеты хотябы вот такие, базовые
Но как то странно себя ведёт. НЕ подтягивает почту. А при обновление страницы с пустой формой отправляет пустой лид. Может что то не так прикрутил )?
Создал сниппет Bitrix24.
Вместо кода:
[[!FormIt?
&hooks=`spam,email,redirect`
&emailTpl=`tpl.email.partners`
&emailTo=`nikola19900210@yandex.ru`
&emailSubject=`Заявка на партнерство`
&validate=`name:required,mail:required,phone:required`
&clearFieldsOnSuccess=`1`
&redirectTo=`40`
&submitVar=`submitPartner`
]]
Поставил [[!Bitrix24?]]
Далее не менял код.
Пока не понял почему не подтягивается. И толком подсказать не смогли
2. В своем хуке получить все поля и вывести их в консоль ошибок MODX можно так:
Ошибки за один день. Для меня тёмный лес. Буду разбираться ).
Не могу понять, почему не кэшированный вывод сниппета не срабатывает в конструкции is then?
Сравниваю дату на странице ресурса, если вызываю его кэшированным, то конструкция срабатывает:
а если не кэшированным:
то не срабатывает. всегда выводит «дата не равна».
сниппет today выглядит так:
Перепишите код сниппета today на следующий:
После этого на странице ресурса используйте его так:
Как вариант, можно вообще всё в сниппете today прописать:
На странице его использовать так:
Подскажите пожалуйста, использую простой php код для загрузки файлов по ссылке:
если его использовать в обычном файле php, то он срабатывает и файл загружается, а если использовать в сниппете modx, то загрузки на хостинг не происходит, почему так? Папка создана, сниппет на странице выведен.
…
хм, решил проблему дописав
Спасибо.
В сниппете я формирую ссылку так
При нажатии на ссылку мне надо поймать month и year на странице с id=544 и как то там их использовать в вызове pdoResources. Или уже передать туда готовую json строку и вставить в условие &where. Как мне обратиться к тем параметрам что передаются на страницу?
Если вызвать pdoResources без параметра &tpl то видно что туда приходит
в таком случае можно ведь передать уже готовое условие, а потом сразу подставить в &where ?? Как прописать строку &where если условие передать на страницу в переменной str, так что ли?
На страницу где происходит выборка документов за период методом GET передаются 2 параметра date_s и date_e, соответственно начало и конец периода в Unix Timestamp формате.
Пример адреса
Условие в секции &where для выборки документов за период
Все.
Почему-то из панели управления не чистится. Что-то с правами доступа?
Если есть резервная копия, то попробуйте откатить на неё. Или же поверх «накатите» такую же сборку MODX и переустановите компоненты.
Перестали работать все сниппеты: pdoTools, Tickets, даже визуальный редактор. Теги сниппета выводят пустоту. Никак не найду причину. Может в системных настройках чтото такое есть?
Попробуйте использовать фильтры вывода.
Сейчас поясню на примере, что я имею в виду. Например, на страницах сайта планируется вставлять видео из Ютуба. Соответственно, на нем же можно брать код для встраивания видео. У всех встраиваемых видео будет отличаться только ID видео. Поэтому хотелось бы задать для вывода видео чанк, и как-то в виде параметра при выводе указывать ID видео, чтобы делать вставку видео в ресурс одной простой понятной строкой. Соответственно, ID видео придется указывать каждый раз вручную.
Просто из вашей статьи я сделал вывод, что сниппет можно вызывать уже с четко прописанными параметрами. А как быть, когда параметры нужно каждый раз указывать вручную индивидуально?
Если вы знаете какое-то решение подобной задачи, поделитесь, пожалуйста!