Pull to refresh

MODx: ресурсы, чанки и какие-то телевизоры

Reading time6 min
Views90K
После того как один мой знакомый спросил у меня про то, что за телевизоры используются в шаблонах, я решил отложить все дела на вечер и написать эту статью.
Речь пойдёт о том из чего состоит MODx, как его лучше «готовить», «подавать» и «употреблять».

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

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

Ресурсы (Resources)


Зачастую ресурс представляет собой страницу сайта. Кроме того существуют другие типы ресурсов, такие как, ссылки, сами файлы, и т.д. По умолчанию тип нового ресурса — документ, точнее представление одной страницы вашего сайта.

Существует 4 вида ресурсов:
  • Документ — самый распространённый ресурс, по сути веб-страница сайта. В основной массе состоит из заголовка, аннотации, подробного текста, различных дат, мета-тегов и дополнительных полей (TV-параметров);
  • Web-ссылка — ссылка на внешний ресурс или веб-страницу;
  • Символическая ссылка — внутренняя ссылка на другой ресурс;
  • Статический ресурс — файл.

Каждый ресурс также имеет уникальный идентификатор, или «Resource Identifier». Если требуется связать два ресурса, то для этого следует использовать ID. Таким образом, MODx сгенерирует ссылку, и вам не придется беспокоиться об изменении адреса страницы или типы адресации.
Так же каждому ресурсу можно назначить шаблон, шаблон может определять дополнительные поля этого ресурса.
Ресурсы могут выступать в роли контейнеров и содержать в себе другие ресурсы. Так образуется структура сайта.

Шаблоны (Templates)


Шаблон — это базовая сущность определяющая отображение страницы в MODx. Шаблоны обычно содержат HTML-теги разметки, которые определяют расположение и внешний вид вашего сайта. Когда страница сайта запрошена, MODx загружает документ или ресурс и его шаблон, затем MODx находит все дополнительные поля в шаблоне и заменяет их соответствующими значениями из документа перед отправкой страницы в браузер пользователя.
Шаблон может быть назначен любому ресурсу и определяет по сути веб-страницу в которой будет выведено содержимое этого ресурса.
Шаблон не может быть включён в другой шаблон как часть.
Пример шаблона:
  1.  
  2. <html>
  3. <head>
  4.     <title>[[*pagetitle]]</title>
  5.     <meta name="description" content="[[*description]]"/>
  6. </head>
  7. <body>
  8.     <h1>[[*longtitle]]</h1>
  9.     ID страницы: [[*id]]<br/>
  10.     Анонс: [[*introtext]]<br/>
  11.     Заголовок в меню: [[*menutitle]]
  12.     <hr/>
  13.     [[*content]]
  14. </body>
  15. </html>
  16.  

Параметры


Используются для вывода значений полей ресурса.
Вызов осуществляется так:
Evolution Revolution
[*field*] [[*field]]

Полный список полей можно посмотреть в документации здесь.

TV параметры


ТелевизорДополнительное поле или переменная шаблона (TV) — это настраиваемое поле, или, точнее это настраиваемое поле для ресурсов MODx. TV-параметры используются для расширения стандартных полей ресурса. Каждый ресурс в MODx имеет определенное количество полей по умолчанию см. выше в разделе про ресурсы.
Если встаёт задача добавить некоторые дополнительные поля на страницу, например, выпадающий список названий месяцев или дополнительное изображение, или любой другой тип пользовательских данных, это можно сделать добавив TV-параметр соответствующего типа. MODx позволяет иметь практически неограниченное количество TV-параметров.
TV-тег заменяется соответствующим значением заполненным пользователем при обработке ресурса. Так же каждый такой параметр привязан к какому либо шаблону и может использоваться лишь в совокупности с ним.
Вызов осуществляется так:
Evolution Revolution
[*tv*] [[*tv]]

TV параметры можно использовать как чанки добавляя им параметры. Например если есть TV-параметр 'intromsg' со значением:
  1. Привет [[+name]], у тебя [[+messageCount]] непрочитанных.

Тогда можно заполнить его данными при вызове:
  1. [[*intromsg?name=`Гриша` &messageCount=`123`]]

Результат:
  1. Привет Гриша, у тебя 123 непрочитанных сообщений.

Так же можно применять фильтры при выводе например так можно ограничить длину выводимой строки до 100 символов:
  1. [[*bioMessage:limit=`100`]]

Полный список фильтров можно посмотреть тут. Кроме того фильтры можно применять к чанкам и сниппетам.

