MODX. Структура админки: ресурсы, шаблоны, tv, чанки, сниппеты, плагины, категории. Быстрый старт

Несмотря на свою функциональность, MODX Revolution достаточно проста в использовании. Для того чтобы создать сайт на этой cms / cmf совершенно нет необходимости в наличии колосального опыта программирования, при этом она практически не накладывает никаких ограничений на опытных разработчиков. 

Как же познакомиться с MODX новичку? Очень просто, в особенности если вы уже знакомы с навыками верстки и базовыми основами программирования. Давайте разберем основные элементы MODX участвующие в создании сайта.

Ресурсы

Ресурсы представляют из себя страницы сайта.

  • Заголовок (pagetitle) — это поле обязательно должно быть заполнено, в нем указывается название страницы.
  • Псевдоним (alias) — указывается адрес по которому страница будет доступна, а в поле.
  • Шаблон (Template) — указывается шаблон который будет отображаться на странице. 

Этих знаний о ресурсах достаточно для начала знакомства с MODX Revolution.

Шаблоны

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

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

Теги MODX
Fenom
<!DOCTYPE html>
<html>
<head>
       [[$head]]
<body>
       [[$header]]
            
       [[*id:ne=`1`:then=`[[$aside]]`]]

       [[$content]]  

       [[$footer]]

       [[$scripts]]    
</body>
</html>
<!DOCTYPE html>
<html>
<head>
       {include 'head'}
</head>
<body>
       {include 'header'}
            
       {if $_modx->resource.id != 1}
           {include 'aside'}
       {/if}               
                
       {include 'content'}         
           
       {include 'footer'}

       {include 'scripts'}
</body>
</html>

В данном коде происходит подключение чанков, содержащих в себе код блоков: head, header, aside, content, footer, scripts. При этом блок aside подключается только в случае если id ресурса не равен 1. Такой ID обычно имеет главная страница. ID ресурса можно узнать посмотрев в дерево ресурсов, он пишется справа от названия, в скобках.

Чанки

Чанки предназначены для хранения блоков html кода, для того, чтобы не дублировать один и тот же код в разных местах. Допустим, как в примере с шаблонами, не дублировать код блока header в разных шаблонах. Также в чанках хранят шаблоны повторяющихся элементов, вроде товаров, новостей и т.п.

Для подключения чанка в шаблоне используется конструкция со знаком $: [[$имя_чанка]]

В чанках нельзя использовать php, а шаблонизатор fenom можно использовать только после изменения настроек в системе сайта. Если вы новичок в сайтостроении, не забивайте себе голову вопросом о том что такое fenom, просто используйте теги MODX Revo.

В чанки как и в сниппеты можно передавать параметры:

[[$content? 
       &class=`red`
       &color=`Красный`
]]

В этом случае они будут доступны в чанке как и обычные плейсхолдеры:

<div class="[[+class]]">
  Цвет этого блока:[[+color]]
</div>

Также, с помощью чанков можно выводить данные из статичных файлов, .html, .css и т.п. Для этого надо создать чанк, поставить галочку «Статичный», и указать путь до нужного файла. После чего разместить чанк в нужном месте шаблона.

О чанках в документации

Сниппеты

Сниппеты — специальные элементы, с помощью которых можно воспроизводить php код. Они позволяют сделать сайт более динамичным. Большинство дополнений или компонентов (все называют по своему, я их называю компонентами, т.к. с подобным обозначением проще ориентироваться тем кто работал с Bitrix) представляют из себя набор сниппетов.

Для подключения сниппета в шаблоне используется конструкция: [[имя_сниппета]]

При подключении сниппета, можно передавать параметры, тогда он будет выглядеть так:

[[SnippetName? &param=`1` &param2=`text` &param3=`3`]]

