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

Composer всегда под рукой. Поставил, подключил, чуть подкрутил и он готов к бою. Всё замечательно работает. Расширяется достаточно легко. Документация понятная. Тестировал я, конечно, не на боевом сервере, а на тестовом. Поэтому сравнить его скорость с феномом не могу. Но по ощущениям вроде не медленней. Да, у него немного другой синтаксис. Но это дело привычки. В общем Twig мне понравился. И пропали ошибки с одинарной скобкой. Я, конечно, не всё прогнал. Возможно найдутся какие-то косяки. Но я хотел рассказать не об этом.

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

Размяться решил с простого — научить парсер понимать параметры элементов, указанные через синтаксис массива. Т.е. уйти от синтаксиса URL и перейти к более привычному:

[[snippet? [
        'prop' => 'value',
        'prop2' => 100
    ]
]]

Дальше захотелось добавить нормальные управляющие конструкции типа if, foreach, while и т.п. А вот это уже сложная задача. Все теги MODX линейные (одноуровневые). А такие конструкции подразумевают блоковый синтаксис. Поэтому пришлось чесать затылок, чтобы заработало

[[@if ($modx->user->id == 1)]]
...
[[@else]]
...
[[@endif]]

Данная конструкция позволяет уйти от известной проблемы парсинга тегов в условии, даже если оно не выполняется.

А потом решил разрешить php скрипты

[[(echo 'Сообщение')]]

Тут, конечно, возникает вопрос безопасности. Но это можно легко решить через права и специальную системную настройку.

В итоге, пока экспериментировал, сама собой вышла возможность указывать php код в шаблоне

<h1><?php echo $modx->resource->pagetitle;?></h1>
<div>...</div>

Ещё из минусов (как я считаю) — фильтры-сниппеты. Гораздо удобнее с точки зрения оптимизации делать фильтры-функции, как это сделано в Fenom и Twig. Я это делать не стал. В принципе реализация понятна. А вот до наследования шаблонов я не добрался. Надоело.

Заключение

Вот такой вышел блин. Что я хотел сказать своим экспериментом. Авторы MODX могли бы дать второй шанс встроенному шаблонизатору и упростить жизнь разработчикам. Потому что 2 шаблонизатора — это, мягко говоря, костылеобразное решение. Например, если рассматривать Fenom, то кроме путаницы со скобками — "[[" и "{", есть ещё ряд правил:

  • Не забыть поставить пробел после скобки "{" для стилей и яваскрипта.
  • Теги Fenom отрабатывают раньше тегов MODX.
  • Для кэшированных тегов MODX теги Fenom указывать бессмысленно. Они просто не обработаются.

Многие о них не знают. И вообще неплохо понимать, что у шаблонизатора MODX и Fenom/Twig/Smarty разные принципы работы. Первый парсит контент несколько раз, минимум 3 (см. статью "{Fenom} Почему не работает тег ignore"). Поэтому непонятный тег на первом цикле может быть распарсен на последующих, когда добавится соответствующий плейсхолдер. Другие шаблонизаторы так не могут. У них вообще предусмотрена только одна точка входа — берётся контент, что-то экстендится, инклюдится, игнорится, парсится и выводится готовый результат. Так работают фреймворки. А в MODX не так. Он этот готовый результат опять прогоняет через парсер — а вдруг вернулся новый тег. И так несколько раз до тех пор, пока не кончатся теги (количество циклов можно ограничить через системную настройку parser_max_iterations). Именно поэтому не работает тег ignore. Кстати, в админке (а в ней работает Smarty) такой проблемы нет — там контент парсится только один раз, как во фреймворках.

Сложновато звучит. Большинству разработчиков это и не нужно знать для работы. Но на корочку можно записать. В дальнейшем, если вдруг возникнет вопрос, можно вернуться и перечитать.

На этом всё. Спасибо за внимание тем, кто осилил :)

0   3627

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.