Чанки – это кусочки статического текста, которые вы можете повторно использовать на своем сайте. По функциям они похожи на файлы или «блоки» в других системах управления контентом. Типичными примерами чанков могут быть ваша контактная информация или уведомление об авторских правах. Хотя чанки не могут содержать никакой логики напрямую, они могут содержать вызовы Сниппетов, которые являются исполняемыми битами кода PHP, которые производят динамический вывод.
Создание¶
Прежде чем вы сможете использовать чанк, вы должны сначала создать и назвать его, вставив текст в менеджер MODX (Элементы –> Чанки –> Новый чанк):
Использование¶
Чтобы использовать Чанк, вы ссылаетесь на него по имени в ваших шаблонах или в содержимом вашей страницы.
[[$chunkName]]
Эта ссылка затем заменяется содержимым Чанка.
Вы также можете передать свойства в чанк. Скажем, у вас был чанк с именем intro и содержимым:
Привет,
[[+name]]
. У тебя есть[[+messageCount]]
сообщений.
Вы можете заполнить эти значения с:
[[$intro? &name=`George` &messageCount=`12`]]
Который будет выводить:
Привет, George. У тебя есть 12 сообщений.
Вы могли бы сделать еще один шаг, добавив Переменные шаблона что позволяет пользователю указать свое имя для каждого ресурса:
[[!$intro? &name=`[[*usersName]]` &messageCount=`[[*messageCount]]`]]
или в самом чанке:
Привет, [[*usersName]]. У тебя есть [[*messageCount]] сообщений.
Обработка чанка через API¶
Чанки также часто используются для форматирования вывода сниппетов. Чанк может быть обработан из сниппета с помощью функции process();
например, с учетом следующего чанка с именем rowTpl:
<tr class="[[+rowCls]]" id="row[[+id]]">
<td>[[+pagetitle]]</td>
<td>[[+introtext]]</td>
</tr>
следующий сниппет кода извлекает его и обрабатывает его с массивом свойств для всех опубликованных ресурсов и возвращает отформатированные результаты в виде таблицы, устанавливая класс «alt» для четных строк:
$resources = $modx->getCollection('modResource',array('published' => true));
$i = 0;
$output = '';
foreach ($resources as $resource) {
$properties = $resource->toArray();
$properties['rowCls'] = $i % 2 ? '' : 'alt';
$output .= $modx->getChunk('rowTpl',$properties);
$i++;
}
return '<table><tbody>'.$output.'</tbody></table>';
Модификация чанка через API¶
Чанками также можно манипулировать с помощью MODX API:
<?php
/* create a new chunk, give it some content and save it to the database */
$chunk = $modx->newObject('modChunk');
$chunk->set('name','NewChunkName');
$chunk->setContent('<p>This is my new chunk!</p>');
$chunk->save();
/* get an existing chunk, modify the content and save changes to the database */
$chunk = $modx->getObject('modChunk', array('name' => 'MyExistingChunk'));
if ($chunk) {
$chunk->setContent('<p>This is my existing chunks new content!</p>');
$chunk->save();
}
/* get an existing chunk and delete it from the database */
$chunk = $modx->getObject('modChunk', array('name' => 'MyObsoleteChunk'));
if ($chunk) $chunk->remove();
?>
Смотрите также¶
- modChunk
Open COllective
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$400 per month—let’s make that $500!
Learn more
В этой статье рассмотрим понятие, назначение и применение чанков в 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 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();
На чтение 5 мин Просмотров 7.9к. Опубликовано 08.08.2020
Обновлено 15.01.2023
Содержание
- Что такое
- Где хранятся
- Как создать
- Как вызывать
- Чанк с параметрами
- Условия в чанках
- Натягиваем шаблон — логика разбивки шаблона
- Для чего все это?
В прошлых уроках мы разобрали различный синтаксис модх парсера и fenom, а также перенесли HTML шаблон в MODX Revo (там можно скачать шаблон на основе которого пойдут дальнейшие уроки). Сейчас код шаблона статичный и чтобы что то поправить нужно править код — начнем это исправлять. В данном уроке разобьем код на отдельные части — MODX чанки, чтобы в будущем с кодом шаблона было проще работать.
Что такое
MODX чанки – это контейнеры для HTML/CSS/JS-кода (нельзя добавлять php-скрипты, вернее можно но они будут игнорироватся, для этого есть сниппеты). В чанке можно вызывать другие чанки, tv и сниппеты (можно вкладывать другие элементы).
Где хранятся
Чанки, хранятся в БД, в таблице modx_site_htmlsnippets (где modx_ — это префикс таблиц, который задан во время установки движка).
Как создать
Есть несколько способов создания чанков, рассмотрим каждый из них.
Переходим во вкладку «Элементы» и кликаем:
- На иконку «Новый чанк».
- На плюс напротив пункта «Чанки».
- ПКМ кликаем по пункту Чанки и выбираем «Создать» либо «Быстро создать».
- Воспользоваться пакетом TagElementPlugin.
Как вызывать
Выводятся чанки в шаблоне при помощи следующей конструкции:
[[$name_chunks]]
– кэшируемый вызов (рекомендуется в большинстве случаев).[[!$name_chunks]]
, не кэшируемый вызов — выводится каждый раз из БД MODX парсером — что замедлит сайт.{include 'name_chunks'}
, вызов чанка при помощи fenom. Также Fenom позволяет включать одни чанки в другие и даже расширять их. Пример вызова чанка с набором параметров:{include 'chunk@propertySet'}
. Подробнее про {include} читайте в оф. документации.
Чанк с параметрами
Допустим у нас есть чанк «info», со следующим содержимым:
Привет, [[+name]]. У Вас [[+mesCount]] сообщений.
Он имеет 2 плейсхолдера: [[+name]] и [[+mesCount]]. Передать значения данным плейсхолдерам можно при помощи указания соответствующих параметров вызову чанка:
[[$info? &name=`Алексей` &mesCount=`11`]]
В результате, получим следующее содержимое:
Привет, Алексей. У Вас 11 сообщений.
Условия в чанках
Условия и другие phx фильтры / модификаторы MODX можно использовать в любых специальных тегах. Например, нам нужно вывести чанк в чанке (один или другой) в зависимости от идентификатора родителя текущего ресурса.
[[*parent:is=`7`:then=`
[[$chunk1]]
`:else=`
[[$chunk2]]
`]]
Внимание! Будьте осторожными, условия могут сильно увеличить время генерации страницы.
Натягиваем шаблон — логика разбивки шаблона
Не нужно дробить шаблон на сотни чанков, как многие рекомендуют, это создает нагрузки. Выносите только те элементы верстки, которые в последующем могут поменяться.
Обычно весь внешний вид сайта строится на одном дизайне, т.е. шапка, меню, подвал сайта на всех страницах одинаковые (сквозные), меняется внутренне наполнение, самый идеальный вариант разбития на мой взгляд следующий.
Выносим весь код шаблона (у на пока только один шаблон базовый, смотрите урок Перенос HTML шаблона в MODX Revo) в отдельный чанк tpl и вызываем чанк tpl в самом шаблоне [[$tpl]]
или {include 'tpl'}
.
Если сейчас перейти на главную страницу — у нас не чего не поменялось — она также открывается с перенесенным html дизайном.
Что делать если вы вывели при помощи fenom и видите белую страницу с вызовом.
Причин этому может быть несколько:
- Вы не включили fenom (настройки должны быть такими).
- Конфликт с фигурными скобками, что конфликтует можно увидеть в журнале ошибок:
Ищем в коде ошибку (или фигурную скобку) и ставим перед ней и после нее пробелы.
Если проблема не решена идете в журнал, обновляете его, видите новые ошибки и правим, и так пока не заработает.
Далее открываем чанк tpl и вырезаем из него весь контент который меняется (обычно это все кроме шапки и подвала):
Далее создаем чанк tpl.1 и вставляем в него вырезанный код, а на месте вырезанного кода вставляем вот такую конструкцию [[$tpl.[[*template]]]]
или тоже самое на fenom: {include ('tpl.' ~ $_modx->resource.template)}
.
После этого сохраняем и переходим на главную страницу — она должна точно также загружаться, как и до разбивки на чанки.
Для чего все это?
Тэг «template» выводит id примененного шаблона, а выше приведенная конструкция обращается к соответственному чанку и выводит его. Так мы в дальнейшем сэкономим кучу времени при внесении изменений в верстку сайта.
В дальнейшем мы будем создавать дополнительные шаблоны (для типовых страниц, для статей, для портфолио и т.д.), вызывать во всех будем чанк tpl — там у нас шапка, подвал и другие элементы которые присутствуют на всех остальных страницах. У каждого нового шаблона будет свой id, следовательно, мы будем создавать дополнительные чанки tpl.2, tpl.3, …, tpl.7 и уже в них вносить недостающий контент. Забегая вперед, у нас получится примерно такая структура.
В следующем уроке изучим сниппеты.
Время на прочтение
6 мин
Количество просмотров 89K
После того как один мой знакомый спросил у меня про то, что за телевизоры используются в шаблонах, я решил отложить все дела на вечер и написать эту статью.
Речь пойдёт о том из чего состоит MODx, как его лучше «готовить», «подавать» и «употреблять».
Рассчитана она в первую очередь на новичков т.к. содержит базовый минимум того, что нужно знать любому modxоводу, ну и конечно на тех кому просто интересно.
Статья ориентирована в основном на Revolution и отражает основные отличия в синтаксисе её от предшественницы, но для обратной совместимости буду вставлять иногда аналогии с Evolution.
Ресурсы (Resources)
Зачастую ресурс представляет собой страницу сайта. Кроме того существуют другие типы ресурсов, такие как, ссылки, сами файлы, и т.д. По умолчанию тип нового ресурса — документ, точнее представление одной страницы вашего сайта.
Существует 4 вида ресурсов:
- Документ — самый распространённый ресурс, по сути веб-страница сайта. В основной массе состоит из заголовка, аннотации, подробного текста, различных дат, мета-тегов и дополнительных полей (TV-параметров);
- Web-ссылка — ссылка на внешний ресурс или веб-страницу;
- Символическая ссылка — внутренняя ссылка на другой ресурс;
- Статический ресурс — файл.
Каждый ресурс также имеет уникальный идентификатор, или «Resource Identifier». Если требуется связать два ресурса, то для этого следует использовать ID. Таким образом, MODx сгенерирует ссылку, и вам не придется беспокоиться об изменении адреса страницы или типы адресации.
Так же каждому ресурсу можно назначить шаблон, шаблон может определять дополнительные поля этого ресурса.
Ресурсы могут выступать в роли контейнеров и содержать в себе другие ресурсы. Так образуется структура сайта.
Шаблоны (Templates)
Шаблон — это базовая сущность определяющая отображение страницы в MODx. Шаблоны обычно содержат HTML-теги разметки, которые определяют расположение и внешний вид вашего сайта. Когда страница сайта запрошена, MODx загружает документ или ресурс и его шаблон, затем MODx находит все дополнительные поля в шаблоне и заменяет их соответствующими значениями из документа перед отправкой страницы в браузер пользователя.
Шаблон может быть назначен любому ресурсу и определяет по сути веб-страницу в которой будет выведено содержимое этого ресурса.
Шаблон не может быть включён в другой шаблон как часть.
Пример шаблона:
- <html>
- <head>
- <title>[[*pagetitle]]</title>
- <meta name="description" content="[[*description]]"/>
- </head>
- <body>
- <h1>[[*longtitle]]</h1>
- ID страницы: [[*id]]<br/>
- Анонс: [[*introtext]]<br/>
- Заголовок в меню: [[*menutitle]]
- <hr/>
- [[*content]]
- </body>
- </html>
Параметры
Используются для вывода значений полей ресурса.
Вызов осуществляется так:
Evolution | Revolution |
[*field*] | [[*field]] |
Полный список полей можно посмотреть в документации здесь.
TV параметры
Телевизор
Дополнительное поле или переменная шаблона (TV) — это настраиваемое поле, или, точнее это настраиваемое поле для ресурсов MODx. TV-параметры используются для расширения стандартных полей ресурса. Каждый ресурс в MODx имеет определенное количество полей по умолчанию см. выше в разделе про ресурсы.
Если встаёт задача добавить некоторые дополнительные поля на страницу, например, выпадающий список названий месяцев или дополнительное изображение, или любой другой тип пользовательских данных, это можно сделать добавив TV-параметр соответствующего типа. MODx позволяет иметь практически неограниченное количество TV-параметров.
TV-тег заменяется соответствующим значением заполненным пользователем при обработке ресурса. Так же каждый такой параметр привязан к какому либо шаблону и может использоваться лишь в совокупности с ним.
Вызов осуществляется так:
Evolution | Revolution |
[*tv*] | [[*tv]] |
TV параметры можно использовать как чанки добавляя им параметры. Например если есть TV-параметр ‘intromsg’ со значением:
- Привет [[+name]], у тебя [[+messageCount]] непрочитанных.
Тогда можно заполнить его данными при вызове:
- [[*intromsg?name=`Гриша` &messageCount=`123`]]
Результат:
- Привет Гриша, у тебя 123 непрочитанных сообщений.
Так же можно применять фильтры при выводе например так можно ограничить длину выводимой строки до 100 символов:
- [[*bioMessage:limit=`100`]]
Полный список фильтров можно посмотреть тут. Кроме того фильтры можно применять к чанкам и сниппетам.
Комментарии
- [[# В шаблоне допускается оставлять комментарии, этот код который будет удалён из страницы после её рендеринга. ]]
Чанки (Chunks)
Чанк — кусок статического текста который можно встроить в шаблон, в другой чанк, либо вызвать в снипете. Чанк обладает теми же свойствами что и шаблон за исключением того, что не содержит TV-параметров и не может быть назначен ресурсу напрямую.
Чанк не может содержать какой-либо исполняемый код, но в нём можно вызывать сниппеты для вывода динамического контента.
Вызов чанка осуществляется так:
Evolution | Revolution |
{{chunk}} | [[$chunk]] |
В чанк можно передавать параметры. К примеру мы создадим чанк с таким содержанием:
- Привет, [[+name]]. У тебя [[+messageCount]] непрочитанных сообщений.
Такой чанк можно вызвать с параметрами, которые в последствии передадутся внутрь его:
- [[$intro? &name=`Василий` &messageCount=`12`]]
Данный код выведет:
- Привет, Василий. У тебя 12 непрочитанных сообщений.
Кроме статических данных в вызов чанка можно помещать дополнительные и общие параметры ресурсов, например так:
- [[!$intro? &name=`[[*usersName]]` &messageCount=`[[*messageCount]]`]]
Сниппеты (Snippets)
Сниппет — PHP код который исполняется во время обработки шаблона MODx. Результат работы его может быть расположен либо на месте его вывода, либо в плейсхолдерах, специальных тегах определяющими куда поместить те или иные результаты.
Вызов сниппета осуществляется так:
Evolution | Revolution |
[[snippet]] | [[snippet]] |
Размещение плейсхолдера:
Evolution | Revolution |
[+placeholder+] | [[+placeholder]] |
Как и чанки в сниппеты можно передавать параметры, например так:
- [[!Wayfinder? &startId=`0` &level=`1`]]
Передаваемые параметры можно группировать в так называемые параметры по умолчанию (Property Sets), которые представляют собой динамическую группу параметров, которая может передана в сниппет по средствам указания названия группы.
Параметры по умолчанию задаются в панели администрирования на вкладке «Параметры» у сниппета. Параметры по умолчанию можно также создавать и для чанков.
К примеру создадим группу ‘Menu’ с параметрами `startId`=0 и `level`=1, затем вызов сниппета таким образом:
- [[!Wayfinder@Menu]]
Будет аналогичен, т.к. параметры подставятся автоматически:
- [[!Wayfinder &startId=`0` &level=`1`]]
Любой параметр по умолчанию можно переписать. В следующем примере значение параметра `level`, равного единице, будет заменено на 2.
- [[!Wayfinder@Menu? &level=`2`]]
Чтобы указать системе не кешировать сниппет требуется добавить восклицательный знак перед именем:
- [[!noCacheSnippet]]
Синтаксис тегов
Каждый тег MODx Revolution может содержать в себе другие теги MODx. Для того что бы код был более менее читаем разрешено размещать код тега на нескольких строках придерживаясь такого общего формата (в скобках мои комментарии, которые писать не надо =)):
- [[ (открывающий тег)
- ! (необязательный, символ запрета кеширования)
- elementToken (необязательный, символ определяющий тип параметра, если это не сниппет, $=чанк, *=обычное/дополнительное поле ресурса, +=плейсхолдер, и т.д.)
- elementName (название элемента)
- @propertyset (необязательный, PropertySet идентификатор)
- :filterName=`modifier`:... (не обязательные фильтры, один или более)
- ? (необязательный, определяет начало строки с параметрами)
- &propertyName=`propertyValue` &... (необязательные любые параметры разделённые &)
- ]] (закрывающий тег)
Сводная табличка синтаксиса тегов MODx
Элемент | Evolution | Revolution | Пример |
Параметр TV | [*templatevar*] | [[*templatevar]] | [[*pagetitle]] |
Чанк | {{chunk}} | [[$chunk]] | [[$header]] |
Сниппет (кусок php кода) | [[snippet]] | [[snippet]] или [[!snippet]] | [[getResources]] |
Плейсхолдер | [+placeholder+] | [[+placeholder]] | [[+modx.user.id]] |
Ссылка на ресурс | [~link~] | [[~link]] | [[~13]] |
Системные настройки | [(system_setting)] | [[++system_setting]] | [[++site_start]] |
Ресурсы
- MODx Россия
- Официальный сайт
- Документация
- Неофициальное русскоязычное сообщество 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();
На этом остановлюсь, вопросы пожелания через комментарии.
Дата публикации:
13
Июня
2018