MODX. Шаблонизатор Fenom. Что это и как им пользоваться

Fenom — удобный шаблонизатор кода, поставляющийся вместе с пакетом pdoTools.

Достоинства

Работает быстрее чем родной парсер MODX — modParser;

Недостатки

Конфликтует с фигурными скобками в контенте. Надо учитывать это при проектировании архитектуры сайта, чтобы не гадать в последствии «почему новая статья ломает сайт?»

Системные настройки

  • pdotools_fenom_default — включает обработку через Fenom чанков pdoTools. Включено по умолчанию.
  • pdotools_fenom_parser — включает обработку шаблонизатором всех страниц сайта. То есть, не только чанков, но и шаблонов.
  • pdotools_fenom_php — включает поддержку PHP функций в шаблонизаторе. Очень опасная функция, так как любой менеджер получит доступ к PHP прямо из чанка.
  • pdotools_fenom_modx — добавляет системные переменные {$modx} и {$pdoTools} в шаблоны Fenom. Тоже очень опасно — любой менеджер может управлять объектами MODX из чанков.
  • pdotools_fenom_options — JSON строка с массивом настроек согласно официальной документации. Например: {"auto_escape":true,"force_include":true}
  • pdotools_fenom_cache — кэширование скопмилированных шаблонов. Имеет смысл только для сложных чанков на рабочих сайтах, по умолчанию отключено.
  • pdotools_fenom_save_on_errors — сохраняет ошибки компиляции Fenom в специальный файл, для последующей отладки.

Синтаксис

Комментарии для шаблонизатора Fenom:

  • {ignore}{/ignore}
  • {**}

Простой вызов

MODX Fenom
[[+id]] {$id}
[[+id:default=`test`]] {$id ?: 'test'}
[[+id:is=``:then=`test`:else=`[[+pagetitle]]`]] {$id == ''? 'test': $pagetitle}

{$_modx} — безопасный доступ к переменным и методам системы

[[*id]] {$_modx->resource.id}
[[*tv_param]] {$_modx->resource.tv_param}
[[%lexicon]] {$_modx->lexicon('lexicon')}
[[~15]] {$_modx->makeUrl(15)}
[[~[[*id]]]] {$_modx->makeUrl($_modx->resource.id)}
[[++system_setting]] {$_modx->config.system_setting}

{$_modx->config} — системные настройки

{$_modx->config.site_name}
{$_modx->config.emailsender}
{$_modx->config['site_url']}
{$_modx->config['any_system_setting']}

{$_modx->user} — массив текущего пользователя. Если он авторизован, то добавляются и данные из профиля:

{if $_modx->user.id > 0}
    Привет, {$_modx->user.fullname}!
{else}
    Вам нужно авторизоваться.
{/if}
{$_modx->context} — массив с текущим контекстом
Вы находитесь в контексте {$_modx->context.key}
{$_modx->resource} — массив с текущим ресурсом
{$_modx->resource.id}
{$_modx->resource.pagetitle}
{$_modx->makeUrl($_modx->resource.id)}
{$_modx->lexicon} — объект (не массив!) modLexicon, который можно использовать для загрузки произвольных словарей:
{$_modx->lexicon->load('ms2gallery:default')}
Проверка словарей ms2Gallery: {$_modx->lexicon('ms2gallery_err_gallery_exists')}

{$_modx->lexicon()}  вывод записей из lexicon

{$_pls} — вывод плейсхолдеров с точкой

Fenom использует точку для доступа к значению массива, а MODX обычно выствляет так плейсхолдеры из массивов. Соотвественно, для тегов аналогов в Fenom не предусмотрено.

Поэтому для подобных плейсхолдеров необходимо использовать вторую служебную переменную — {$_pls}:
{$_pls['tag.subtag']}

Вывод сниппетов и чанков

{$_modx->runSnippet('!pdoPage@PropertySet', [
    'parents' => 0,
    'showLog' => 1,
    'element' => 'psoResources',
    'where' => ['isfolder' => 1],
    'showLog' => 1,
])}
{$_modx->getPlaceholder('page.total')}
{$_modx->getPlaceholder('page.nav')}

По умолчанию все сниппеты вызываются кэшированными, для некешированного вызова добавляется ! — как и в тегах MODX.

Для вывода чанков запускается pdoTools, можно использовать все его возможности:

{$_modx->getChunk('MyChunk@PropertySet')}

