Skip to content

Модификаторы ​

Модификатор — самая гибкая из трёх точек расширения шаблона. Один и тот же модификатор работает тремя способами:

fenom
{$title|upper}              {* фильтром  *}
{upper($title)}             {* функцией  *}
{set $t = $title|upper}     {* в выражении *}

Этим он и отличается от псевдо-тега, который умеет только первое положение в строке и в выражение не встаёт. Правило простое: нужно значение — пишите модификатор, нужен кусок HTML — псевдо-тег.

🛠 Свои модификаторы ​

core/App/Helpers/fenom/modifiers.php

Файл возвращает массив «имя → функция»:

php
return [
    'upper' => function ($value) {
        return mb_strtoupper((string) $value);
    },
    'excerpt' => function ($text, int $length = 100) {
        return mb_substr(strip_tags((string) $text), 0, $length);
    },
];
fenom
<h2>{$title|upper}</h2>
<p>{$content|excerpt:200}</p>

Аргументы после первого передаются через двоеточие: {$x|mod:$a:$b}.

Внутри доступен $this->modx

Файл подключается изнутри View, поэтому замыкания в нём видят $this — то есть $this->modx это текущий экземпляр MODX. Глобальный хелпер modx() тоже работает.

Свой файл читается после встроенных модификаторов, поэтому одноимённый модификатор перекрывает готовый. Обновление компонента этот файл не трогает.

🔧 Готовые модификаторы ​

Текст ​

МодификаторСигнатураЧто делает
trim($input, $chars = " \n\r\t\v\0")обрезает по краям
truncate($input, ['length' => 160, 'suffix' => '...'])срезает теги, обрезает по границе слова
ellipsis($input, $length = 100)то же, но HTML сохраняет и чинит незакрытые теги
notags($string, $allowable_tags = null)strip_tags()
uppercase($input)псевдонимы: upper, up, strtoupper
lowercase($input)псевдонимы: lower, low, strtolower
preg_replace($value, $pattern, $replacement = '', $limit = -1)значение первым аргументом, а не шаблон
split($input, $delimiter = ',')строка → массив
join($input, $glue = ',')массив или итератор → строка
decl`($number, $forms, $showNumber = false, $sep = '')`
date($value, $format = 'j F Y, H:i', $locale = null)$locale = 'ru' даёт русские месяцы и дни
default($input, $fallback)подменяет null, '', [] и false
phone($value)оставляет цифры и +
parseNumber($text)первое число из строки
editorjs($json, $options = '')рендер блоков Editor.js
print($input, $wrap = true)print_r() в <pre> — для отладки

Ссылки, настройки, переводы ​

МодификаторСигнатураЧто делает
route($name, $parameters = [])адрес маршрута по имени, с языковым префиксом
lang_url($uri = '')приставляет языковой префикс к готовому адресу
url($id, $context = '', $args = '', $scheme = -1, $options = [])modX::makeUrl() по id ресурса
lang($key, $params = [], $language = '')строка из App/lang/
lexicon($key, $params = [], $language = '')фраза из лексикона MODX
config($key, $default = null)Config, а следом системная настройка MODX
placeholder($key)плейсхолдер MODX

Объекты и списки ​

МодификаторСигнатураЧто отдаёт
resource($id, $field = '')поле или весь ресурс site_content
user($id, $field = 'username')поле пользователя вместе с профилем; 'photo' подставит граватар, а пароли и сессии вырезаны
resources($ids = null, $options = [])плоский список ресурсов
pbresources($ids = null, $options = [])то же из pb_resources; псевдоним pbResources
users($ids = null, $options = [])список пользователей
menu($rootId = 0, $level = 3)дерево меню
blocks($where = [])опубликованные блоки в своём порядке

resources, pbresources и users берут id строкой '12,7,3', массивом или числом — и тогда сохраняют порядок id. Ассоциативный массив первым аргументом читается как опции: parent, template, context, where, sortby, sortdir, limit, offset. Подробности — Хелперы.

Вложенный рендер ​

МодификаторСигнатураЧто делает
render($template, $params = [])рендерит строку как шаблон (@INLINE)
chunk($template, $data = [])тот же резолвер, что у view(): голое имя — чанк MODX, плюс file:, file:<источник>:, path: и @INLINE. Отката между источниками нет — несуществующий file: даёт ошибку в логе, а не тихий поиск в базе
snippet($name, $params = [])сниппет MODX; !имя — без кэша, file:имя — из файла
bundled($name, $data = [])дефолтный чанк компонента: сперва чанк MODX с таким именем, иначе файл из elements/chunks/<имя>.tpl
pbJson($data, $tpl = '')сериализация через сниппет pbJson; второй аргумент — шаблон строки, он уезжает в сниппет как &tpl

bundled — это то, чем переопределяется стандартная разметка

Все дефолтные чанки сниппетов (pageblocks.resource, pageblocks.card, pageblocks.menu и прочие) берутся именно так. Завели в MODX чанк с тем же именем — ваша версия победила, файл компонента больше не читается, и обновление пакета её не затрёт. Файла нет ни в базе, ни на диске — вернётся пустая строка, а причина уйдёт в лог.

При pageblocks_file_elements_only база не опрашивается вовсе: читается только файл.

Картинки ​

МодификаторСигнатура
glide($url, $options = 'fm=webp&q=85')
pthumb($url, $options = [])
phpthumbon($url, $options = [])

JSON и массивы ​

МодификаторСигнатура
toJSON($array, $options = 320, $depth = 512)
fromJSON($string, $assoc = true, $depth = 512, $options = 0)
slice($array, $start = 0, $length = null)

Ассеты ​

cssToHead($css, $media = null), jsToHead($js, $plaintext = false), jsToBottom($js, $plaintext = false), htmlToHead($html), htmlToBottom($html) — обёртки над regClient* MODX. Возвращают пустоту, вызываются ради побочного эффекта.

Доступ ​

МодификаторСигнатура
isloggedin($ctx = null) — по умолчанию текущий контекст
isnotloggedin($ctx = null)
ismember($id, $groups = [], $matchAll = false) — пустой $id = текущий пользователь

Для разметки те же проверки удобнее брать блочными тегами{auth}, {guest}, {admin}.

Разное ​

button($button) — собирает <a> или <button> из массива с ключами published, type, caption, classes, href, file, attr, disabled, target_blank, name, value. Без published возвращает пустоту. Тип аргумента не объявлен намеренно: поле-кнопка приходит в шаблон либо массивом, либо строкой JSON, либо null — если его ни разу не заполняли, — и все три случая значат «кнопки нет», то есть пустую строку, а не TypeError, роняющий страницу.

Цель, выбранную в дереве ресурсов, модификатор не выводит

У поля-кнопки три способа задать адрес — Файл, Ссылка и Ссылка (ресурс), — но href собирается из file, затем href, затем #. Ключ resource не читается вовсе, поэтому кнопка с целью из дерева ресурсов выводится с href="#". Пока это не исправлено, пишите адрес в поле Ссылка или разворачивайте id в шаблоне: {$button.resource|url}.

© PageBlocks 2019-present