Комментарии


  1. [[# В шаблоне допускается оставлять комментарии, этот код который будет удалён из страницы после её рендеринга. ]]


Чанки (Chunks)


Чанк — кусок статического текста который можно встроить в шаблон, в другой чанк, либо вызвать в снипете. Чанк обладает теми же свойствами что и шаблон за исключением того, что не содержит TV-параметров и не может быть назначен ресурсу напрямую.
Чанк не может содержать какой-либо исполняемый код, но в нём можно вызывать сниппеты для вывода динамического контента.
Вызов чанка осуществляется так:
Evolution Revolution
{{chunk}} [[$chunk]]

В чанк можно передавать параметры. К примеру мы создадим чанк с таким содержанием:
  1. Привет, [[+name]]. У тебя [[+messageCount]] непрочитанных сообщений.

Такой чанк можно вызвать с параметрами, которые в последствии передадутся внутрь его:
  1. [[$intro? &name=`Василий` &messageCount=`12`]]

Данный код выведет:
  1. Привет, Василий. У тебя 12 непрочитанных сообщений.

Кроме статических данных в вызов чанка можно помещать дополнительные и общие параметры ресурсов, например так:
  1. [[!$intro? &name=`[[*usersName]]` &messageCount=`[[*messageCount]]`]]


Сниппеты (Snippets)


Сниппет — ​PHP код который исполняется во время обработки шаблона MODx. Результат работы его может быть расположен либо на месте его вывода, либо в плейсхолдерах, специальных тегах определяющими куда поместить те или иные результаты.

Вызов сниппета осуществляется так:
Evolution Revolution
[[snippet]] [[snippet]]

Размещение плейсхолдера:
Evolution Revolution
[+placeholder+] [[+placeholder]]

Как и чанки в сниппеты можно передавать параметры, например так:
  1. [[!Wayfinder? &startId=`0` &level=`1`]]

Передаваемые параметры можно группировать в так называемые параметры по умолчанию (Property Sets), которые представляют собой динамическую группу параметров, которая может передана в сниппет по средствам указания названия группы.
Параметры по умолчанию задаются в панели администрирования на вкладке «Параметры» у сниппета. Параметры по умолчанию можно также создавать и для чанков.
К примеру создадим группу 'Menu' с параметрами `startId`=0 и `level`=1, затем вызов сниппета таким образом:
  1. [[!Wayfinder@Menu]]

Будет аналогичен, т.к. параметры подставятся автоматически:
  1. [[!Wayfinder &startId=`0` &level=`1`]]

Любой параметр по умолчанию можно переписать. В следующем примере значение параметра `level`, равного единице, будет заменено на 2.
  1. [[!Wayfinder@Menu? &level=`2`]]


Чтобы указать системе не кешировать сниппет требуется добавить восклицательный знак перед именем:
  1. [[!noCacheSnippet]]


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


Каждый тег MODx Revolution может содержать в себе другие теги MODx. Для того что бы код был более менее читаем разрешено размещать код тега на нескольких строках придерживаясь такого общего формата (в скобках мои комментарии, которые писать не надо =)):

  1.  
  2. [[               (открывающий тег)
  3.     !            (необязательный, символ запрета кеширования)
  4.     elementToken (необязательный, символ определяющий тип параметра, если это не сниппет, $=чанк, *=обычное/дополнительное поле ресурса, +=плейсхолдер, и т.д.)
  5.     elementName  (название элемента)
  6.     @propertyset (необязательный, PropertySet идентификатор)
  7.     :filterName=`modifier`:... (не обязательные фильтры, один или более)
  8.     ?            (необязательный, определяет начало строки с параметрами)
  9.     &propertyName=`propertyValue` &... (необязательные любые параметры разделённые &)
  10. ]]              (закрывающий тег)
  11.  


Сводная табличка синтаксиса тегов MODx


Элемент Evolution Revolution Пример
Параметр TV [*templatevar*] [[*templatevar]] [[*pagetitle]]
Чанк {{chunk}} [[$chunk]] [[$header]]
Сниппет (кусок php кода) [[snippet]] [[snippet]] или [[!snippet]] [[getResources]]
Плейсхолдер [+placeholder+] [[+placeholder]] [[+modx.user.id]]
Ссылка на ресурс [~link~] [[~link]] [[~13]]
Системные настройки [(system_setting)] [[++system_setting]] [[++site_start]]

Ресурсы


Tags:
Hubs:
Total votes 36: ↑28 and ↓8+20
Comments18

Articles