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 = [])чанк MODX; понимает file: и path:
snippet($name, $params = [])сниппет MODX; !имя — без кэша, file:имя — из файла
pbJson($data, $options = '')сериализация через сниппет pbJson

Картинки

МодификаторСигнатура
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(array $button) — собирает <a> или <button> из массива с ключами published, type, caption, classes, href, file, attr, disabled, target_blank, name, value. Без published возвращает пустоту.

© PageBlocks 2019-present