{$_modx->parseChunk('MyChunk', [
    'pl1' => 'placeholder1',
    'pl2' => 'placeholder2',
])}

{$_modx->getChunk('@TEMPLATE Base Template')}

{$_modx->getChunk('@INLINE
    Имя сайта: {$_modx->config.site_name}
')}

{$_modx->getChunk(
    '@INLINE Передача перемнной в чанк: {$var}',
    ['var' => 'Тест']
)}

{$_modx->getChunk('
    @INLINE Передача переменной в вызов сниппета:
    {$_modx->runSnippet("pdoResources", [
        "parents" => $parents
    ])}
    Всего результатов: {$_modx->getPlaceholder("total")}
    ',
    ['parents' => 0]
)}

Управление кэшированием

В объекте {$_modx} доступен сервиc modX::cacheManager, который позволяет устанавливать произвольное время кэширования вызываемых сниппетов:
{if !$snippet = $_modx->cacheManager->get('cache_key')}
    {set $snippet = $_modx->runSnippet('!pdoResources', [
        'parents' => 0,
        'tpl' => '@INLINE {$id} - {$pagetitle}',
        'showLog' => 1,
    ])}
    // set $null — чтобы cacheManager->set не вывел 1 (т.е. true) на страницу
    {set $null = $_modx->cacheManager->set('cache_key', $snippet, 1800)} // 30 минут
{/if}

{$snippet}

Посмотреть этот кэш можно в /core/cache/default/

Системные процессоры

Можно запускать системные процессоры (если хватит прав ):

{$_modx->runProcessor('resource/update', [
    'id' => 10,
    'alias' => 'test',
    'context_key' => 'web',
])}

Проверка авторизации

Так как объекта с пользователем в {$_modx} нет, методы проверки авторизации и прав доступа вынесены в классы:
{$_modx->isAuthenticated()}                               // если авторизован
{$_modx->hasSessionContext('web')}             // есть ли доступ к контексту
{$_modx->hasPermission('load')}                     // есть ли права

Остальные методы

{$_modx->regClientCss('/assets/css/style.css')}                    // регистрация css
{$_modx->regClientScript('/assets/css/script.js')}                 // регистрация js

{$_modx->sendForward(10)}                                                            // загрузить ресурс без изменения url
{$_modx->sendRedirect('http://yandex.ru')}                             // перенаправление, редирект

{$_modx->setPlaceholder('key', 'value')}                                     // установить плейсхолдер
{$_modx->getPlaceholder('key')}                                                   // получить плейсхолдер

{if $res = $_modx->findResource('url-to/doc/')}                      // найти ресурс
    {$_modx->sendRedirect( $_modx->makeUrl($res) )}         // создать url
{/if}

Расширение шаблонов

Использование шаблонизатора Fenom позволяет включать одни чанки (шаблоны в другие) и даже расширять их.

{include} — используются для включения других шаблонов в текущий.
Например, можно просто подгрузить содержимое чанка:

Обычный чанк 
{include 'имя чанка'}

Шаблон modTemplate 
{include 'template:имя шаблона'}

Чанк с набором параметров
{include 'chunk@propertySet'}
{include 'template:Name@propertySet'}

{include} в официальной документации

{extend} —  возможность подключения шаблона или чанка для последующего его расширения.

требует включенной системной настройки pdotools_fenom_parser.

Пример: базовый шаблон «Fenom Base» включает обычные чанки и определяет несколько блоков {block}, которые можно расширить в другом шаблоне:

<!DOCTYPE html>
<html lang="en">
<head>
    {include 'head'}
</head>
<body>
    {block 'navbar'}
        {include 'navbar'}
    {/block}
    <div class="container">
            <div class="content">
                {block 'content'}
                    {$_modx->resource.content}
                {/block}
            </div>
            <div class="sidebar">
                {block 'sidebar'}
                    Sidebar
                {/block}
            </div>
        {block 'footer'}
                {include 'footer'}
        {/block}
    </div>
</body>
</html>

Дочерний шаблон «Fenom Extended», в котором подключается «Fenom Base» и расширяется блок content:

{extends 'template:Fenom Base'}
{block 'content'}
    <h3>{$_modx->resource.pagetitle}</h3>
    <div class="jumbotron">
        {parent}
    </div>
{/block}

Также можно расширять чанки, но, для чанков не нужен префикс template.

{extends} в официальной документации

?
Была ли статья полезной?
Пожалуйста, активируйте JavaScript.
Please enable JavaScript.
return; 1