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

    После того как один мой знакомый спросил у меня про то, что за телевизоры используются в шаблонах, я решил отложить все дела на вечер и написать эту статью.
    Речь пойдёт о том из чего состоит 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]]

    Ресурсы


    Share post

    Comments 18

      –14
      Зачем faq на хабре?
        +9
        Зачем, хм, вы на хабре?
        +1
        все это хорошо, вот только мне до сих пор непонятно, зачем вообще нужны TV? шаблоны, чанки, сниппеты, это все ясно. но вот где использовать TV? тем более что кастомные TV как то очень заумно создаются
          +3
          нужны ради универсализации. собственно, благодаря им можно гибко менять структуру контента без особых беспокойств. использование ограничено только вашей фантазией.
            +3
            tv удобны, когда их не сильно много. делал я как-то каталог на модиксе, с tv все тормозило безбожно (учитывая количество элементов в дереве). Пришлось просто написать свой компонент, со своей таблицей и логикой, что в итоге оказалось правильно, так как и работать стало проще и скорость выросла.
              +1
              Для интернет магазинов вообще отдельная история, MODx целесообразно использовать, когда количество позиций относительно невелико. А в совокупности с такими стандартными сниппетами как Ditto например, производительность падает еще больше. За такую гибкую шаблонизацию приходится дорого платить
                0
                Для магазина вроде как развивается компонент VisionCart. В нем как раз подход независимого каталога используется, насколько я понял. Подробно его еще не изучал.
            0
            Самый простой пример — у вас есть шаблон для вывода какой-нибудь позиции, элемента портфолио, товара, услуги и тд. разница только в картинке, описании, ссылке. вот вы и создаете 3 tv разного типа, назначаете их шаблону и дальше при заполнении данных указываете значения в tv.
            по-моему, tv это некий упрощенный аналог свойств инфоблока в битриксе.
            0
            Начал за здравие, а кончил за упокой.
            В начале хорошее и понятное описание, а дальше какие-то краткие вырезки без нормальных примеров.
            По моему ваши комментарии в коде с примером многострочности, очень усложняют чтения примера.
              +1
              В примерах для Evolution надо поменять [[*field*]] на [*field*].
                0
                Спасибо, поменял.
                0
                Конец статьи скомкан, а там очень полезно и доступно. Спасибо.
                  0
                  Спасибо. Не знал про фильтры в TV-параметрах. Для меня очень полезный материал.
                    0
                    У modx по прежнему темы в базе?
                      +1
                      По-крайней мере в evo версии точно
                        +1
                        Да, в базе. Только что в этом плохого? Учитывая, что кеширование они таки допилили до вменяемого уровня.
                        +1
                        «Ресурс представляет собой страницы в MODx. Существуют различные типы ресурсов, такие как документы, ссылки, сами файлы, и т.д.»
                        Непонятно, всё-таки «страницы» или «существуют различные типы ресурсов»
                          0
                          Спасибо, поправил.

                        Only users with full accounts can post comments. Log in, please.