Как подружить MODX и Smarty шаблоны в ZoomX

Статья неактуальна, в 3.4.2 автор поправил кэширование, теперь можно использовать статический шаблон и включать в него smarty-шаблон через include.

Сразу скажу, что с фреймворками не работал, поэтому возможно есть более оптимальное решение. Если знаете — напишите)

Сначала решил использовать статические элементы — в 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 за отличный компонент и за поддержку в телеграм-канале)
Лёша
17 марта 2022, 01:48
modx.pro
360
+1

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

Sem
Sem
17 марта 2022, 09:04
0
Что-то Вы точно делаете не так. Указывать шаблон в описании шаблона — так себе идея, но оригинальная)
А что мешало просто в контенте шаблона в админке указать

У меня 2 сайта в продакшене на ZoomX работают, никаких проблем с шаблонами и вызовами сниппетов.
    Лёша
    17 марта 2022, 09:59
    0
    А кэширование работает? У меня сейчас [^q^] при повторной загрузки страницы 2, с обычными шаблонами где-то 40 было.
      Sem
      Sem
      17 марта 2022, 10:12
      0
      В ZoomX своя система компиляции и кэширования шаблонов, если в настройках компонента всё разрешено кэшировать, то да кэширование работает, скомпилированные куски лежат по пути /core/cache/zoomx/smarty/compile и рядом кэш.
      Сомневаюсь что конструкция ^q^ корректно может работать с ZoomX
        Лёша
        18 марта 2022, 17:56
        0
        В ZoomX своя система компиляции и кэширования шаблонов, если в настройках компонента всё разрешено кэшировать, то да кэширование работает
        Прописал в шаблоне (обычном):
        {nocache}
            {time()}
        {/nocache}
        
        {time()}
        При обновлении страницы выводится одно и то же значение.
        Прописал {include 'base.tpl'} в шаблоне и код выше в файл. То же самое.
        Вернул как было (как написано в заметке), меняется только значение в nocache.
        То есть кэширование в обычных шаблонах не работает. Может у меня с настройками что-то, конечно. Но настройки ZoomX, связанные с кэшированием, не менял.
        file.modx.pro/files/0/1/f/01f4ccc10fc2ff6c16456ef4666549b5.png
          Sem
          Sem
          18 марта 2022, 19:19
          0
          Да, проверил, с кэшем в последней версии, действительно есть проблема, написал Сергею (автору компонента), он сказал посмотрит.
    Sem
    Sem
    17 марта 2022, 09:29
    0
    Проверил также вариант со статическим элементом — всё работает корректно, никаких двойных вызовов!
      Лёша
      17 марта 2022, 12:10
      0
      Ну и ещё плюс такого решения — при изменении файла шаблона через IDE не нужно очищать кэш, изменения появляются сразу после перезагрузки страницы.
        Лёша
        18 марта 2022, 23:49
        0
        Проверил также вариант со статическим элементом — всё работает корректно, никаких двойных вызовов!
        Перепроверил сейчас, если в шаблоне сниппет вызвать, то вызывается один раз. А если в .tpl файле, то несколько.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        8