Как подружить MODX и Smarty шаблоны в ZoomX
Статья неактуальна, в 3.4.2 автор поправил кэширование, теперь можно использовать статический шаблон и включать в него smarty-шаблон через include.
Сразу скажу, что с фреймворками не работал, поэтому возможно есть более оптимальное решение. Если знаете — напишите)
Сначала решил использовать статические элементы — в MODX-шаблоне прописывал путь до Smarty-шаблона. Но потом обнаружил, что в таких шаблонах сниппеты запускаются несколько раз. Из сниппета вывел в журнал ошибок $modx->resource — первый раз загружается нужный ресурс, а потом 2 раза загружается ресурс «страница не найдена». Причину так и не понял. Ещё обнаружил, что если у ресурса нет роута, то кэш Smarty не работает. Поэтому придумал такой костыль.
В core/config/routes.php добавляем:
Чтобы он работал, создаём плагин, при событии OnPageNotFound вызываем:
Думаю, что решение относительно редиректа на 404 не совсем корректное, но другого не придумал.
Проверка на assets/ нужна чтобы код не срабатывал на ненайденные файлы.
Теперь в MODX-шаблонах в поле «описание» прописываем имя файла Smarty-шаблона (например product.tpl). Для шаблона главной страницы это необязательно, так как в роуте мы уже прописали home.tpl.
Спасибо автору ZoomX за отличный компонент и за поддержку в телеграм-канале)
Сразу скажу, что с фреймворками не работал, поэтому возможно есть более оптимальное решение. Если знаете — напишите)
Сначала решил использовать статические элементы — в MODX-шаблоне прописывал путь до Smarty-шаблона. Но потом обнаружил, что в таких шаблонах сниппеты запускаются несколько раз. Из сниппета вывел в журнал ошибок $modx->resource — первый раз загружается нужный ресурс, а потом 2 раза загружается ресурс «страница не найдена». Причину так и не понял. Ещё обнаружил, что если у ресурса нет роута, то кэш Smarty не работает. Поэтому придумал такой костыль.
В core/config/routes.php добавляем:
$router->get('/', function() use ($modx) {
return viewx("home.tpl");
});
if (stripos($_SERVER['REQUEST_URI'], 'assets/') === false) {
$router->get('{alias}', function($alias) use ($modx) {
$modx->resource = zoomx()->getResource($alias);
if ($modx->resource) {
$query = $modx->newQuery('modTemplate', $modx->resource->template);
$query->select('description');
$tpl = $modx->getValue($query->prepare());
return $tpl ? viewx($tpl) : "Пропишите имя tpl файла в поле «описание» шаблона {$modx->resource->template}";
}
});
}
Если ресурс не найден, можно перенаправить на страницу 404, Но в таком случае перестаёт работать компонент Redirector. Чтобы он работал, создаём плагин, при событии OnPageNotFound вызываем:
if (stripos($_SERVER['REQUEST_URI'], 'assets/') === false) {
$modx->sendRedirect('404');
}
Событию выставляем приоритет, например 999, чтобы оно срабатывало после плагина Redirector.Думаю, что решение относительно редиректа на 404 не совсем корректное, но другого не придумал.
Проверка на assets/ нужна чтобы код не срабатывал на ненайденные файлы.
Теперь в MODX-шаблонах в поле «описание» прописываем имя файла Smarty-шаблона (например product.tpl). Для шаблона главной страницы это необязательно, так как в роуте мы уже прописали home.tpl.
Спасибо автору ZoomX за отличный компонент и за поддержку в телеграм-канале)
Комментарии: 8
А кэширование работает? У меня сейчас [^q^] при повторной загрузки страницы 2, с обычными шаблонами где-то 40 было.
В ZoomX своя система компиляции и кэширования шаблонов, если в настройках компонента всё разрешено кэшировать, то да кэширование работает, скомпилированные куски лежат по пути /core/cache/zoomx/smarty/compile и рядом кэш.
Сомневаюсь что конструкция ^q^ корректно может работать с ZoomX
Сомневаюсь что конструкция ^q^ корректно может работать с ZoomX
В ZoomX своя система компиляции и кэширования шаблонов, если в настройках компонента всё разрешено кэшировать, то да кэширование работаетПрописал в шаблоне (обычном):
{nocache}
{time()}
{/nocache}
{time()}
При обновлении страницы выводится одно и то же значение.Прописал {include 'base.tpl'} в шаблоне и код выше в файл. То же самое.
Вернул как было (как написано в заметке), меняется только значение в nocache.
То есть кэширование в обычных шаблонах не работает. Может у меня с настройками что-то, конечно. Но настройки ZoomX, связанные с кэшированием, не менял.
file.modx.pro/files/0/1/f/01f4ccc10fc2ff6c16456ef4666549b5.png
Да, проверил, с кэшем в последней версии, действительно есть проблема, написал Сергею (автору компонента), он сказал посмотрит.
Ну и ещё плюс такого решения — при изменении файла шаблона через IDE не нужно очищать кэш, изменения появляются сразу после перезагрузки страницы.
Проверил также вариант со статическим элементом — всё работает корректно, никаких двойных вызовов!Перепроверил сейчас, если в шаблоне сниппет вызвать, то вызывается один раз. А если в .tpl файле, то несколько.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.