Николай Ланец
12 сент. 2016 г., 17:28

Простой плагин добавить шаблонизатору Smarty еще один шаблон в начало

Материал для тех, что внимательно читал вот эту статью и для тех, кто освоил переопределяющие шаблоны.
В настройках modxSmarty имеется две переменных — modxSmarty.template и modxSmarty.pre_template, что позволяет иметь основной шаблон и переопределяющий его. А что делать, если нужно добавить еще один или более шаблонов? Это может быть, к примеру, персональное оформление для авторизованного пользователя, или мобильная версия сайта, или очередная версия скина (v1, v2, v3..., чтобы в новой версии только измененные файлы дописывать, а не вообще все копировать). Лично у меня здесь задача другая — добавить подключаемый скин элемента в новом компоненте, чтобы сразу шаблоны компонента подключались в систему, но чтобы эти шаблоны можно было переопределять в своем боевом шаблоне сайта.
Вот такой вот плагин у меня получился:
if($modx->context->key == 'mgr'){ return; } switch($modx->event->name){ case "OnHandleRequest": if(!empty($modx->smarty)){ $modx->smarty->addTemplateDir(MODX_CORE_PATH . "components/crosslinks/templates/default", "crosslinks"); } break; }
Если вывести подключенные шаблоны, получается вот такая картина:
print_r($modx->smarty->template_dir);
Array ( [prepend] => /site/core/components/modxsite/templates/pre_template/ [main] => /site/core/components/modxsite/templates/shopmodx/ [crosslinks] => /site/core/components/crosslinks/templates/default/ )
Таким образом подключенный шаблон у нас вызывается в самую последнюю очередь и может быть переопределен в любом предыдущем шаблоне.
А вот если вам надо шаблон вставить в самое начало списка (чтобы наоборот он переопределял все остальные шаблоны), тут чуть сложнее:
switch($modx->event->name){ case "OnHandleRequest": if(!empty($modx->smarty)){ $dirs = $modx->smarty->getTemplateDir(); $dirs = array_merge(array( "crosslinks" => MODX_CORE_PATH . "components/crosslinks/templates/default", ), $dirs); $modx->smarty->setTemplateDir($dirs); } break; }
В таком случае очередность будет другая.
Array ( [crosslinks] => /site/core/components/crosslinks/templates/default/ [prepend] => /site/core/components/modxsite/templates/pre_template/ [main] => /site/core/components/modxsite/templates/shopmodx/ )
Здесь шаблон crosslinks идет в самом начале и его переопределить уже нельзя. Зато им можно переопределить другие шаблоны.
Важно отметить, что алиасы шаблонов можно использовать для целевого расширения. К примеру, так:
{extends "[crosslinks]inc/editor/crosslinks/element.tpl"}
Хотя у меня и есть версии скинов, до необходимости искать решение для их быстрого переопределения начал доходить только сейчас :) Поэтому данное решение однозначно беру на заметку
Я давно подобное реализовывал на одном проекте, но вот сейчас опять коснулось, и пришлось ресерчинг с нуля опять делать. Решил сразу заметку зафиксировать)
Николай, я жду от вас обратной связи. Уже не знаю, куда писать.
аналогичным образом жду обратной связи по моему проекту, сроки просрочены, есть проблемы и большие!

Добавить комментарий