При указании параметров используется «Гравис» — «`» символ который на клавиатуре находится на клавише с буквой «Ё».

Переданные в сниппет данные формируют из себя массив $scriptProperties, который можно использовать в теле сниппета. Пример получившегося массива:

$scriptProperties = array(
     'param' => '1',
     'param2' => 'text',
     'param3' => '3',
);

Для вывода параметров из массива $scriptProperties в MODX лучше использовать метод getOptions().

Дополнительная информация

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

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

  • (int), (integer) — cast to integer
  • (bool), (boolean) — cast to boolean
  • (float), (double), (real) — cast to float
  • (string) — cast to string
$modx->makeUrl( (integer) $id, "", "", "full");
$modx->makeUrl( (int) $id, "", "", "full");
$x = (boolean) $x;

// при приведении строки со смешанными числами и буквами к целому числу,
// результат зависит от того, что будет первым.
$x = (int) '1abc'; /* $x = 1 */
$x = (int) 'abc1'; /* $x = 0 */

Подробнее о том, как интерпретируются параметры с разными стилями записи, можно почитать у Боба.

TV

Template Variable, сокращенно — TV, а по русски — дополнительные поля. По умолчанию, в каждом создающемся ресурсе MODX есть определенный набор доступных для заполнения полей, но этих полей как правило не хватает для полноценного сайта, например, может не хватать полей Изображение, или Теги и т.п.

Для вывода доп. поля на странице используется конструкция: [[*имя_тв]]

Для вывода доп. поля в шаблоне сниппета используется конструкция: [[+имя_тв]] 

Ссылка на более подробную информацию о работе с дополнительными полями (tv).

Плагины

Плагины — это php функции, которые подключаются при определенных событиях системы MODX Revo. Например, чтобы отработал некий php код перед тем как страница отрендерится, или после того как произошло нажатие на кнопку «Сохранить». Для новичков эти элементы не нужны, как правило они требуются для более детальной проработки функционала сайта.

Ссылка на более подробную информацию о работе с плагинами.

Категории

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

Теги MODX

Элемент Evolution Revolution
Поле / переменная
[*field_name*]

 

[[*field_name]]

В случаях вызова через некоторые сниппеты, вызов TV полей используется с префиксом (префикс можно изменять).

[[*tv.field_name]]

 

Чанк
{{chunk_name}}

 

[[$chunk_name​​​​​​​]]

 

Сниппет
[[snippet_name]]

 

[[snippet_name]]

Или с параметрами

[[snippet_name? 
&param=`1` 
&param2=`2`
]]

 

Плейсхолдер /

заполнитель

[+placeholder+]

 

[[+placeholder​​​​​​​]]

 

Ссылка
[~link~]

 

[[~link]]

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

Системная

настройка

[(system_setting)]

 

[[++system_setting​​​​​​​]]

 

Системная

информация

[^timing^]

 

[^qt^] – время запроса к базе данных.
[^q^] – количество запросов к базе данных.
[^p^] – время "парсинга" страницы (обработки тегов).
[^t^] – суммарное время обработки страницы, включая рендер.
[^s^] – источник данных страницы (база данных или кеш)

 

Вызов без кеша
[!некэширеумый_элемент!]

 

[[!некэширеумый_элемент]]

 

Элемент с набором параметров нет в Evo
[[элемент@набор_параметров]]

 

Языковая константа нет в Evo
[[%language_string_key​​​​​​​]]

 

Комментарий нет в Evo
[[- любой текст ]]

 

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

Теги состоят из:

[[ — отрывающие тег скобки
! — флаг некешируемости ​​​​​​​(опционально) 
elementToken —  знак идентифицирующий тип элемента (если он не сниппет)(опционально):

  • $ — чанк,
  • * — поле ресурса / ТВ,
  • + — заполнитель / плейсхолдер и др.

elementName — имя элемента тега
@propertyset — идентификатор набора параметров (опционально) 
:filterName=`modifier` — один или несколько фильтров вывода (опционально) 
? — обозначение начала строки параметров (опционально) 
&propertyName=`propertyValue` &… — любые дополнительные параметры разделённые & (опционально) 
]] — закрывающие тег скобки

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

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

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