mmxTwig - еще одна интеграция шаблонизатора
Вы будете смеяться, но я написал еще одно composer-only дополнение для MODX. Это было несложно, благодаря той же логике работы, что и у mmxFenom.
Как оказалось, Fenom уже давненько не развивается.
3я версия по факту нерабочая и последний коммит был сделан больше года назад. Конечно, 2я версия вполне ок и свои задачи выполняет, но вообще проект выглядит не очень живым.
А Twig поддерживается сообществом Symfony, так что там с этим делом полный порядок. Поэтому мне и подкинули идею, в личной группе, добавить еще один шаблонизатор — что я сегодня и сделал.
Устанавливаем вот так
Затем создаём сниппет Test
Потом чанк Test
Потом вызываем сниппет на странице
И всё работает!
Конечно же, здесь другой синтаксис.
Иначе вызываются переменные, по-другому работают циклы и т.д. — смотрите документацию.
Еще здесь нет способа просто взять и включить вызов произвольных PHP функций, просто нет такой возможности.
Еще, насколько я вижу по коду, для рендера не используется функция eval(). Безопасность!
Ну а так — всё то же самое:
Адаптировал тестовый код из старой заметки и погонял на modhost.pro.
Код чанков простейший:
Обычный чанк из БД: 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
Задать вопросы можно в комментриях, или в моём чатике — как вам удобно.
Как оказалось, 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
Задать вопросы можно в комментриях, или в моём чатике — как вам удобно.
Комментарии: 11
ой где ты нашел эти волшебные чудо конфетки, которые позволяют не спать ночами и пилить полезные штуки
Это несложно, если процесс разработки хорошо отлажен и тебе ничего не мешает.
Давай тогда уж и Smarty выдай
Вижу уже несколько заметок про эти mmx дополнения. Это какой-то отдельный вид дополнений, которые через установщик MODx не поставить?
Каждый расходует свое время как хочет. :)
Вижу, что это что-то революционное. И стараюсь смотреть на такие вещи с точки зрения популяризации MODx в широком смысле.
MODx, как я это понимаю, занял нишу в которой можно быстро поднять сайт без навыков программирования (немного прочитав документацию и поняв базовые принципы: шаблон, чанки, сниппеты и синтаксис; далее — просто установить, просто использовать). Но не так просто, как Wordpress. Поэтому, ниша получилась довольно узкая. :) В своё время популярность MODx, в моем представлении, выросла, в том числе, благодаря дополнениям MiniShop2 и pdoTools. Эти дополнения развивали основные принципы MODx (просто установить, просто использовать) и потому стали так популярны. И помогли MODx усилить свои позиции.
Несколько я смог понять — новые дополнения уводят MODx ещё куда-то. Станут ли они новыми MS2 и pdoTools — время покажет. :)
Я не критикую. Это на правах размышлений.
Возможно, стоило бы исправить корень проблемы с дублированием Guzzle, с доступом к Composer и прочим, но сделать это так, чтобы не менялись принципы MODx (просто установить, просто использовать) для большинства пользователей, за счёт которых растёт популярность MODx. Сделать удобно для разработчиков, но сохранить привычную и простую модель для простых пользователей — это было бы гениально. :)
Напоминаю, что рассуждаю в контексте популярности и популяризации MODx.
Возможно, популярность начнет расти за счёт состоявшихся разработчиков, которые уйдут с других фреймворков, чтобы найти что-то недостающее для себя в MODx. Это открытый вопрос :))
Вижу, что это что-то революционное. И стараюсь смотреть на такие вещи с точки зрения популяризации MODx в широком смысле.
MODx, как я это понимаю, занял нишу в которой можно быстро поднять сайт без навыков программирования (немного прочитав документацию и поняв базовые принципы: шаблон, чанки, сниппеты и синтаксис; далее — просто установить, просто использовать). Но не так просто, как Wordpress. Поэтому, ниша получилась довольно узкая. :) В своё время популярность MODx, в моем представлении, выросла, в том числе, благодаря дополнениям MiniShop2 и pdoTools. Эти дополнения развивали основные принципы MODx (просто установить, просто использовать) и потому стали так популярны. И помогли MODx усилить свои позиции.
Несколько я смог понять — новые дополнения уводят MODx ещё куда-то. Станут ли они новыми MS2 и pdoTools — время покажет. :)
Я не критикую. Это на правах размышлений.
Возможно, стоило бы исправить корень проблемы с дублированием Guzzle, с доступом к Composer и прочим, но сделать это так, чтобы не менялись принципы MODx (просто установить, просто использовать) для большинства пользователей, за счёт которых растёт популярность MODx. Сделать удобно для разработчиков, но сохранить привычную и простую модель для простых пользователей — это было бы гениально. :)
Напоминаю, что рассуждаю в контексте популярности и популяризации MODx.
Возможно, популярность начнет расти за счёт состоявшихся разработчиков, которые уйдут с других фреймворков, чтобы найти что-то недостающее для себя в MODx. Это открытый вопрос :))
Вот так, в MODX подвезли TWIG, а в чате тишина)
Дак все на 2-й версии сидят, а эту только посмотреть порадоваться =)
Не совсем в тему, но добавлю свои пять копеек :)
Ставил Твиг в Битрикс три года назад и тем самым избавился от лютого говнокода в битриксовых файлах. Жить стало сильно проще.
Правда махровые Битрикс разрабы смотрели на меня как на идиота, когда я собеседовал их и спрашивал, знают ли они что это такое.
Зато когда попробовали — за уши не оттащишь.
Ставил Твиг в Битрикс три года назад и тем самым избавился от лютого говнокода в битриксовых файлах. Жить стало сильно проще.
Правда махровые Битрикс разрабы смотрели на меня как на идиота, когда я собеседовал их и спрашивал, знают ли они что это такое.
Зато когда попробовали — за уши не оттащишь.
Ура, наконец-то какая-то движуха началась) А планируется что-то типа ZoomX на modx 3? Без него не вижу смысла переходить. В принципе какая разница, twig, smarty, blade. ZoomX именно саму концепцию меняет на более понятную и приближенную к фреймворкам)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.