- Как выглядит тег MODX
- Основные теги MODX
- Поле ресурса, TV и плейсхолдер
- Настройки и ссылки
- Вложенные теги
- Параметры вызова
- Как параметр используется внутри чанка
- Модификаторы: обработка результата
- Кешируемые и некешируемые вызовы
- Плейсхолдер от некешируемого сниппета
- Комментарии
- Проверяем теги на учебном ресурсе
- Если тег не дает ожидаемого результата
- Fenom: другой способ записи
- Следующий урок
В уроке ресурсов и их полей мы создали учебные страницы и познакомились с их данными. Теперь разберем, как обращаться к этим данным в коде.
Теги MODX — специальные конструкции, которые при обработке страницы заменяются значениями полей, настроек, содержимым элементов или результатом выполнения кода.
Упражнения выполняем стандартным синтаксисом. Варианты Fenom в конце приведены для сравнения: устанавливать и включать его ради этого урока не нужно.
Как выглядит тег MODX
Обычный тег начинается с двух открывающих квадратных скобок и заканчивается двумя закрывающими:
[[*pagetitle]]
Звездочка обозначает поле текущего ресурса или TV, а pagetitle — имя поля основного заголовка.
Например, в HTML можно написать:
<h1>[[*pagetitle:htmlent]]</h1>
В результате получится заголовок открытой страницы. htmlent обрабатывает значение для вывода как текста, к модификаторам вернемся ниже.
Сами теги посетитель обычно не видит: браузер получает уже сформированный HTML.
Основные теги MODX
Тип вызова определяется символом после открывающих скобок.
| Что выводим | Пример | Источник значения |
|---|---|---|
| Поле ресурса | [[*pagetitle]] |
Основной заголовок открытой страницы. |
| Содержимое ресурса | [[*content]] |
Поле содержимого открытой страницы. |
| Дополнительное поле TV | [[*tags]] |
TV с техническим именем tags. |
| Чанк | [[$header]] |
Разметка или текст чанка header. |
| Сниппет | [[snippetName]] |
Результат выполнения сниппета snippetName. |
| Плейсхолдер | [[+result]] |
Значение, подготовленное для плейсхолдера result. |
| Ссылка на ресурс | [[~15]] |
Адрес ресурса с ID 15. |
| Настройка | [[++site_name]] |
Название сайта из настроек. |
| Запись лексикона | [[%lexicon_key]] |
Перевод по ключу доступного словаря. |
| Комментарий | [[- Комментарий ]] |
Удаляется из вывода страницы. |
header, snippetName, result и tags — примеры имен. Соответствующие элементы должны существовать, а плейсхолдер — получить значение. ID 15 заменяется идентификатором нужной страницы.
Шаблон назначается ресурсу через админку, а плагин выполняется на системных событиях. Для этих действий не нужен отдельный вызов по аналогии с чанком.
Поле ресурса, TV и плейсхолдер
Стандартные поля и дополнительные TV вызываются через звездочку:
[[*description]]
[[*tags]]
description уже предусмотрен системой. tags в этом примере — дополнительное поле, которое нужно создать и назначить используемому шаблону. Подробно это разберем в уроке TV.
Плюс обращается к плейсхолдеру:
[[+pagetitle]]
Он не равен полю текущей страницы. Например, в списке статей сниппет может передавать в чанк заголовок каждой записи через плейсхолдер pagetitle, а поле со звездочкой будет относиться к открытой странице списка.
Плейсхолдер сам не получает данные: их передает чанк-параметр, сниппет, компонент или другой код.
Настройки и ссылки
Для настроек используются два плюса:
[[++site_name]]
[[++site_url]]
[[++site_start]]
- site_name — название сайта.
- site_url — базовый адрес.
- site_start — ID главной страницы, а не готовая ссылка.
Ссылку на ресурс формирует тег с тильдой:
<a href="[[~15]]">О компании</a>
Для полного адреса с протоколом и доменом можно передать параметр scheme:
[[~15? &scheme=`full`]]
Вместо 15 укажите ID своего ресурса. Такой вызов формирует адрес по данным и настройкам MODX, а не хранит вручную записанный alias страницы.
Вложенные теги
Внутренний тег может передать значение внешнему. Например, полный URL текущей страницы:
[[~[[*id]]? &scheme=`full`]]
Сначала определяется ID, затем формируется ссылка.
Ссылка на главную из настройки site_start:
<a href="[[~[[++site_start]]]]">Главная</a>
Так не нужно предполагать, что главная всегда имеет ID 1.
Параметры вызова
Параметры записываются после вопросительного знака. Каждый начинается с амперсанда, а значение заключается в обратные кавычки.
[[snippetName?
¶meter=`value`
&anotherParameter=`anotherValue`
]]
Это схема записи, а не готовое задание: snippetName и параметры нужно заменить существующим элементом и его настройками.
Тот же вызов в одну строку:
[[snippetName? ¶meter=`value` &anotherParameter=`anotherValue`]]
Переносы строк нужны для читаемости. Обратные кавычки не заменяем обычными одинарными или типографскими.
Как параметр используется внутри чанка
Предположим, есть чанк zdravstvujte с таким текстом:
Здравствуйте, [[+name:htmlent]]!
Вызов передает ему значение name:
[[$zdravstvujte? &name=`Василий`]]
Результат:
Здравствуйте, Василий!
Сейчас пример нужен для чтения записи: параметр name подставляется в одноименный плейсхолдер. Создание чанков и другие варианты передачи данных разберем в отдельном уроке.
Модификаторы: обработка результата
Модификатор указывается через двоеточие. Он меняет результат вывода, а не сохраненное значение поля.
[[*pagetitle:htmlent]]
htmlent преобразует специальные символы в HTML-сущности. Это подходит для заголовка, который должен отображаться как текст.
Для content, содержащего нужную HTML-разметку, такое экранирование всего поля покажет теги вместо оформленных абзацев.
Модификаторы могут иметь значение и объединяться в цепочку:
[[*longtitle:default=`[[*pagetitle]]`:htmlent]]
При пустом longtitle выбирается pagetitle, затем результат обрабатывается htmlent. Цепочка выполняется слева направо.
У сниппета модификатор располагается перед вопросительным знаком:
[[snippetName:default=`Результат не получен`?
¶meter=`value`
]]
Подробные условия и способы обработки значений находятся в статье о модификаторах MODX.
Полная схема тега с необязательными частями
[[!snippetName@propertySet:modifier=`value`?
¶meter=`value`
]]
- ! — некешируемый вызов.
- snippetName — имя элемента.
- @propertySet — заранее созданный набор свойств.
- :modifier — обработка результата.
- ? — начало параметров.
- ¶meter — имя параметра.
Необязательные части можно пропустить. Для первого вывода поля достаточно короткого тега без набора свойств и параметров.
Кешируемые и некешируемые вызовы
Вызов без восклицательного знака считается кешируемым:
[[snippetName]]
Восклицательный знак сразу после открывающих скобок делает его некешируемым:
[[!snippetName]]
При включенном кешировании ресурса результат кешируемого вызова может попасть в кеш страницы. Некешируемый тег обрабатывается на соответствующем этапе генерации ответа MODX.
Так можно вызывать и другие теги:
[[!$chunkName]]
[[!+placeholderName]]
[[!*tvName]]
Не добавляйте ! везде на всякий случай. Постоянный заголовок обычно не требует некешируемого вызова, а данные пользователя или обработка формы требуют отдельного выбора режима.
Не сохраняйте персональные данные в общем кеше страницы. Сам знак ! не отключает кеш компонента, сервера или браузера.
Плейсхолдер от некешируемого сниппета
Если некешируемый сниппет устанавливает динамический плейсхолдер, его вывод также вызывайте некешируемым:
[[!snippetName]]
[[!+result]]
Здесь предполагается, что snippetName устанавливает result. Самих этих имен в чистой установке может не быть.
Кешируемый плейсхолдер может обработаться раньше некешируемого сниппета и получить пустое или ранее сохраненное значение. Поэтому одного расположения вызова сниппета выше по тексту недостаточно.
Комментарии
Комментарий MODX начинается с дефиса и удаляется из вывода:
[[- Пояснение к этому участку кода. ]]
HTML-комментарий остается в исходном коде ответа:
<!-- Пояснение, которое можно увидеть в исходном HTML. -->
Для комментариев используйте специальную конструкцию, а не вызов несуществующего элемента. Пароли и ключи не храните ни в одном из вариантов: исходный код доступен тем, кто его редактирует.
Проверяем теги на учебном ресурсе
Откройте «Первый материал» или другой документ, созданный в предыдущем уроке. Сохраните копию его содержимого.
В режиме исходного HTML временно добавьте в content:
<p>Страница: [[*pagetitle:htmlent]]</p>
<p>ID ресурса: [[*id]]</p>
<p>Сайт: [[++site_name:htmlent]]</p>
<a href="[[~[[++site_start]]]]">На главную</a>
- Сохраните ресурс и откройте его на сайте.
- Сравните выведенные заголовок и ID с данными документа.
- Проверьте название сайта и ссылку на главную.
- Измените заголовок ресурса, сохраните и снова проверьте результат.
- После упражнения удалите временный блок или восстановите сохраненное содержимое.
Для этого не нужно переносить дизайн или менять код назначенного шаблона. Важно, чтобы он выводил содержимое ресурса.
В само поле content не добавляйте вызов этого же поля [[*content]]. Его место — в шаблоне, который выводит содержимое страницы.
Если тег не дает ожидаемого результата
| Проблема | Что проверить |
|---|---|
| Выводится пустое значение | Имя поля, заполнение данных, наличие элемента или источник плейсхолдера. |
| Выводятся не те данные | Символ перед именем: поле со звездочкой и плейсхолдер с плюсом — разные источники. |
| Параметр не применяется | Его имя, вопросительный знак, амперсанд и обратные кавычки. |
| Динамический плейсхолдер пуст | Код, который его устанавливает, и режим обработки обоих вызовов. |
| Виден сам тег | Парные скобки, отсутствие HTML-сущностей вместо них и открытие страницы через MODX. |
| Изменения не видны | Сохранение нужного ресурса, назначенный шаблон и кеш. |
Ace помогает читать код, но подсветка не подтверждает существование элемента или правильность его параметров. Ошибки выполнения проверяют по журналу MODX и документации компонента.
Диагностические теги
| Тег | Показатель |
|---|---|
[^qt^] |
Время запросов к базе данных. |
[^q^] |
Количество запросов. |
[^p^] |
Время обработки страницы. |
[^t^] |
Общее время генерации. |
[^s^] |
Источник страницы: генерация или кеш. |
Это серверные показатели. Они не равны полному времени загрузки изображений, выполнения JavaScript и отображения страницы в браузере.
Fenom: другой способ записи
В pdoTools есть шаблонизатор Fenom. В следующих материалах буду показывать его рядом со стандартными тегами, чтобы вы постепенно замечали соответствия.
| Задача | Стандартный синтаксис | Fenom |
|---|---|---|
| Заголовок как текст | [[*pagetitle:htmlent]] |
{$_modx->resource.pagetitle | escape} |
| Название сайта как текст | [[++site_name:htmlent]] |
{$_modx->config.site_name | escape} |
| Подключение чанка | [[$header]] |
{include 'header'} |
| Переменная чанка | [[+name]] |
{$name} |
| Глобальный плейсхолдер | [[+result]] |
{$_modx->getPlaceholder('result')} |
Обратите внимание: переменная, переданная в чанк, и глобальный плейсхолдер MODX в Fenom получаются по-разному. Это не простая замена квадратных скобок фигурными.
Лично я использую Fenom для логики шаблонов: условия и циклы в нем мне удобнее длинных цепочек вложенных тегов. При этом чанки остаются полезными для повторяемой разметки.
Сейчас выполняем задания стандартным синтаксисом. Настройку и возможности второго варианта разберем в уроке Fenom, а рабочий сайт в практической части будем собирать уже на нем.
Следующий урок
Переходим к шаблонам MODX: создадим небольшую HTML-заготовку, назначим ее ресурсам и проверим, как одинаковое оформление выводит разные данные страниц.
Полная справочная запись тегов находится в официальной документации MODX.











