MODX - Сниппеты

В этой статье рассмотрим, что такое сниппет и зачем он нужен в MODX Revolution. Познакомимся с тем, как осуществляется вызов сниппета, чем отличается кэшированный вызов сниппета от не кэшированного, а также как осуществляется настройка, т.е. передача параметров или набора параметров, сниппету.

Назначение и способы вызова сниппета

Сниппет - это фрагмент php-кода, который в результате своего выполнения возвращает некоторый ответ. Для того чтобы сниппет приступил к выполнению своего кода, его необходимо вызвать. Вызов сниппета в MODX Revolution осуществляется с помощью следующего тега:

<!-- Вызов сниппета "ИмяСниппета" с кэшированием результатов его работы -->
[[ИмяСниппета]]
<!-- Вызов сниппета "ИмяСниппета" без кэширования результатов его работы -->
[[!ИмяСниппета]]

Отличается один способ вызова сниппета от другого только кэшированием.

Не кэшированный вариант вызова сниппета всегда возвращает текущие, полученные в результате выполнения кода, результаты. Применяется такой вариант вызова сниппета в тех случаях, когда он может вернуть при следующем запуске или в зависимости от некоторых других условий оличный (иной) результат. Не кэшированные вызовы сниппетов обычно используют для реализации системы авторизации на сайте, вывода блока комментариев и др.

В отличии от не кэшированного кэшированный вариант вызова сниппета в большинстве случаев возвращает результаты из кэша. Рассмотрим, как это работает. В момент вызова кэшированного сниппета, MODX сначала проверяет, есть ли результат его работы (ответ) в кэше. Если да, то использует его. В противном случае (если ответ сниппета не найден в кэше) запускает код этого сниппета на выполнение. Полученный в результате выполнения сниппета ответ, MODX не только использует для формирования содержимого ресурса (вывода), но также сохраняет его в кэш. После этого код сниппета уже не будет выполняться при формировании страницы, MODX просто будет использовать готовый результат его работы из кэша.

Кэшированный вариант вызова сниппета позволит не только снизить нагрузку на сервер, но также уменьшить время, необходимое для формирования страницы (ресурса), которую необходимо отдать пользователю. Поэтому на сайте где это возможно желательно использовать именно кэшированный способ вызова сниппета.

В каких элементах MODX можно вызвать сниппет с помощью тега?

Тег вызова сниппета можно размещать в чанках, шаблонах, TV-параметрах и полях ресурсов MODX Revolution.

Где расположены сниппеты в админке?

В админке CMF MODX Revolution все сниппеты расположены в разделе "Сниппеты". Данный раздел находится на левой панели во вкладке "Элементы".

MODX - Сниппеты в админке

Добавление (установка) новых сниппетов в систему MODX Revolution может осуществляться следующими способами:

  • посредством установления пакетов (приложений), содержащих в своём наборе готовые сниппеты. Предназначены они в большинстве случаев для реализации определённого динамического функционала на сайте;
  • с помощью создания своих собственных сниппетов.

Параметры сниппета

Сниппеты в MODX Revolution могут иметь параметры. Параметры - это php-переменные, которые можно инициализировать во время вызова сниппета.

Указываются параметры в вызове сниппета после знака воспроса (?).

MODX - Параметры, переданные в вызов сниппета

<!-- Вызов сниппета "ИмяСниппета" без кэширования результатов с 2 параметрами.
     1 параметр имеет имя param1 и значение value1,
     2 параметр имеет имя param2 и значение value2 -->  
