Иногда в сообществе проскакивают вопросы — почему в том или ином сниппете не работают инлайн чанки. Их, как правило, задают неопытные модыксеры, начавшие осваивать 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>`
    ...
]]

И соответственно добавить их обработку в сниппете.

14 января 2018, 09:41   358     0

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

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

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.