[FAQ] Делаем сниппет-обёртку

Данное руководство предназначено в первую очередь для разработчиков, только начинающих знакомиться с MODX. При разработке сайта они как правило используют уже готовые решения. И часто так случается, что такое решение нужно подогнать под текущую задачу. Самая первая мысль, которая приходит им в голову — изменить тот или иной сниппет. Ведь именно сниппеты отвечают за логику работы. Ну ещё плагины, но новички обычно в них не лезут.
Совсем зелёный разработчик лезет в исходный сниппет и творит там своё колдовство. И безумно довольный выкатывает своё творение заказчику, раздуваясь от своего величия.

Но более осторожный юнец сначала зайдет в сообщество, чтобы поинтересоваться, нет ли такого же решения, но с перламутровыми пуговицами. И случайным образом узнаёт, что править исходный код ни в коем случае нельзя, потому что следующее обновление затрёт все изменения, и что есть достаточно простой способ решить задачу кастомизации. Это сниппет-обёртка.




Звучит немного непонятно, но по факту всё проще простого. Это самый легкий способ расширить функциональность исходного сниппета даже не влезая в него. Например, Вам нужно вывести список ресурсов или меню и для этого есть готовые сниппеты из библиотеки pdoTools. Но есть необходимость добавить определённый функционал перед выводом — добавить новые параметры или плейсхолдеры. А раз исходный сниппет — это своеобразный черный ящик, то как же эту задачу реализовать?

Да очень просто. Нужно всего лишь создать новый сниппет и в нём заложить необходимую логику, а потом передать управление исходному сниппету. Выглядеть это будет так
# сниппет-обёртка
// Здесь прописывается необходимая логика
// Например, обработка новых кастомных параметров или изменить какое-нибудь значение исходного сниппета
// в зависимости от условия.
// Можно затем их убрать из массива параметров.
...
// И дальше вызывается исходный сниппет и ему передаются параметры, указанные при вызове
return $modx->runSnippet('Исходный сниппет', $scriptProperties);
Дальше вы легко можете вызывать свой сниппет-обёртку и указывать у него не только свои параметры, но и параметры исходного сниппета.
[[!SnippetWrapper? 
    &originParam1 = `Значение параметра исходного сниппета 1`
    &originParam2 = `Значение параметра исходного сниппета 2`
    &newParam = `Значение кастомного параметра`
]]

Вот таким простым образом можно кастомизировать любые сниппеты. И при обновлении компонента ничего не пропадёт. Немного похоже на расширение классов. Но более полное сходство с шаблоном «Декоратор». Хотя это уже другая история.

Надеюсь, стало понятнее, что скрывается за этой странной фразой «сниппет-обёртка». )
Сергей Шлоков
12 февраля 2020, 14:55
modx.pro
15
2 077
+23
Поблагодарить автора Отправить деньги

Комментарии: 17

Василий Наумкин
12 февраля 2020, 15:03
+7
В догонку на ту же тему — modx.pro/development/3168
    Алексей Шумаев
    12 февраля 2020, 15:46
    +5
    Ну и тему + «в догонку» — сюда: Шпаргалка на все случаи жизни
      Yurij Finiv
      12 февраля 2020, 20:06
      0
      Хорошая идея, когда достали с вопросами написать статью, большой + тебе Сергей. Нужно взять тоже на примету себе.
        Yurij Finiv
        13 февраля 2020, 09:54
        0
        оп не дописал сообщение, взять себе на примету писать статьи когда вопросами закидают
        Баха Волков
        12 февраля 2020, 20:26
        +1
        @Сергей Шлоков рано поздравлять с возвращением?)
        SEQUEL.ONE
        13 февраля 2020, 00:20
        0
        Вопрос наверное не в ту калитку, как в своём компоненте привернуть в сниппете Fenom и все плюхи pdoTools, чтобы по мимо стандартных модиксовских модификаторов можно было все плейсхолдеры на Fenom перевести?)
          Артем
          13 февраля 2020, 03:03
          +2
          $pdoTools = $modx->getService('pdoTools');
          return $pdoTools->getChunk($tpl, $properties);
          вместо обычного
          $modx->getChunk()
            Олег Щавелев
            13 февраля 2020, 03:04
            +1
            Если я правильно понял вопрос, то вот ссылка на документацию
            Николай Каленников
            13 февраля 2020, 12:44
            0
            Ведь в таком случае исходный сниппет вызывается некэшированным. А как вызвать из кэша?
              Сергей Шлоков
              13 февраля 2020, 17:09
              +2
              Исходный сниппет не играет значения. MODX работает только с вызываемым сниппетом. Если он кэшированный, то он сохраняет результат, если нет, то отрабатывает код внутри. В данном случае, кэшируется сниппет-обёртка.
              Nik
              Nik
              26 февраля 2020, 15:54
              0
              Скажите а если мне нужно например, переделать несколько строчек в исходном сниппете, не добавляя свои классы и методы (мне до этого еще далеко), ну и добавить один свой параметр, разве нельзя просто сделать копию сниппета, и так же вызывать его, это тоже будет считаться сниппет — обертка?
              Извиняюсь за возможно наивный вопрос
                Наумов Алексей
                26 февраля 2020, 15:57
                +1
                Это не будет сниппет-обертка, это будет копия сниппета.
                Минус в том, что когда базовый компонент будет обновляться, ваш сниппет так и останется «старым». Вы не получите нового функционала.
                Однажды это вообще может привести к некорректной работе.
                В общем решение-то нормальное, но нужно с ним внимательно.
                  Nik
                  Nik
                  26 февраля 2020, 16:14
                  0
                  Понял, спасибо Алексей!
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                17