Главная MODx Чанки в MODX revolution

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

На этом остановлюсь, вопросы пожелания через комментарии.


Вы можете помочь развитию сайта отправив любую сумму

Комментарии

  1. Дима
    19.07.2018 в 12:20

    Довольно доходчиво, спасибо.

Написать комментарий