MODx
Чанки в MODX revolution
Чанк — кусок статического текста который можно встроить в шаблон, в другой чанк, либо вызвать в снипете. Чанк обладает теми же свойствами что и шаблон за исключением того, что не содержит TV-параметров(дополнительные поля) и не может быть назначен ресурсу напрямую.
Чанк не может содержать какой-либо исполняемый код, но в нём можно вызывать сниппеты для вывода динамического контента.
Где хранятся чанки.
Чанки, как и остальные объекты MODX, хранятся в базе данных. Чанки содержатся в таблице modx_site_htmlsnippets
(modx - это префикс таблиц, заданный во время установки системы).
Работа с чанками в админке MODX.
Чанки в админке MODX Revolution расположены на левой панели во вкладке "Элементы".
Создание чанка.
Создание чанка осуществляется с помощью кнопки "+". После нажатию на эту кнопку открывается страница, содержащая форму. Среди полей этой формы, основными являются имя и код чанка (html). Имя - это название, посредством которого этот чанк можно будет вызывать в шаблоне, содержимом ресурса или в другом месте. Код чанка (html) - это контент, который парсер будет выводить на месте вызова чанка.
Кроме этого система MODX позволяет хранить содержимое чанка во внешнем файле. Для этого необходимо установить галочку в поле статичный, выбрать источник файлов и указать его расположение.
Редактирование чанка
Для редактирования некоторого чанка в админке необходимо нажать на него левой кнопкой мыши. После этого откроется форма полями чанки, в которую необходимо внести изменения и нажать на кнопку "Сохранить".
Вызов чанка осуществляется так:
[[$chunk]]
В чанк можно передавать параметры. К примеру мы создадим чанк intro с таким содержанием:
Привет, [[+name]]. У тебя [[+messageCount]] непрочитанных сообщений.
Такой чанк можно вызвать с параметрами, которые в последствии передадутся внутрь его:
[[$intro? &name=`Василий` &messageCount=`12`]]
Данный код выведет:
Привет, Василий. У тебя 12 непрочитанных сообщений.
Кроме статических данных в вызов чанка можно помещать дополнительные и общие параметры ресурсов, например так:
[[!$intro? &name=`[[*usersName]]` &messageCount=`[[*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();
На этом остановлюсь, вопросы пожелания через комментарии.
Другие статьи:
Довольно доходчиво, спасибо.