[FAQ] Делаем сниппет-обёртку
Данное руководство предназначено в первую очередь для разработчиков, только начинающих знакомиться с MODX. При разработке сайта они как правило используют уже готовые решения. И часто так случается, что такое решение нужно подогнать под текущую задачу. Самая первая мысль, которая приходит им в голову — изменить тот или иной сниппет. Ведь именно сниппеты отвечают за логику работы. Ну ещё плагины, но новички обычно в них не лезут.
Совсем зелёный разработчик лезет в исходный сниппет и творит там своё колдовство. И безумно довольный выкатывает своё творение заказчику, раздуваясь от своего величия.
Но более осторожный юнец сначала зайдет в сообщество, чтобы поинтересоваться, нет ли такого же решения, но с перламутровыми пуговицами. И случайным образом узнаёт, что править исходный код ни в коем случае нельзя, потому что следующее обновление затрёт все изменения, и что есть достаточно простой способ решить задачу кастомизации. Это сниппет-обёртка.
Звучит немного непонятно, но по факту всё проще простого. Это самый легкий способ расширить функциональность исходного сниппета даже не влезая в него. Например, Вам нужно вывести список ресурсов или меню и для этого есть готовые сниппеты из библиотеки pdoTools. Но есть необходимость добавить определённый функционал перед выводом — добавить новые параметры или плейсхолдеры. А раз исходный сниппет — это своеобразный черный ящик, то как же эту задачу реализовать?
Да очень просто. Нужно всего лишь создать новый сниппет и в нём заложить необходимую логику, а потом передать управление исходному сниппету. Выглядеть это будет так
Вот таким простым образом можно кастомизировать любые сниппеты. И при обновлении компонента ничего не пропадёт. Немного похоже на расширение классов. Но более полное сходство с шаблоном «Декоратор». Хотя это уже другая история.
Надеюсь, стало понятнее, что скрывается за этой странной фразой «сниппет-обёртка». )
Совсем зелёный разработчик лезет в исходный сниппет и творит там своё колдовство. И безумно довольный выкатывает своё творение заказчику, раздуваясь от своего величия.
Но более осторожный юнец сначала зайдет в сообщество, чтобы поинтересоваться, нет ли такого же решения, но с перламутровыми пуговицами. И случайным образом узнаёт, что править исходный код ни в коем случае нельзя, потому что следующее обновление затрёт все изменения, и что есть достаточно простой способ решить задачу кастомизации. Это сниппет-обёртка.
Звучит немного непонятно, но по факту всё проще простого. Это самый легкий способ расширить функциональность исходного сниппета даже не влезая в него. Например, Вам нужно вывести список ресурсов или меню и для этого есть готовые сниппеты из библиотеки pdoTools. Но есть необходимость добавить определённый функционал перед выводом — добавить новые параметры или плейсхолдеры. А раз исходный сниппет — это своеобразный черный ящик, то как же эту задачу реализовать?
Да очень просто. Нужно всего лишь создать новый сниппет и в нём заложить необходимую логику, а потом передать управление исходному сниппету. Выглядеть это будет так
# сниппет-обёртка
// Здесь прописывается необходимая логика
// Например, обработка новых кастомных параметров или изменить какое-нибудь значение исходного сниппета
// в зависимости от условия.
// Можно затем их убрать из массива параметров.
...
// И дальше вызывается исходный сниппет и ему передаются параметры, указанные при вызове
return $modx->runSnippet('Исходный сниппет', $scriptProperties);
Дальше вы легко можете вызывать свой сниппет-обёртку и указывать у него не только свои параметры, но и параметры исходного сниппета.[[!SnippetWrapper?
&originParam1 = `Значение параметра исходного сниппета 1`
&originParam2 = `Значение параметра исходного сниппета 2`
&newParam = `Значение кастомного параметра`
]]
Вот таким простым образом можно кастомизировать любые сниппеты. И при обновлении компонента ничего не пропадёт. Немного похоже на расширение классов. Но более полное сходство с шаблоном «Декоратор». Хотя это уже другая история.
Надеюсь, стало понятнее, что скрывается за этой странной фразой «сниппет-обёртка». )
Поблагодарить автора
Отправить деньги
Комментарии: 17
В догонку на ту же тему — modx.pro/development/3168
Ну и тему + «в догонку» — сюда: Шпаргалка на все случаи жизни
Хорошая идея, когда достали с вопросами написать статью, большой + тебе Сергей. Нужно взять тоже на примету себе.
оп не дописал сообщение, взять себе на примету писать статьи когда вопросами закидают
@Сергей Шлоков рано поздравлять с возвращением?)
А мне кажется, уже пара. Смотрим статистику — крутяк) Нужны такие авторы порталу modx.pro, как не крути.
Статистика накручена! ;)
Это не так)
Вопрос наверное не в ту калитку, как в своём компоненте привернуть в сниппете Fenom и все плюхи pdoTools, чтобы по мимо стандартных модиксовских модификаторов можно было все плейсхолдеры на Fenom перевести?)
$pdoTools = $modx->getService('pdoTools');
return $pdoTools->getChunk($tpl, $properties);
вместо обычного$modx->getChunk()
Если я правильно понял вопрос, то вот ссылка на документацию
Ведь в таком случае исходный сниппет вызывается некэшированным. А как вызвать из кэша?
Исходный сниппет не играет значения. MODX работает только с вызываемым сниппетом. Если он кэшированный, то он сохраняет результат, если нет, то отрабатывает код внутри. В данном случае, кэшируется сниппет-обёртка.
Скажите а если мне нужно например, переделать несколько строчек в исходном сниппете, не добавляя свои классы и методы (мне до этого еще далеко), ну и добавить один свой параметр, разве нельзя просто сделать копию сниппета, и так же вызывать его, это тоже будет считаться сниппет — обертка?
Извиняюсь за возможно наивный вопрос
Извиняюсь за возможно наивный вопрос
Это не будет сниппет-обертка, это будет копия сниппета.
Минус в том, что когда базовый компонент будет обновляться, ваш сниппет так и останется «старым». Вы не получите нового функционала.
Однажды это вообще может привести к некорректной работе.
В общем решение-то нормальное, но нужно с ним внимательно.
Минус в том, что когда базовый компонент будет обновляться, ваш сниппет так и останется «старым». Вы не получите нового функционала.
Однажды это вообще может привести к некорректной работе.
В общем решение-то нормальное, но нужно с ним внимательно.
Понял, спасибо Алексей!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.