Основы движка MODX — чанки, сниппеты и плейсхолдеры

Основы движка MODX — чанки, сниппеты и плейсхолдеры
Комментарии: 7

Рассмотрим базовые элементы движка MODX — чанки, сниппеты и плейсхолдеры. Они являются неотъемлемой частью сайтов на этой CMS, поэтому следует четко понимать их отличие и назначение. Посмотрим следующую схему:

Шаблон является базовым элементом в MODX. Это площадка, на которой размещаются остальные элементы. Любая страница сайта (ресурс) обязана быть привязана к одному из шаблонов.

Чанки

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

Чанки могут быть вложены друг в друга, содержать сниппеты и плейсхолдеры:

Сниппеты в modx revo

Сниппет — это программный код (PHP,SQL,XPDO), в результате выполнения которого возвращается результат (аналог функций в PHP). Чаще всего результатом является html код, но это не обязательно. Например, он может произвести действия с базой данных и при этом ничего не вывести на экран. Вызываться сниппет может в шаблоне, чанке и даже в содержимом ресурса:

[[pdoMenu]]

В примере используется стандартный вариант вызова сниппета с кешированием. В этом режиме при первом обращении к сниппету результат его работы кешируется, а при последующих обращениях — выдается сохраненный результат. Такой способ вызова ускоряет время генерации страницы и может применяться к элементам сайта, которые не требуют моментального обновления. Например, главное меню сайта, которое изменяется редко. Для запрета кеширования перед названием ставится восклицательный знак:

[[!pdoMenu]]

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

Передача параметров сниппету

Создадим сниппет «CountChar», который будет в качестве параметров получать строку и цвет, а на выходе выдавать количество букв в строке и выделять это число указанным цветом.

[[!CountChar? &word=`Hello world` &color=`red`]]

В коде сниппета получаем параметры. При этом, можно задать значение, которое будет присваиваться переменной, если параметр не указывался ('', 'black'). Далее производим вычисления и возвращаем результат.

//получаем параметры
$word = $modx->getOption('word', $scriptProperties, '');
$color = $modx->getOption('color', $scriptProperties, 'black');

//подсчитываем количество символов
$CountChar = strlen($word);

$output = '<span style="color:'.$color.'">'.$CountChar.'</span>';

//возвращаем результат
return $output; 

Передача плейсхолдеров в чанк

Мы реализовали задуманное, но при этом нарушили негласное правило — смешали программный код и теги оформления. Если кому-то потребуется обернуть результат не в тег «span», а в «div», то могут возникнуть проблемы. Конечно, хорошо когда в коде всего десять строк, а если их будет тысяча? Для избежания таких проблем отделим «мух от котлет».

Создадим чанк «tplCountChar», внутрь которого поместим плейсхолдеры:

<span style="color: [[+color]]">[[+CountChar]]</span> символов!

Осталось доработать сам сниппет. Разбирать его подробно не будем, так как он содержит в себе комментарии:

//получаем параметры
$word = $modx->getOption('word', $scriptProperties, '');
$color = $modx->getOption('color', $scriptProperties, 'black');
$chank = $modx->getOption('tpl', $scriptProperties, 'tplCountChar');

//подсчитываем символы
$CountChar = strlen($word);

//устанавливаем плейсхолдеры
$modx->setPlaceholder('CountChar', $CountChar);
$modx->setPlaceholder('color', $color);

//возвращаем чанк с установленными плейсхолдерами
$output = $modx->getChunk($chank);

//возвращаем результат
return $output;

Результат работы: 11 символов!

Запуск сниппета из сниппета

Про тонкости разработки сниппетов в MODX Revolution можно написать целую книгу, поэтому я ограничусь ещё только одной «фишкой» — возможностью запускать из своего сниппета сторонние. При создании сайтов такой функционал будет требоваться крайне редко, поэтому считайте эту информацию лишь небольшим бонусом.

$modx->runSnippet('CountChar', array('word'=>'Hello world','color'=>'yellow'));

Синтаксис вызова отличается от используемого в чанках или шаблонах, но результат будет тот же самый.

Плейсхолдеры в MODX

Из предыдущих примеров Вы, наверно, уже поняли что такое плейсхолдеры. Фактически, плейсхолдер это переменная, которую генерирует сниппет. Вызывается он следующим образом:

[[+color]]

Есть ещё системные плейсхолдеры. Они берутся из системных настроек MODX и доступны для вызова в любом месте сайта:

  • [[++site_name]] возвращает название сайта
  • [[++site_url]] возвращает доменное имя сайта
  • [[++modx_charset]] возвращает установленную кодировку

Таких переменных насчитывается несколько десятков, но большинство из них не требуется при разработке сайта.

Темы:
MODX
Ещё интересное — 6
Комментарии —
  1. batpyiiikob
    batpyiiikob16 февраля 2015, 23:12#
    Отличная статья. Спасибо!
    1. Юрий
      Юрий29 июля 2016, 03:55#
      Подскажите, пожалуйста, как вывести на странице объем потребляемой памяти для загрузки страницы, как у вас в нижней части сайта? Как вывести время на генерацию страницы удалось найти довольно быстро ) А вот с выводом потребляемой памяти возник затык ))
      1. Andy Si29 июля 2016, 10:36(был изменён)#
        Написать свой сниппет и вызывать его некешируемым:
        $memory = memory_get_usage(true);
        $memory = round(($memory / 1024) / 1024, 1);
        return $memory;
        1. Юрий
          Юрий29 июля 2016, 13:38#
          Спасибо )
      2. xaker777
        xaker77722 ноября 2017, 22:00#
        Отличная статья. Спасибо
        1. Олег
          Олег23 февраля 2022, 19:17#
          Спасибо.
          1. Andy Si24 февраля 2022, 09:16#
            Рад что инфа ещё полезна
          © REALADMIN.RU   2024 г.
          Страница сгенерирована: 0,2040 s | 6 mb.
          На каком уровне Вы играете в шахматы?
          OPROS