modx revo передать параметр в чанк
Основы движка MODX — чанки, сниппеты и плейсхолдеры
Рассмотрим базовые элементы движка MODX — чанки, сниппеты и плейсхолдеры. Они являются неотъемлемой частью сайтов на этой CMS, поэтому следует четко понимать их отличие и назначение. Посмотрим следующую схему:
Чанки
Чанк это мини-шаблон для отдельного блока сайта. Например, требуется для разных страниц использовать разные шаблоны, а шапка сайта должна быть одинаковой. В таком случае её лучше вынести в отдельный чанк и подключить его в нужных шаблонах. При необходимости поправить код шапки, не придется редактировать все имеющиеся шаблоны. Достаточно будет поправить один чанк.
Чанки могут быть вложены друг в друга, содержать сниппеты и плейсхолдеры:
Сниппеты в modx revo
Сниппет — это программный код (PHP,SQL,XPDO), в результате выполнения которого возвращается результат (аналог функций в PHP). Чаще всего результатом является html код, но это не обязательно. Например, он может произвести действия с базой данных и при этом ничего не вывести на экран. Вызываться сниппет может в шаблоне, чанке и даже в содержимом ресурса:
В примере используется стандартный вариант вызова сниппета с кешированием. В этом режиме при первом обращении к сниппету результат его работы кешируется, а при последующих обращениях — выдается сохраненный результат. Такой способ вызова ускоряет время генерации страницы и может применяться к элементам сайта, которые не требуют моментального обновления. Например, главное меню сайта, которое изменяется редко. Для запрета кеширования перед названием ставится восклицательный знак:
В MODX чаще всего используют готовые сниппеты, входящие в состав установленных компонентов (пакетов), но для лучшего понимания принципов их работы создадим свой.
Передача параметров сниппету
Создадим сниппет «CountChar», который будет в качестве параметров получать строку и цвет, а на выходе выдавать количество букв в строке и выделять это число указанным цветом.
В коде сниппета получаем параметры. При этом, можно задать значение, которое будет присваиваться переменной, если параметр не указывался (», ‘black’). Далее производим вычисления и возвращаем результат.
Передача плейсхолдеров в чанк
Мы реализовали задуманное, но при этом нарушили негласное правило — смешали программный код и теги оформления. Если кому-то потребуется обернуть результат не в тег «span», а в «div», то могут возникнуть проблемы. Конечно, хорошо когда в коде всего десять строк, а если их будет тысяча? Для избежания таких проблем отделим «мух от котлет».
Создадим чанк «tplCountChar», внутрь которого поместим плейсхолдеры:
Осталось доработать сам сниппет. Разбирать его подробно не будем, так как он содержит в себе комментарии:
Результат работы: 11 символов!
Запуск сниппета из сниппета
Про тонкости разработки сниппетов в MODX Revolution можно написать целую книгу, поэтому я ограничусь ещё только одной «фишкой» — возможностью запускать из своего сниппета сторонние. При создании сайтов такой функционал будет требоваться крайне редко, поэтому считайте эту информацию лишь небольшим бонусом.
Синтаксис вызова отличается от используемого в чанках или шаблонах, но результат будет тот же самый.
Плейсхолдеры в MODX
Есть ещё системные плейсхолдеры. Они берутся из системных настроек MODX и доступны для вызова в любом месте сайта:
Таких переменных насчитывается несколько десятков, но большинство из них не требуется при разработке сайта.
В этой статье рассмотрим понятие, назначение и применение чанков в MODX Revolution. Кроме этого познакомимся с тем, как выполняется обработка и управление чанками в сниппетах через API.
Что такое чанк
Например, чанк (его содержимое), который используется для вывода меню сайта:
Кроме этого чанки в MODX Revolution также используются в качестве шаблонов для вывода результатов работы сниппета.
Например, чанк (tpl.Tickets.list.row), который используется в качестве шаблона сниппета getTickets :
Внутри чанках, как и во многих других элементах MODX Revolution (шаблонах, TV-параметрах, полях ресурса), нельзя непосредственно размещать php-код. Размещение в этих элементах динамического содержимого осуществляется посредством вызовов сниппетов, которые исполняют хранящийся внутри них PHP-код.
Где хранятся чанки
Работа с чанками в админке MODX
Чанки в админке MODX Revolution расположены на левой панели во вкладке «Элементы».
Создание чанка
Кроме этого система MODX позволяет хранить содержимое чанка во внешнем файле. Для этого необходимо установить галочку в поле статичный, выбрать источник файлов и указать его расположение.
Редактирование чанка
Для редактирования некоторого чанка в админке необходимо нажать на него левой кнопкой мыши. После этого откроется форма полями чанки, в которую необходимо внести изменения и нажать на кнопку «Сохранить».
Как использовать чанки в MODX
Вставка чанка в шаблон или содержимое ресурса осуществляется с помощью следующего тега MODX:
Во время обработки страницы, парсер MODX заменит тег чанка его содержимым.
Чанк и его параметры
Чанки в MODX могут иметь параметры. Например, рассмотрим чанк «intro», имеющий следующее содержимое:
Он имеет 2 плейсхолдера: [[+name]] и [[+messageCount]]. Передать значения этим плейсхолдерам можно с помощью указания соответствующих параметров вызову чанка:
В результате, получим следующее содержимое:
или в содержимом чанка:
Условия в чанках
Условия и другие фильтры MODX можно использовать в любых специальных тегах этой системы.
Например, внутри чанка в зависимости от идентификатора родителя текущего ресурса вывести один или другой чанк.
Но с фильтрами в MODX надо быть очень осторожными, т.к. они могут сильно увеличить время генерации страницы. Это происходит потому, что условия в тегах MODX работают не так как обычные условия в php. Например, в вышеприведённом примере оба чанка вызовутся, не зависимого от того какой идентификатор имеет родитель текущего ресурса. А уже только потом будет определяться какой из этих чанков будет выведен на страницу. Поэтому в MODX они и называются фильтрами. А теперь давайте представим, что в этих чанках есть вызовы некэшируемых сниппетов. В результате в не зависимости от идентификатора родителя текущего ресурса эти вызовы будут выполняться как в первом, так и во втором чанке. Это может привести к значительному увеличению времени генерации страницы и нагрузке на сервер. В таких случаях лучше фильтры не использовать, а выполнять эти действия с помощью сниппета.
Обработка чанка с помощью API
Чанки часто выступают в качестве шаблонов для вывода результатов работы сниппета. Обрабатывается чанк в сниппете через функцию getChunk().
Например, рассмотрим, как использовать чанк «rowTpl» в сниппете.
Чанк «rowTpl», имеет следующее содержимое:
Содержимое (php-код) сниппета, который получает все опубликованные ресурсы на сайте и выводит их в таблицу. Для вывода данных отдельного ресурса (одной строки таблицы, состоящей из 2 ячеек) используется шаблон rowTpl.
MODX Revolution встречает Fenom
В последнее время в англоязычном сообществе MODX много рассуждений на тему «как нам жить дальше». Все на перебой обсуждают грядущую (через несколько лет, полагаю) мажорную версию 3, а мы пока улучшаем своими дополнениями текущую.
Свежее событие, которым я бы хотел поделиться с широкой аудиторией — это выпуск новой версии pdoTools с шаблонизатором Fenom, которая позволит вам полностью избавиться от нагромождения тегов в условиях чанков и переписать их на простом и понятном языке шаблонизатора.
Процедура не требует изменений в работе сайта, просто обновите pdoTools до версии 2.0 и можно использовать новый синтаксис. Самое приятное, что теги MODX отлично соседствуют с Fenom и работают вместе без каких-либо проблем. Простой пример для затравки:
Под катом огромное количество информации о парсере pdoTools, которую я еще ни разу не собирал в одном месте.
Принцип работы
Обработка чанка
В классе pdoTools для этого есть 2 метода, очень похожих на таковые в классе modX:
Варианты чанков
Итак, оба метода pdoTools поддерживают следующие виды имён чанков:
@INLINE или @CODE
Один из самых популярных вариантов — указание тела чанка прямо на странице. Например:
В таком указании есть особенность, о которой многие люди не задумываются — все плейсхолдеры внутри чанка будут обработаны парсером до вызова сниппета.
То есть, если вызвать сниппет на странице вот так:
Вы можете использовать фигурные скобочки в качестве обрамления плейсхолдеров во всех чанках pdoTools — он сам превратит их в [[+]] при загрузке.
По этой же причине у вас никогда не будут работать вызовы сниппетов и фильтров в INLINE чанках. Вот так работать не будет:
А вот так — без проблем
Помните об этом нюансе при использовании INLINE чанков.
Многие люди обвиняют MODX в том, что он не умеет хранить чанки в файлах и вынуждает лишний раз работать с базой данных. Это и неудобно для системы контроля версий, и медленнее.
С версии 2.2 MODX предлагает использовать для этих целей статичные элементы, но по ряду причин, этот способ всё равно может быть менее удобен, чем прямая работа с файлами.
pdoTools открывает такую возможность при указании @FILE:
Вы можете указать свою собственную директорию для файлов через параметр &tplPath :
Файл будет загружен из файла /core/elements/resources/mychunk.tpl от корня сайта.
@TEMPLATE
Этот тип чанка позволяет использовать шаблоны системы (т.е. объекты modTemplate) для оформления вывода.
Если указан пустой шаблон и в выбранных записях есть поле template с id или именем шаблона, то запись будет обёрнута в этот шаблон:
Это такой аналог сниппета renderResources.
При выводе шаблона можно указывать и набор параметров (как у сниппетов):
Тогда значения из этого набора будут вставлены в шаблон.
Обычные чанки
Это режим по умолчанию, который загружает чанк из базы данных:
Точно так же поддерживаются и наборы параметров:
Метод getChunk
Объявление этого метода выглядит так:
Третий параметр fastMode вырезает все оставшиеся необработанные плейсхолдеры, чтобы не было лишних тегов на странице. Если этого не сделать, то парсер будет пытаться рекурсивно разобрать эти теги (до 10 итераций по умолчанию), что может привести к замедлению работы.
Рекурсивный парсер — это одно из достоинств MODX и специально оставленные теги очень часто встречаются в логике работы сниппетов системы. Поэтому fastMode отключен по умолчанию и использовать его нужно, только если вы уверены в том, что делаете.
Парсер pdoTools не будет вызывать системный парсер, если смог самостоятельно разобрать все плейсхолдеры. Если же в чанке остались какие-то вызовы фильтров или сниппетов, то работа передаётся в modParser, что требует дополнительное время на обработку.
Метод parseChunk
А этот метод объявлен вот так:
Он также создаёт чанк из указанного имени, разбирая @BINDING, если есть, а потом просто заменяет плейсхолдеры на значения, без особых обработок.
Это самый простой и быстрый способ оформления данных в чанки.
Обработка страницы
Если pdoParser включен в настройках, то он вызывается и для обработки всей страницы при выводе её пользователю.
При использовании этого парсера все чанки и дополнения MODX обрабатываются немного быстрее. Всего лишь «немного» потому, что он не берёт на себя условия и фильтры, обрабатывая только простенькие теги, типа [[+id]] и [[
Помимо возможной прибавки скорости, вы получаете еще и новые возможности по удобному выводу данных из разных ресурсов.
Теги fastField
В конце 2012 года общественности был представлен небольшой плагин с добавлением новых тегов парсеру MODX, который затем вырос в компонент fastField.
Все теги fastField начинаются с # и дальше содержат или id нужного ресурса, или название глобального массива.
Вывод обычных полей ресурсов:
ТВ параметры ресурсов:
Поля товаров miniShop2:
Массивы ресурсов и товаров:
Можно указывать любые поля в массивах:
Если вы не знаете, какие значения находятся внутри массива — просто укажите его и он будет распечатан полностью:
Теги fastField можно сочетать с тегами MODX:
Шаблонизатор Fenom
Поддержка шаблонизатора Fenom появилась в pdoTools с версии 2.0, после чего он стал требовать PHP 5.3+.
Он работает гораздо быстрее, чем родной modParser, и если вы перепишите свой чанк так, что в нём не будет ни одного тега MODX, то modParser и вовсе не будет запускаться. При этом, конечно, одновременная работа и старых тегов, и новых в одном чанке допускается.
Включение pdotools_fenom_parser позволяет использовать синтаксис Fenom прямо в контенте документов и шаблонах страниц, но есть один нюанс — шаблонизатор может неверно реагировать на фигурные скобочки, которые в MODX очень любят.
В таких случаях автор рекомендует использовать тег
Если вы планируете включить Fenom глобально для всего сайта, вам нужно проверить, на всех ли страницах он нормально работает.
Синтаксис
Для начала советую прочитать официальную документацию, а дальше мы рассмотрим синтаксис применительно к MODX.
Все переменные от сниппетов передаются в чанк как есть, поэтому переписывать старые чанки на новый синтаксис — сплошное удовольствие.
MODX | Fenom |
[[+id]] | |
[[+id:default=`test`]] | |
[[+id:is=«:then=`test`:else=`[[+pagetitle]]`]] |
Для использования более сложных сущностей, в pdoParser предусмотрена служебная переменная , которая даёт безопасный доступ к некоторым переменным и методам системы.
MODX | Fenom |
[[*id]] | <$_modx->resource.id> |
[[*tv_param]] | <$_modx->resource.tv_param> |
[[%lexicon]] | <$_modx->lexicon(‘lexicon’)> |
[[ [[*id]]]] | <$_modx->makeUrl($_modx->resource.id)> |
[[++system_setting]] | <$_modx->config.system_setting> |
Помимо этого вам доступны переменные:
<$_modx->config> — системные настройки
<$_modx->user> — массив текущего пользователя. Если он авторизован, то добавляются и данные из профиля:
<$_modx->context> — массив с текущим контекстом
<$_modx->resource> — массив с текущим ресурсом, это вы уже видели в примерах выше
<$_modx->lexicon> — объект (не массив!) modLexicon, который можно использовать для загрузки произвольных словарей:
Плейсхолдеры с точкой
Fenom использует точку для доступа к значению массива, а MODX обычно выствляет так плейсхолдеры из массивов. Соотвественно, для тегов [[+tag.sub_tag]] аналогов в Fenom не предусмотрено.
Поэтому для подобных плейсхолдеров вам необходимо использовать вторую служебную переменную — :
Вывод сниппетов и чанков
Переменная <$_modx>на самом деле представляет собой простой и безопасный класс microMODX
Поэтому сниппеты и чанки вызываются так:
Как видите, синтаксис практически полностью повторяет PHP, что открывает новые возможности. Например, можно указывать массивы, вместо JSON строк.
Если для вызова сниппета используется родной метод MODX, то для вывода чанков запускается pdoTools, и вы можете использовать все его возможности:
Примеры выше немного безумные, но вполне себе работают.
Управление кэшированием
В объекте доступен сервиc modX::cacheManager, который позволяет вам устанавливать произвольное время кэширование вызываемых сниппетов:
А еще вы можете запускать системные процессоры (если прав хватит):
Проверка авторизации
Так как объекта с пользователем в <$_modx>нет, методы проверки авторизации и прав доступа вынесены непосредственно в класс:
Остальные методы
Эти методы должны быть знакомы всем разработчикам MODX, поэтому просто покажу их на примерах:
Расширение шаблонов
Использование шаблонизатора Fenom позволяет включать одни чанки (шаблоны в другие) и даже расширять их.
Например, вы можете просто подгрузить содержимое чанка:
Подробнее про
Гораздо более интересная функция —
Пишем базовый шаблон «Fenom Base»:
Он включает обычные чанки (в которых, кстати, обычные плейсхолдеры MODX от компонента Theme.Bootstrap) и определяет несколько блоков
Теперь пишем «Fenom Extended»:
Так вы можете написать один базовый шаблон и расширить его дочерними.
Точно также можно писать и расширять чанки, только обратите внимание, что для работы с modTemplate нужно указывать префикс template:, а для чанков нет — они работают по умолчанию во всех
Тестирование производительности
Создаём новый сайт и добавляем в него 1000 ресурсов вот таким консольным скриптом:
Затем создаём 2 чанка: modx и fenom со следующим содержимым, соответственно:
И добавляем два консольных скрипта тестирования. Для родного парсера MODX
Так как pdoTools понимает оба синтаксиса, для него 2 теста — в режиме тегов MODX, и в режиме Fenom.
В скриптах есть указание limit = 10, дальше в таблице я привожу цифры с его возрастанием:
Limit | MODX | pdoTools (MODX) | pdoTools (Fenom) |
10 | 0.0369s 8.1973mb | 0.0136s 7.6760mb | 0.0343s 8.6503mb |
100 | 0.0805s 8.1996mb | 0.0501s 7.6783mb | 0.0489s 8.6525mb |
500 | 0.2498s 8.2101mb | 0.0852s 7.6888mb | 0.0573s 8.6630mb |
1000 | 0.4961s 8.2232mb | 0.1583s 7.7019mb | 0.0953s 8.6761mb |
А теперь, давайте немного усложним чанки — добавим в них генерацию ссылки для ресурса и вывод menutitle :
Limit | MODX | pdoTools (MODX) | pdoTools (Fenom) |
10 | 0.0592s 8.2010mb | 0.0165s 7.8505mb | 0.0346s 8.6539mb |
100 | 0.1936s 8.2058mb | 0.0793s 7.8553mb | 0.0483s 8.6588mb |
500 | 0.3313s 8.2281mb | 0.2465s 7.8776mb | 0.0686s 8.6811mb |
1000 | 0.6073s 8.2560mb | 0.4733s 7.9055mb | 0.1047s 8.7090mb |
Как видите, обработка чанков через pdoTools во всех случаях быстрее.
При этом заметно, что у чанков Fenom есть некоторый минимум для старта, который обусловлен необходимостью компиляции шаблона.
Заключение
Большое спасибо хабраюзеру aco за замечательный шаблонизатор!
MODx: ресурсы, чанки и какие-то телевизоры
После того как один мой знакомый спросил у меня про то, что за телевизоры используются в шаблонах, я решил отложить все дела на вечер и написать эту статью.
Речь пойдёт о том из чего состоит MODx, как его лучше «готовить», «подавать» и «употреблять».
Рассчитана она в первую очередь на новичков т.к. содержит базовый минимум того, что нужно знать любому modxоводу, ну и конечно на тех кому просто интересно.
Статья ориентирована в основном на Revolution и отражает основные отличия в синтаксисе её от предшественницы, но для обратной совместимости буду вставлять иногда аналогии с Evolution.
Ресурсы (Resources)
Зачастую ресурс представляет собой страницу сайта. Кроме того существуют другие типы ресурсов, такие как, ссылки, сами файлы, и т.д. По умолчанию тип нового ресурса — документ, точнее представление одной страницы вашего сайта.
Шаблоны (Templates)
Параметры
Используются для вывода значений полей ресурса.
Вызов осуществляется так:
Evolution | Revolution |
[*field*] | [[*field]] |
Полный список полей можно посмотреть в документации здесь.
TV параметры
ТелевизорДополнительное поле или переменная шаблона (TV) — это настраиваемое поле, или, точнее это настраиваемое поле для ресурсов MODx. TV-параметры используются для расширения стандартных полей ресурса. Каждый ресурс в MODx имеет определенное количество полей по умолчанию см. выше в разделе про ресурсы.
Если встаёт задача добавить некоторые дополнительные поля на страницу, например, выпадающий список названий месяцев или дополнительное изображение, или любой другой тип пользовательских данных, это можно сделать добавив TV-параметр соответствующего типа. MODx позволяет иметь практически неограниченное количество TV-параметров.
TV-тег заменяется соответствующим значением заполненным пользователем при обработке ресурса. Так же каждый такой параметр привязан к какому либо шаблону и может использоваться лишь в совокупности с ним.
Вызов осуществляется так:
Evolution | Revolution |
[*tv*] | [[*tv]] |
TV параметры можно использовать как чанки добавляя им параметры. Например если есть TV-параметр ‘intromsg’ со значением:
Полный список фильтров можно посмотреть тут. Кроме того фильтры можно применять к чанкам и сниппетам.
Комментарии
Чанки (Chunks)
Чанк — кусок статического текста который можно встроить в шаблон, в другой чанк, либо вызвать в снипете. Чанк обладает теми же свойствами что и шаблон за исключением того, что не содержит TV-параметров и не может быть назначен ресурсу напрямую.
Чанк не может содержать какой-либо исполняемый код, но в нём можно вызывать сниппеты для вывода динамического контента.
Вызов чанка осуществляется так:
Evolution | Revolution |
< | [[$chunk]] |
В чанк можно передавать параметры. К примеру мы создадим чанк с таким содержанием:
Сниппеты (Snippets)
Сниппет — PHP код который исполняется во время обработки шаблона MODx. Результат работы его может быть расположен либо на месте его вывода, либо в плейсхолдерах, специальных тегах определяющими куда поместить те или иные результаты.
Вызов сниппета осуществляется так:
Evolution | Revolution |
[[snippet]] | [[snippet]] |
Размещение плейсхолдера:
Evolution | Revolution |
[+placeholder+] | [[+placeholder]] |
Как и чанки в сниппеты можно передавать параметры, например так:
Чтобы указать системе не кешировать сниппет требуется добавить восклицательный знак перед именем:
Синтаксис тегов
Каждый тег MODx Revolution может содержать в себе другие теги MODx. Для того что бы код был более менее читаем разрешено размещать код тега на нескольких строках придерживаясь такого общего формата (в скобках мои комментарии, которые писать не надо =)):
Прямой эфир
RuSS_lan 15 сентября 2021, 12:15
levonty 12 сентября 2021, 16:05
digitz 2 сентября 2021, 15:32
marinau 31 августа 2021, 18:52
nohc 28 августа 2021, 20:02
tmih 27 августа 2021, 10:44
kymage 26 августа 2021, 15:04
Aharito 24 августа 2021, 04:05
Aharito 24 августа 2021, 03:11
3fir 16 августа 2021, 18:42
Инфо о авторе топика
Борисов Евгений
Контакты
Аккаунты
Топики пользователя
Tips & tricks
Категории
Подразделы блога
Блоги
Передаем параметры в чанки или выжимаем все из modx::parseChunk
В MODX Revolution есть такая прикольная штука, как параметры у чанков. Т.е. вы можете создать чанк с какими-то плейсхолдерами. И при вызове чанка передать в нужный плейсхолдер значение. Т.е. выглядит это примерно так
В чанке ChunkName заменяются плейсхолдеры name и mail на chunk и parsechunk@example.com соответственно.
В MODX Evolution такой возможности нет. Поэтому очень часто приходится изобретать велосипеды в виде сниппетов которые выполняют функцию parseChunk заменяя нужные значения у чанка. Из-за этого у некоторых разработчиков на сайте появляются тонны таких специализированных сниппетов. WTF? Зачем?
Создаем сниппет parseChunk
Все. Теперь если нам понадобится подставить в какой-то плейсхолдер чанка значение, то не нужно плодить 1000 сниппетов. Просто передаем этому сниппету через параметр ChunkName название чанка. А все остальные параметры у нас будут будут плейсхолдерами которые нужно заменить. Гениально:-)