mmxTwig - еще одна интеграция шаблонизатора

Вы будете смеяться, но я написал еще одно composer-only дополнение для MODX. Это было несложно, благодаря той же логике работы, что и у mmxFenom.



Как оказалось, Fenom уже давненько не развивается.

3я версия по факту нерабочая и последний коммит был сделан больше года назад. Конечно, 2я версия вполне ок и свои задачи выполняет, но вообще проект выглядит не очень живым.

А Twig поддерживается сообществом Symfony, так что там с этим делом полный порядок. Поэтому мне и подкинули идею, в личной группе, добавить еще один шаблонизатор — что я сегодня и сделал.

Быстрый старт


Устанавливаем вот так
composer require mmx/twig --update-no-dev --with-all-dependencies
composer exec mmx-twig install

Затем создаём сниппет Test
$tpl = $modx->getOption('tpl', $scriptProperties);
$var = $modx->getOption('var', $scriptProperties);

if ($service = $modx->services->get('mmxTwig')) {
    $service->addFilter(
        new \Twig\TwigFilter('hello', static function($var) {
            return $var . ' World!';
        }
    ));
    
    return $service->render($tpl, ['var' => $var]);
}

return '';

Потом чанк Test
{{ var | hello }}

Потом вызываем сниппет на странице
[[!Test?tpl=`test`&var=`Hello`]]

И всё работает!

Отличия от Fenom


Конечно же, здесь другой синтаксис.

Иначе вызываются переменные, по-другому работают циклы и т.д. — смотрите документацию.

Еще здесь нет способа просто взять и включить вызов произвольных PHP функций, просто нет такой возможности.

Еще, насколько я вижу по коду, для рендера не используется функция eval(). Безопасность!

Ну а так — всё то же самое:
  • 3 источника шаблонов: чанки, шаблоны MODX и файлы
  • Правильное кэширование элементов MODX, благодаря записи времени изменения в БД
  • Фильтры, циклы, расширения и т.д. и т.п.
  • Доступ к глобальным переменным (можно включить и доступ к MODX)
Пример распечатки данных сервера
{{ server | print }}

Скорость


Адаптировал тестовый код из старой заметки и погонял на modhost.pro.
<?php
define('MODX_API_MODE', true);
require 'index.php';

$service = $modx->services->get('mmxTwig'); // Тут можно поменять на mmxFenom
$tpl = 'tplTwig'; // а тут указать чанк для Fenom
// $tpl = 'file:twig.tpl'; // или реальный файл из core/elements

$output = '';
for ($i = 0; $i <= 10000; $i ++) {
	$array = array('val1' => rand(), 'val2' => rand(), 'val3' => rand());
	$output .= $service->render($tpl, $array);
}

echo microtime(true) - $modx->startTime . 's' . PHP_EOL . $output;

Код чанков простейший:
<p>{{val1}} - {{val2}} - {{val3}}</p>
<!-- или для Fenom -->
<p>{$val1} - {$val2} - {$val3}</p>

Обычный чанк из БД: Fenom 0.021, Twig 0.054
Статичный чанк: Fenom: 0.024, Twig 0.059
Реальный файл: Fenom: 0.350, Twig 0.078

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

Оба компонента тестировал на версии 1.0.2.

Заключение


Ни новый mmxFenom, ни новый mmxTwig не вмешиваются в работу системного парсера и друг друга, так что могут быть установлены одновременно для использования в разных дополнениях.

Стоит упомянуть, что 8 лет назад была еще одна интеграция — Twiggy, но дальше бета-версии она не ушла.

Лично я с Twig раньше никогда не работал, но выглядит он весьма интересно, так что попробую погонять его на каком-то реальном проекте.

Поставить плюсики и создать issues можно в репозитории — github.com/bezumkin/mmx-twig

Задать вопросы можно в комментриях, или в моём чатике — как вам удобно.
Василий Наумкин
14 мая 2024, 16:50
modx.pro
1 256
+16

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

Наумов Алексей
14 мая 2024, 17:25
+1
ой где ты нашел эти волшебные чудо конфетки, которые позволяют не спать ночами и пилить полезные штуки
    Василий Наумкин
    15 мая 2024, 06:14
    0
    Это несложно, если процесс разработки хорошо отлажен и тебе ничего не мешает.
    Николай Савин
    14 мая 2024, 19:07
    +3
    Давай тогда уж и Smarty выдай
      Wassi Wassinen
      14 мая 2024, 21:53
      0
      Вижу уже несколько заметок про эти mmx дополнения. Это какой-то отдельный вид дополнений, которые через установщик MODx не поставить?
          Wassi Wassinen
          15 мая 2024, 11:03
          +2
          Каждый расходует свое время как хочет. :)

          Вижу, что это что-то революционное. И стараюсь смотреть на такие вещи с точки зрения популяризации MODx в широком смысле.
          MODx, как я это понимаю, занял нишу в которой можно быстро поднять сайт без навыков программирования (немного прочитав документацию и поняв базовые принципы: шаблон, чанки, сниппеты и синтаксис; далее — просто установить, просто использовать). Но не так просто, как Wordpress. Поэтому, ниша получилась довольно узкая. :) В своё время популярность MODx, в моем представлении, выросла, в том числе, благодаря дополнениям MiniShop2 и pdoTools. Эти дополнения развивали основные принципы MODx (просто установить, просто использовать) и потому стали так популярны. И помогли MODx усилить свои позиции.

          Несколько я смог понять — новые дополнения уводят MODx ещё куда-то. Станут ли они новыми MS2 и pdoTools — время покажет. :)

          Я не критикую. Это на правах размышлений.

          Возможно, стоило бы исправить корень проблемы с дублированием Guzzle, с доступом к Composer и прочим, но сделать это так, чтобы не менялись принципы MODx (просто установить, просто использовать) для большинства пользователей, за счёт которых растёт популярность MODx. Сделать удобно для разработчиков, но сохранить привычную и простую модель для простых пользователей — это было бы гениально. :)

          Напоминаю, что рассуждаю в контексте популярности и популяризации MODx.
          Возможно, популярность начнет расти за счёт состоявшихся разработчиков, которые уйдут с других фреймворков, чтобы найти что-то недостающее для себя в MODx. Это открытый вопрос :))
        Andrew
        17 мая 2024, 11:32
        0
        Вот так, в MODX подвезли TWIG, а в чате тишина)
          Miša Bulic
          17 мая 2024, 11:44
          0
          Дак все на 2-й версии сидят, а эту только посмотреть порадоваться =)
          Дмитрий
          18 мая 2024, 16:42
          +1
          Не совсем в тему, но добавлю свои пять копеек :)
          Ставил Твиг в Битрикс три года назад и тем самым избавился от лютого говнокода в битриксовых файлах. Жить стало сильно проще.
          Правда махровые Битрикс разрабы смотрели на меня как на идиота, когда я собеседовал их и спрашивал, знают ли они что это такое.
          Зато когда попробовали — за уши не оттащишь.
            svvtx
            02 июня 2024, 10:59
            0
            Ура, наконец-то какая-то движуха началась) А планируется что-то типа ZoomX на modx 3? Без него не вижу смысла переходить. В принципе какая разница, twig, smarty, blade. ZoomX именно саму концепцию меняет на более понятную и приближенную к фреймворкам)
              Василий Наумкин
              13 июня 2024, 18:56
              0
              А планируется что-то типа ZoomX на modx 3?
              Нет, я ничего такого не планирую.

              Но в некоторых mmx-приложениях используется vesp/core для работы API, а у него внутри slim/slim — так что за фреймворками далеко ходить не надо, всё уже под рукой.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              11