Адаптируем сниппеты для инлайн-чанков
Иногда в сообществе проскакивают вопросы — почему в том или ином сниппете не работают инлайн чанки. Их, как правило, задают неопытные модыксеры, начавшие осваивать MODX с установленной библиотекой pdoTools, в которой уже есть все необходимые инструменты для работы с контентом — pdoResource, pdoMenu, pdoUsers, pdoSitemap, pdoCrumbs и т.д. И одна из удобных фич всех этих сниппетов — это возможность указать инлайн чанк в качестве шаблона. Т.е. не нужно создавать чанк, а сразу указать строку с HTML кодом. Это значительно упрощает разработку. Особенно для сложных компонентов, в которых нужно указывать несколько шаблонов. Например, для вывода меню.
Для информации!
Изначально, возможность указывать inline и файловые чанки была реализована Джейсоном Ковардом (aka opengeek) в его getResources. Но эту классную фичу мало кто из разработчиков дополнений подхватил. А Василий (автор pdoTools) включил её в свои сниппеты. И она оказалась очень востребованной.
Так вот, разработчики, начавшие свое знакомство с MODX и установленным pdoTools, не понимают, почему в сниппетах других компонентов инлайн чанки не работают. Эти разработчики уверены, что это нативная возможность MODX. Но правда в том, что её определяет автор дополнения. Именно он должен научить сниппет обрабатывать параметры с инлайн чанками. А практически все дополнения в официальном репозитории и в рунете не используют такой подход. Но это можно легко исправить. Всё что нужно — это создать сниппет-обёртку, который обработает параметры с инлайн чанками и передаст их в нужный сниппет.
Давайте представим, что у вас есть сниппет, который принимает 3 параметра с шаблонами, в которых указываются чанки для первого элемента, последнего и остальных:
[[!UsualSnippet? &tplFirst=`chunk1` &tpl=`chunk2` &tplLast=`chunk3` ... ]]
Неважно, что внутри этого сниппета. Мы не должны в него лазить и трогать код. Мы лишь сделаем для него обёртку.
Давайте создадим сниппет с таким же назнанием, но добавим суффикс «Inline». Это сохранит семантику.
<?php # UsualSnippetInline // Функция обрабатывает параметры с инлайн чанками. НЕ ТРОГАТЬ. function prepareInlineChunk(&$value) { global $modx; if (!empty($value) && strpos($value, '@INLINE') === 0) { $tpl = substr($value, 8); $value = md5($tpl); $chunk = $modx->newObject('modChunk', array('name' => $value)); $chunk->setContent($tpl); $modx->sourceCache['modChunk'][$value] = array('fields' => $chunk->toArray(), 'policies' => array()); } } // Цикл по параметрам с инлайн-чанками. УКАЖИТЕ СВОИ ПАРАМЕТРЫ. foreach(['tplFirst','tpl','tplLast'] as $param) { prepareInlineChunk($scriptProperties[$param]); } // Вызов обёртываемого сниппета. УКАЖИТЕ НАЗВАНИЕ СНИППЕТА. return $modx->runSnippet('UsualSnippet', $scriptProperties);
Теперь спокойно вызываем нашу обёртку с инлайн-чанками:
[[!UsualSnippetInline? &tplFirst=`@INLINE <div class="first">[[+item]]</div>` &tpl=`@INLINE <div>[[+item]]</div>` &tplLast=`@INLINE <div class="last">[[+item]]</div>` ... ]]
В параметрах можно указывать как имя чанка (как обычно), так и HTML код, добавив перед ним ключевое слово @INLINE
.
Совет!
Если вы используете drag-n-drop или tagElementPlugin для формирования параметров сниппета, то работайте с изначальным сниппетом. А когда сформируете параметры, просто добавьте к имени сниппета суффикс «Inline».
Кстати, кроме удобства инлайн чанки добавляют и элемент оптимизации, так как позволяют исключить лишние запросы к базе данных.
П.С. Можно сделать один универсальный сниппет, добавив всего пару параметров:
[[!UniversalInlineWrapper? &inlineParams=`tpl,tplFirst,tplLast` //Перечень параметров с инлайн-чанками &snippet=`UsualSnippet` // Обёртываемый сниппет &tplFirst=`@INLINE <div class="first">[[+item]]</div>` &tpl=`@INLINE <div>[[+item]]</div>` &tplLast=`@INLINE <div class="last">[[+item]]</div>` ... ]]
И соответственно добавить их обработку в сниппете.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()