Дата публикации
21 Июля 2019
Дата изменения
4 Июля 2020
Уникальных просмотров
18.258

Оглавление

Для начала советую прочитать официальную документацию, а дальше мы рассмотрим синтаксис применительно к MODx.

Все переменные от сниппетов передаются в чанк как есть, поэтому переписывать старые чанки на новый синтаксис — сплошное удовольствие.

Базовые различия

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

Для использования более сложных сущностей, в pdoParser предусмотрена служебная переменная {$_modx}, которая даёт безопасный доступ к некоторым переменным и методам системы.

MODx Fenom
[[*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}

Подборка синтаксиса Fenom

Список написания возможных вариаций тегов MODx на шаблонизаторе Fenom:

MODx Fenom
[[~[[*id]]]] {$_modx->resource.id | url}
[[~[[+id]]]] {$id | url}
[[~[[!+some.placeholder]]]]

{var $plcholder= $_modx->getPlaceholder('some.placeholder')}

{$plcholder | url}

[[~9]] {9 | url}
[[#9.pagetitle]] {9 | resource : 'pagetitle'}
[[*parent]] {$_modx->resource.parent}
[[+parent]] {$parent}
[[#[[!+some.placeholder]].parent]] {$_modx->getPlaceholder('some.placeholder') | resource : 'parent'}
[[!#get]] {$.get | print_r}

Переменные MODx

Помимо этого, для работы вам доступны следующие переменные:

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

{$_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)}

Работа с объектом modLexicon

{$_modx->lexicon} — объект (не массив!) modLexicon, который можно использовать для загрузки произвольных словарей:

{$_modx->lexicon->load('ms2gallery:default')}
Проверка словарей ms2Gallery: {$_modx->lexicon('ms2gallery_err_gallery_exists')}

За вывод записей отвечает отдельная функция {$_modx->lexicon ()}.

Плейсхолдеры с точкой или тире

Во многих местах MODx используются плейсхолдеры, которые нельзя указывать в Fenom, так как они не соотвествуют правилам наименования переменных PHP. Например, плейсхолдеры с точкой (MODx обычно выставляет так данные массивов) или с тире (ТВ параметры).

Для доступа к этим плейсхолдерам (например в чанках), нужно использовать вторую служебную переменную — {$_pls}, если нужно получить доступ к TV в шаблонах или чанках, так же можно воспользоваться переменной {$_modx}. Название TV с точкой или тире, берется в квадратные скобки.

/* Вывод сразу (в чанках) */
{$_pls['tag.subtag']}

/* Вывод сразу (в шаблонах) */
{$_modx->resource['tv-name']}

/* Вывод через переменную */
{var $tv_name = $_pls['tv-name']}
{$tv_name}

Если плейсхолдер был выставлен в глобальный массив modX::placeholders, то его нужно получать вот так:

{var $tag_sub_tag = $_modx->getPlaceholder('tag.sub_tag')}
{$tag_sub_tag}

{$_modx->getPlaceholder('tv_name')}

При указании неправильных переменных ваш шаблон не будет скомпилирован и вы получите запись об этом в системном журнале.

Заполнение плейсхолдеров

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

Выполнение всей шаблонизации за один раз даёт очень высокую скорость, но также следует учитывать, что плейсхолдеры будут доступны только после отработки соответствующего сниппета.

Например: необходимо получить значение плейсхолдера {$mse2_query} (Поисковой запрос) в форме, но форму поиска отобразить над результатами. Для этого необходимо выполнить сниппет mSearch2 и передать результаты плейсхолдеру, например searchResults:

{'!pdoPage' | snippet : [
    'element' => 'mSearch2',
    'toPlaceholder' => 'searchResults'
]}

Далее вызвать сниппет формы поиска, где парсер Fenom подставит значение плейсхолдера {$mse2_query}:

{'!mSearchForm' | snippet}

После чего вывести результаты работы сниппета mSearch2:

{'searchResults' | placeholder}

Если сниппет не умеет сохранять результаты своей работы с плейсхолдер, вы можете присваивать их переменной Fenom:

{var $date = 'dateAgo' | snippet : ['input' => '2016-09-10 12:55:35']}

...

Ваша дата: {$date}.

Очень похоже на логику работы обычного скрипта.

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

Переменная {$_modx} на самом деле представляет собой простой и безопасный класс microMODX.

Поэтому сниппеты и чанки вызываются так:

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

Как видите, синтаксис практически полностью повторяет PHP, что открывает новые возможности. Например, можно указывать массивы, вместо JSON строк.

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

Если для вызова сниппета используется родной метод 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 = $_modx->cacheManager->set('cache_key', $snippet, 1800)}
{/if}

{$snippet}

Посмотреть этот кэш можно в /core/cache/default/, в примере он сохраняется на 30 минут (1800 секунд).

set $null = ... нужен, чтобы cacheManager->set не вывел 1 (т.е. true) на страницу.

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

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

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

Так как объекта с пользователем в {$_modx} нет, методы проверки авторизации и прав доступа вынесены непосредственно в класс:

{$_modx->isAuthenticated()} // Возвращает TRUE, если пользователь авторизован в текущем контексте или в контексте, указанном в качестве аргумента
{$_modx->hasSessionContext('web')}
{$_modx->hasPermission('load')}
{$_modx->user.id > 0} // У гостей значение user id всегда будет 0

Проверка администратора

Вот два простых, но железных способа проверить пользователя на авторизацию. В первом случае проверка на значение id, во втором авторизация в контексте mgr, ну и соответствие группе администраторов.

{if $_modx->user.id > 0 && $_modx->isMember('Administrator')}
Контент только для администратора 
{/if}

{if $_modx->isAuthenticated('mgr') && $_modx->isMember('Administrator')}
Контент только для администратора 
{/if}

Вывод информации о скорости работы

С версии 2.1.4 вы можете использовать метод {$_modx->getInfo(string, bool, string)} для получения данных о скорости работы системы в данный момент. У него три параметра:

Вывод по умолчанию (строка со всеми данными):

{$_modx->getInfo()}
// queries: 39
// totalTime: 0.1067 s
// queryTime: 0.0069 s
// phpTime: 0.0998 s
// source: database

Вывод конкретного значения:

{$_modx->getInfo('totalTime')}
// 0.1067 s
{$_modx->getInfo('source')}
// database

Оформление строк в свой чанк:

{$_modx->getInfo('', true, '@INLINE {$key} => {$value}')}
// queries => 39
// totalTime => 0.1155 s
// queryTime => 0.0091 s
// phpTime => 0.1064 s
// source => database

Вы можете даже добавить строки в лексикон pdoTools (или любой другой) и выводить ключи через него:

{$_modx->lexicon->load('pdotools:default')}
{$_modx->getInfo('', true, '@INLINE {$_modx->lexicon("pdotools_" ~ $key)} => {$value}')}

Или оформить без лексиконов, произвольно. Просто присваиваем переменной массив данных и выводим его ключи:

{set $info = $_modx->getInfo('', false)}
Время работы: {$info.totalTime}
Время запросов: {$info.totalTime}
Количество запросов: {$info.queries}
Источник: {$info.source}

Вывод информации только пользователям, которые авторизованы в менеджере:

{if $_modx->hasSessionContext('mgr')}
    {$_modx->getInfo()}
{/if}

Регистрация стилей и скриптов

С помощью данных методов можно регистрировать скрипты и стили на нужных страницах, без необходимости загружать их на каждой странице сайта.

{$_modx->regClientCss('/assets/css/style.css')}
{$_modx->regClientScript('/assets/css/script.js')}

Редирект на другой сайт

{$_modx->sendRedirect('http://yandex.ru')}

Установка и получение значения плейсхолдера

{$_modx->setPlaceholder('key', 'value')}
{$_modx->getPlaceholder('key')}

Поиск id ресурса по URL

С помощью метода findResource, можно найти id ресурса по URL:

{if $res = $_modx->findResource('url-path-here')}
    {$res}
{/if}

// Редирект на найденную страницу
{if $res = $_modx->findResource('url-path-here')}
    {$_modx->sendRedirect( $_modx->makeUrl($res) )}
{/if}

Переодически в класс добавляются новые методы, так что смотрите их в самом файле.

Благодарность автору

Если по какой-либо причине вы хотите поблагодарить автора данного ресурса, вы можете это сделать одним из удобных для вас способов ниже.

Один из самых популярных способов поблагодарить автора, воспользоваться сервисом Яндекс.Деньги.

Время работы: 0,1314 s
Время запросов: 0,1314 s
Количество запросов: 27
Источник: cache