MODX чанки (chunks)

MODX чанки (chunks) MODX Revo

В прошлых уроках мы разобрали различный синтаксис модх парсера и fenom, а также перенесли HTML шаблон в MODX Revo  (там можно скачать шаблон на основе которого пойдут дальнейшие уроки). Сейчас код шаблона статичный и чтобы что то поправить нужно править код — начнем это исправлять. В данном уроке разобьем код на отдельные части — MODX чанки, чтобы в будущем с кодом шаблона было проще работать.

Что такое

MODX чанки – это контейнеры для HTML/CSS/JS-кода (нельзя добавлять php-скрипты, вернее можно но они будут игнорироватся, для этого есть сниппеты). В чанке можно вызывать другие чанки, tv и сниппеты (можно вкладывать другие элементы).

Где хранятся

Чанки, хранятся в БД, в таблице modx_site_htmlsnippets (где modx_ — это префикс таблиц, который задан во время установки движка).

Как создать

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

Переходим во вкладку «Элементы» и кликаем:

  1. На иконку «Новый чанк».
  2. На плюс напротив пункта «Чанки».создание чанка в MODx Revolution
  3. ПКМ кликаем по пункту Чанки и выбираем «Создать» либо «Быстро создать».
  4. Воспользоваться пакетом 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 и видите белую страницу с вызовом.

белую страницу с вызовом

Причин этому может быть несколько:

  1. Вы не включили fenom (настройки должны быть такими).
    настройки pdotools
  2. Конфликт с фигурными скобками, что конфликтует можно увидеть в журнале ошибок:
    журнал ошибок

Ищем в коде ошибку (или фигурную скобку) и ставим перед ней и после нее пробелы.

Пример правки ошибки

Если проблема не решена идете в журнал, обновляете его, видите новые ошибки и правим, и так пока не заработает.

Обновление журнала

Далее открываем чанк tpl и вырезаем из него весь контент который меняется (обычно это все кроме шапки и подвала), после чего создаем чанк tpl.1 и вставляем в него вырезанный код, а на месте вырезанного кода вставляем вот такую конструкцию [[$tpl.[[*template]]]] или тоже самое на fenom: {include ('tpl.' ~ $_modx->resource.template)}.

Вставляем конструкцию подтягивающую чанки по id шаблонов

После этого сохраняем и переходим на главную страницу — она должна точно также загружаться, как и до разбивки на чанки.

Для чего все это?

Тэг «template» выводит id примененного шаблона, а выше приведенная конструкция обращается к соответственному чанку и выводит его. Так мы в дальнейшем сэкономим кучу времени при внесении изменений в верстку сайта.

В дальнейшем мы будем создавать дополнительные шаблоны (для типовых страниц, для статей, для портфолио и т.д.), вызывать во всех будем чанк tpl — там у нас шапка, подвал и другие элементы которые присутствуют на всех остальных страницах. У каждого нового шаблона будет свой id, следовательно, мы будем создавать дополнительные чанки tpl.2, tpl.3, …, tpl.7 и уже в них вносить недостающий контент. Забегая вперед, у нас получится примерно такая структура.

схема для создания чанков

Если выбрали феном, то пожалуй лучше разбивать немного по другому. Переименовываем начальный шаблон в base и помещаем в него все из чанка tpl. А на месте вызова {include ('tpl.' ~ $_modx->resource.template)}, пишем {block 'content'}  {/block}

Базовый шаблон

Дольше создаем новый шаблон home и вставляем туда вот такую конструкцию:

{extends 'template:base'}

{block 'content'}

здесь код из чанка tpl.1

{/block}

Шаблон home

После этого меняем шаблон главной страницы на home и сохраняем ее, смотрим главную все также должно работать! Получается мы вообще от чанков избавились — они потом появятся по ходу дела). Это раздел расширение шаблонов из статьи про fenom. К стати, если хотите работать через IDE (например phpstorm), есть возможность хранить чанки, шаблоны, сниппеты файловыми элементами.

В следующем уроке изучим сниппеты.

Поделиться с друзьями
Алексей

Веб-дизайнер и SEO оптимизатор. Занимаюсь созданием сайтов с 2010 года и их продвижение с 2012 года!

Оцените автора
( 1 оценка, среднее 5 из 5 )
Web-Revenue.ru
Добавить комментарий

  1. Аноним

    Это всё заебись! Но это всё примитивные вопросы. А вот вопрос на засыпку:
    1. существуют chunk-и c параметрами в виде списка;
    2. в этих списках есть опции параметра chunk-а.
    КАК ИХ ИСПОЛЬЗОВАТЬ, эти сраные опции параметра? Как до них дотянуться? Я не сумел, хотя очень надо.

    Ответить
    1. Голягин Алексей

      Вызов пришлите)

      Ответить