[[!ИмяСниппета? &param1=`value1` &param2=`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 осуществляется на странице "Наборы параметров". Для открытия данной страницы необходимо в верхнем меню админки нажать на значок шестерёнки и выбрать из открывшегося списка пункт "Наборы параметров".

MODX - Наборы параметров (Property Sets)
MODX - Наборы параметров

Страница "Наборы параметров" состоит из 2 частей:

  • 1 часть (левая панель) - это имена наборов;

  • 2 часть (правая панель) - это параметры, которые связаны с определённым именем набора. Представлены параметры в этой панели посредством таблицы, состоящей из 2 столбцов: имени параметра и значения.

На этой странице можно не только увидеть имена наборов и связанные с ними параметры, но также создать новые наборы или отредактировать существующие.

Например, создадим новый набор параметров для сниппета TicketLatest:

  1. Откроем страницу "Наборы параметров" (в главном меню админки значок "Шестерёнка"->Наборы параметров).

  2. Нажмём на кнопку "Новый набор параметров". В открывшемся диалоговом окне "Создать набор параметров" введём в поля следующие значения:

    • имя - html;
    • категория - не указано;
    • описание - последние 7 статей по HTML.
    MODX - Создать набор параметров
    MODX - Создать набор параметров
  3. Нажмём на кнопку "Сохранить".

  4. Нажмём правой кнопкой мыши на только что созданный набор параметров и в открывшемся контекстном меню выберем пункт "Связать с элементом". В открывшемся диалоговом окне выберем имя класса modSnippet и элемент TicketLatest. Нажмём на кнопку "Сохранить".

    MODX - Связывание набора параметров html с элементом TicketLatest

  5. После этого выберем в левой панели набор html, который связан с элементом TicketLatest (html->TicketLatest). Параметры и значения по умолчанию, которые имеет этот набор (а точнее связанный с этим набором сниппет TicketLatest) отобразится в таблице.

    MODX - Набор параметров html

  6. Изменим значения необходимых параметров:

    • parents - список разделов для поиска результатов (2);
    • limit - количество записей для выборки (7);
    • action - указывает на то, что необходимо выбрать (tickets);
    • tpl - чанк, на основании которого оформляется каждый тикет (tpl.Tickets.ticket.latest).

    Нажмём на кнопку "Сохранить набор параметров".

  7. Укажем созданный набор в теге вызова сниппета TicketLatest.

    [[!TicketLatest@html]]

    Эта запись автоматически установит сниппету TicketLatest параметры, содержащиеся в наборе html.

    Кроме этого параметры набора можно переопределить, если их указать непосредственно в вызове сниппета с помощью пар &ИмяПараметра=`значение`.

    [[!TicketLatest@html? &limit=`10`]]

    Параметр limit в этом примере будет иметь значение 10 вместо 7 (значение 7 имеет данный параметр в наборе html).



   MODX Revo 0    1412 +1

Комментарии (7)

  1. Юрий # 0
    Александр, подскажите, пожалуйста, можно ли как-то использовать сниппеты с параметрами для вывода повторяющихся кусков кода, у которых отличается только какой-то элемент? Или можно решить задачу каким-то другим способом?
    Сейчас поясню на примере, что я имею в виду. Например, на страницах сайта планируется вставлять видео из Ютуба. Соответственно, на нем же можно брать код для встраивания видео. У всех встраиваемых видео будет отличаться только ID видео. Поэтому хотелось бы задать для вывода видео чанк, и как-то в виде параметра при выводе указывать ID видео, чтобы делать вставку видео в ресурс одной простой понятной строкой. Соответственно, ID видео придется указывать каждый раз вручную.
    Просто из вашей статьи я сделал вывод, что сниппет можно вызывать уже с четко прописанными параметрами. А как быть, когда параметры нужно каждый раз указывать вручную индивидуально?
    Если вы знаете какое-то решение подобной задачи, поделитесь, пожалуйста!
    1. Stas # 0
      вам больше подойдут чанки и их параметры
      1. Александр # 0
        Добрый день. а как проверить снипет на предмет пустоты?
        1. Александр Мальцев # 0
          Здравствуйте, лучше реализовать всю логику внутри сниппета.
          Попробуйте использовать фильтры вывода.
        2. Василий # 0
          Добрый день, Александр.
          Перестали работать все сниппеты: pdoTools, Tickets, даже визуальный редактор. Теги сниппета выводят пустоту. Никак не найду причину. Может в системных настройках чтото такое есть?
          1. Василий # 0
            Решил очисткой core/cache вручную.
            Почему-то из панели управления не чистится. Что-то с правами доступа?
            1. Александр Мальцев # 0
              Если что-то настраивали, то возможно… Посмотрите может что-то есть в журнале ошибок.
              Если есть резервная копия, то попробуйте откатить на неё. Или же поверх «накатите» такую же сборку MODX и переустановите компоненты.

            Вы должны авторизоваться, чтобы оставлять комментарии.