Сладкий синтаксис в Fenom


На просторах сообщества уже много раз поднималась тема расширяемости синтаксиса Fenom. В pdoTools для этого есть даже событие плагина pdoToolsOnFenomInit. В этой заметке предлагаю добавить некий синтаксический сахар для ещё более приятного использования классного шаблонизатора. Мы добавим подключение файлового чанка в шаблон таким образом
{chunk 'path/to/chunk'}
и вызов сниппета таким
{snippet 'pdoResources' ['param' => 'value']}

Плагин


Вешаем плагин на событие pdoToolsOnFenomInit
<?php
$pdoTools = $modx->getService('pdoTools');

// usage: {chunk 'path/to/chunk' ['param' => 'value']}
$fenom->addFunction('chunk', function (array $data) use ($pdoTools) {
    $name = '@FILE chunks/' . $data[0] . '.tpl';
    $properties = empty($data[1]) ? [] : $data[1];
    $pdoTools->debugParserModifier($name, 'chunk', $properties);
    $result = $pdoTools->getChunk($name, $properties);
    $pdoTools->debugParserModifier($name, 'chunk', $properties);

    return $result;
});

// usage: {snippet 'pdoResources' ['param' => 'value']}
$fenom->addFunction('snippet', function (array $data) use ($pdoTools) {
    $name = $data[0];
    $properties = empty($data[1]) ? [] : $data[1];
    $pdoTools->debugParserModifier($name, 'snippet', $properties);
    $result = $pdoTools->runSnippet($name, $properties);
    $pdoTools->debugParserModifier($name, 'snippet', $properties);

    return $result;
});

Как использовать


Создаём файл в core/elements/chunks/content/base.tpl с кодом чанка. Вызываем так:
{chunk 'content/base'}
Как видите, здесь только часть пути. Без chunks/ и расширения.

Как это работает


Для чанков, подключаемых таким способом, нужно соблюдать 2 условия. Они должны
1) Быть файловыми и лежать в /core/elements/chunks/
2) Иметь расширение .tpl

Со сниппетами думаю итак всё понятно.

Итого


Достаточно просто, не так ли? Таким образом можно добавить, что угодно! Например, у меня помимо этих кастомных функций, есть ещё несколько, которые я использую почти на всех сайтах. Дерзайте!
Павел Гвоздь
09 января 2019, 18:57
5
614
+12
Поблагодарить автора Отправить деньги

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

Сергей Шлоков
10 января 2019, 07:03
+4
По-моему, это даже не полусладкое, а полусухое. Ну для чанков, допустим, подсластитель в том, чтобы не писать папку «chunk» и разширение «tpl». А для сниппета где он? Профит в том, чтобы не писать палку и двоеточие?
// pdoTools
{'pdoResources' | snippet : ['param' => 'value']}
// Твой вариант
{snippet 'pdoResources' ['param' => 'value']}
Кроме того возможна путаница (для стороннего разработчика) — chunk вызывает файловый чанк, а snippet — обычный сниппет.

Для чанков, подключаемых таким способом, нужно соблюдать 2 условия. Они должны
1) Быть файловыми и лежать в /core/elements/chunks/
2) Иметь расширение .tpl
1. Необязательно. Так как ты сломал механизм pdoTools, то можно указать любой путь.
2. Тут да. Так как nul байт пофиксили в 5.3.

Дерзайте!
Спасибо!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.