Модификаторы
Модификатор — самая гибкая из трёх точек расширения шаблона. Один и тот же модификатор работает тремя способами:
{$title|upper} {* фильтром *}
{upper($title)} {* функцией *}
{set $t = $title|upper} {* в выражении *}Этим он и отличается от псевдо-тега, который умеет только первое положение в строке и в выражение не встаёт. Правило простое: нужно значение — пишите модификатор, нужен кусок HTML — псевдо-тег.
🛠 Свои модификаторы
core/App/Helpers/fenom/modifiers.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);
},
];<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 возвращает пустоту.