Синтаксис тегов в MODX Revolution

Для упрощения логики парсинга, ускорения и избежания путаницы, все таги в MODX Revolution сделаны в едином формате, отличаются лишь токеном или набором токенов перед строкой, которая идентифицирует Элемент контента или Контент тег для его обработки; например [[tokenIdenticator]].

Формат тегов в MODX Revolution

Элементы контента Evolution (Старый)   Revolution (Новый) Примеры для Revolution
Шаблоны нет представления тегом   нет представления тегом  
Поля ресурса [*field*]   [[*field]] [[*pagetitle]]
Переменные шаблона [*templatevar*]   [[*templatevar]] [[*tags]]
Чанки {{chunk }}   [[$chunk]] [[$header]]
Сниппеты [[snippet]]   [[snippet]] [[getResources]]
Плагины нет представления тегом   нет представления тегом  
Модули нет представления тегом   не существует в Revolution, используйте ПСМ  
Контент теги        
Заполнители [+placeholder+]   [[+placeholder]] [[+modx.user.id]]
Ссылки [~link~]   [[~link]] [[~[[*id]]? &scheme=`full`]]
Системные настройки [(system_setting)]   [[++system_setting]] [[++site_start]]
Языки нет представления тегом   [[%language_string_key]]  
Комментарий (см. ниже))     [[-это комментарий]]  

Принятие нового формата в Revolution позволило новому парсеру быть полностью рекурсивным, использующем механизм, который не зависит от регулярных выражений.

Ранее какждый таг парсился независимо в особом порядке, один уровень за раз, встроенные теги ожидали своего прохода. Теперь теги парсятся так как они идут по очереди не зависимо от типа элемента, что они представляют и встроенные теги парсятся перед внешними для возможности создания более сложных конструкций из тего. Вместе с возможностью использования предварительно зарезервированного ? & и = символов в теговых строках, MODX контент теги являют мощный набор возможностей для управления контентом.

Теги комментарии

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

Так начиная с версии MODX Revolution 2.2, любой тег, что начинается с тире (-) игнорируется парсером и любые теги, которые он включает будут игнорироваться. До этой версии можно было использовать аналогичный приём, но теги в них парсились и оказывали влияние на производительность.

[[- этот комментарий может быть удалён]]

Структура Тега

Тег содержит много частей:

[[ (отрывающие теги)
! (опционально - некешируеммый флаг)
elementToken (опционально - токен идентифицирующий тип элемента, если он не сниппет, $=чанк, *=поле ресурса/ТВ, +=заполнитель/плейсхолдер и др.)
elementName
@propertyset (опционально - идентификатор Набора параметров)
:filterName=`modifier`:... (опционально - один или несколько фильтров вывода)
? (опционально; показывает начало строки параметров)
&propertyName=`propertyValue` &... (опционально; любые дополнительные параметры разделённые &)
]] (закрывающие теги)

Теги можно располагать на одной линии или в несколько. Любой вариант является приемлемым:

[[!getResources? &parents=`123` &limit=`5`]]
 
[[!getResources?
  &parents=`123`
  &limit=`5`
]]

Параметры

Все теги - а не только сниппеты, в MODX принимают параметры и могут их использовать. Например, давайте возьмём чанк 'Hello' с содержимым:

Привет [[+name]]!

Теперь можно передать параметр этому чанку:

[[$Hello?name=`Виктор`]]

Это выведет

Привет Виктор!

Синтакс для параметров такой же как и в Эволюшн.

Кеширование

В Evolution сниппеты, которые должны были быть обработаны с каждым запросом должны быть на некешированной странице или Сниппет сам по себе должен был вызываться некешированно: [!snippet!]

В Revolution любой тег может быть вызван некешированно сразу же после двойных скобок: [[!snippet]], [[!$chunk]], [[!+placeholder]], [[!*template_var]], и др

Если у вас продвинутая установка, в которой настройка site_url - устанавливается по запросу, но ваши ссылки [[~[[*id]]]] не генерируются правильно, помните, что любой тег может вызываться некешированно включая ссылку или анкор-тег:
[[!~[[*id]]]]

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

Порядок парсинга

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

Если у вас ещё ниже есть закешированные заполнители, то они будут определены перед выполнением Сниппета - это значит, что они получат последнее значение хранимое в кеше этого Сниппета ранее (или пустое, если ещё не было установлено).

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

[[!Profile]]
Привет [[!+username]]

Оригинал статьи Tag Syntax