MODX - Чанки
В этой статье рассмотрим понятие, назначение и применение чанков в MODX Revolution. Кроме этого познакомимся с тем, как выполняется обработка и управление чанками в сниппетах через API.
Что такое чанк
Чанк - это элемент MODX, который представляет собой кусок текста или HTML-кода. Предназначен он для формирования некоторого фрагмента (куска, части) HTML-страницы. Например, чанк можно использовать для вывода раздела head HTML-документа, меню, блоков информации в основной и дополнительной области сайта, футера и многих других частей страницы.
Например, чанк (его содержимое), который используется для вывода меню сайта:
[[pdoMenu? &parents=`0` &level=`1` ]]
Кроме этого чанки в MODX Revolution также используются в качестве шаблонов для вывода результатов работы сниппета.
Например, чанк (tpl.Tickets.list.row), который используется в качестве шаблона сниппета getTickets
:
[[!getTickets? &tpl=`tpl.Tickets.list.row`]]
Внутри чанках, как и во многих других элементах MODX Revolution (шаблонах, TV-параметрах, полях ресурса), нельзя непосредственно размещать php-код. Размещение в этих элементах динамического содержимого осуществляется посредством вызовов сниппетов, которые исполняют хранящийся внутри них PHP-код.
Совет: не храните повторяющийся код (раздел head
, шапку сайта, меню, подвал, контактную информацию и др. блоки страницы) в шаблонах. Более предпочтительно всё это оформить в виде чанков, а затем использовать их в необходимых шаблонах. Это позволит сократить значительное количество времени, если потребуется внести изменения в некоторый блок. Вместо редактирования большого количества шаблонов, в данном случае потребуется всего внести изменения только в один чанк.
Где хранятся чанки
Чанки, как и остальные объекты MODX, хранятся в базе данных. Чанки содержатся в таблице modx_site_htmlsnippets
(modx - это префикс таблиц, заданный во время установки системы).

Работа с чанками в админке MODX
Чанки в админке MODX Revolution расположены на левой панели во вкладке "Элементы".

Создание чанка
Создание чанка осуществляется с помощью кнопки "+". После нажатию на эту кнопку открывается страница, содержащая форму. Среди полей этой формы, основными являются имя и код чанка (html). Имя - это название, посредством которого этот чанк можно будет вызывать в шаблоне, содержимом ресурса или в другом месте. Код чанка (html) - это контент, который парсер будет выводить на месте вызова чанка.

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

