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

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

MODX - Чанки в админке

Создание чанка

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

MODX - Создание чанка

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

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();


   MODX Revo 0    1456 +1

Комментарии (1)

  1. Дмитрий К # 0
    Подскажите, есть ли возможность по умолчанию создавать чанки сразу файлами. Т.е. указать где нить в настройках папку для чанков и они по умолчанию создаются туда.

    Вы должны авторизоваться, чтобы оставлять комментарии.