Редактирование чанка
Для редактирования некоторого чанка в админке необходимо нажать на него левой кнопкой мыши. После этого откроется форма полями чанки, в которую необходимо внести изменения и нажать на кнопку "Сохранить".
Как использовать чанки в MODX
Вставка чанка в шаблон или содержимое ресурса осуществляется с помощью следующего тега MODX:
[[$chunkName]]
Во время обработки страницы, парсер MODX заменит тег чанка его содержимым.
Чанк и его параметры
Чанки в MODX могут иметь параметры. Например, рассмотрим чанк "intro", имеющий следующее содержимое:
Привет, [[+name]]. У Вас [[+messageCount]] сообщений.
Он имеет 2 плейсхолдера: [[+name]] и [[+messageCount]]. Передать значения этим плейсхолдерам можно с помощью указания соответствующих параметров вызову чанка:
[[$intro? &name=`Роман` &messageCount=`7`]]
В результате, получим следующее содержимое:
Привет, Роман. У Вас 7 сообщений.
Если пойти немного дальше, то можно, например, создать TV-параметры name
и messageCount
, и добавить их (эти переменные) к соответствующему шаблону. После этого у каждого ресурса, имеющего этот шаблон, появятся эти TV-параметры. Значения этих TV-параметров можно использовать в качестве значений параметров чанка:
[[!$intro? &name=`[[*name]]` &messageCount=`[[*messageCount]]` ]]
или в содержимом чанка:
Привет, [[*name]]. У Вас [[*messageCount]] сообщений.
Условия в чанках
Условия и другие фильтры MODX можно использовать в любых специальных тегах этой системы.
Например, внутри чанка в зависимости от идентификатора родителя текущего ресурса вывести один или другой чанк.
[[*parent:is=`10`:then=` [[$chunk1]] `:else=` [[$chunk2]] `]]
Но с фильтрами в MODX надо быть очень осторожными, т.к. они могут сильно увеличить время генерации страницы. Это происходит потому, что условия в тегах MODX работают не так как обычные условия в php. Например, в вышеприведённом примере оба чанка вызовутся, не зависимого от того какой идентификатор имеет родитель текущего ресурса. А уже только потом будет определяться какой из этих чанков будет выведен на страницу. Поэтому в MODX они и называются фильтрами. А теперь давайте представим, что в этих чанках есть вызовы некэшируемых сниппетов. В результате в не зависимости от идентификатора родителя текущего ресурса эти вызовы будут выполняться как в первом, так и во втором чанке. Это может привести к значительному увеличению времени генерации страницы и нагрузке на сервер. В таких случаях лучше фильтры не использовать, а выполнять эти действия с помощью сниппета.
<?php $output = 'chunk2'; if ($modx->resource->parent==10) { $output = 'chunk1'; } return $modx->getChunk($output);
Обработка чанка с помощью API
Чанки часто выступают в качестве шаблонов для вывода результатов работы сниппета. Обрабатывается чанк в сниппете через функцию getChunk().
Например, рассмотрим, как использовать чанк "rowTpl" в сниппете.
Чанк "rowTpl", имеет следующее содержимое:
<tr class="[[+rowCls]]" id="row[[+id]]"> <td>[[+pagetitle]]</td> <td>[[+introtext]]</td> </tr>
Содержимое (php-код) сниппета, который получает все опубликованные ресурсы на сайте и выводит их в таблицу. Для вывода данных отдельного ресурса (одной строки таблицы, состоящей из 2 ячеек) используется шаблон rowTpl.
// получить массив (коллекцию) опубликованных ресурсов $resources = $modx‐>getCollection('modResource',array('published' => true)); // переменная-счётчик $i = 0; // переменная, хранящая результат $output = ''; // перебрать все ресурсы foreach ($resources as $resource) { // создать ассоциативный PHP массив из полей ресурса $properties = $resource‐>toArray(); // установить ключу rowCls ассоциативного массива $properties значение alt, если ресурс чётный $properties['rowCls'] = $i % 2 ? '' : 'alt'; // получить содержимое чанка rowTpl, передав в него массив полей ресурса в качестве параметров $output .= $modx‐>getChunk('rowTpl',$properties); // увеличить значение переменной на 1 $i++; } // вернуть в качестве результата таблицу опубликованных ресурсов return '<table><tbody>'.$output.'</tbody></table>';
Управление чанком через API
Управлять чанками в MODX можно через API:
<?php /* 1. Создать новый чанк, наполнить его контентом. Сохранить этот чанк в базу данных. */ // 1.1. Создать новый чанк $chunk = $modx‐>newObject('modChunk'); // 1.2. Установить этому новому чанку имя NewChunkName $chunk‐>set('name','NewChunkName'); // 1.3. Установить этому чанку контент $chunk‐>setContent('<p>Это мой новый чанк!</p>'); // 1.4. Сохранить этот чанк в базу данных $chunk‐>save(); /* 2. Получить существующий чанк, изменить содержимое этого чанка. Сохранить изменения в базу данных */ // 2.1. Получить чанк, имеющий имя NewChunkName $chunk = $modx‐>getObject('modChunk', array('name' => 'NewChunkName')); // 2.2. Если чанк с таким именем существует, то... if ($chunk) { // 2.3. Установить ему следующий контент $chunk‐>setContent('<p>Это мой чанк, но уже с новым контентом!</p>'); // 2.4. Сохранить изменения $chunk‐>save(); } /* 3. Получить существующий чанк и удалить его из базы данных */ // 3.1. Получить чанк, имеющий имя NewChunkName $chunk = $modx‐>getObject('modChunk', array('name' => 'NewChunkName')); // 3.2. Если чанк с таким именем существует, то удалить его. if ($chunk) $chunk‐>remove();