MODX. Встроенные модификаторы Fenom

Тут представлен список предустановленных модификаторов Fenom, которые присутствуют в CMF MODX.

Лучше ознакомиться со списком модификаторами заранее, поскольку при решении задач не всегда может возникнуть мысль поискать такое решение в модификаторах, в то время как такое решение уже реализовано для простого и удобного использования. 

Модификаторы применяются по следующей схеме:

// { объект | модификатор : 'значение' | модификатор : 'значение'}

{$_modx->resource.pagetitle | limit : '3' | lowercase}

Список встроенных модификаторов Fenom

Модификатор Описание
date

Вывод текущей даты или ее форматирование через функцию date. Если переменная пуста, будет получено текущее время.

// Устанавливаем другой формат даты
{'2023-03-08 12:45' | date : 'd.m.Y'} // 08.03.2023

// Получаем текущий год
{'' | date : 'Y'} // текущий год
date_format Вывод текущей даты или ее форматирование через функцию strftime. Если переменная пуста, будет получено текущее время. В модификаторе необходимо использовать конверсионные указатели:
// Устанавливаем другой формат даты
{'2023-03-08 12:45' | date_format : '%d.%m.%Y'} // 08.03.2023

// Получаем текущий год
{'' | date_format : '%Y'} // текущий год

escape (e) Экранирование строки. Используется для кодирования или экранирования спецсимволов по алгоритмам экранирования HTML, URL’ов и Javascript. По умолчанию активирован режим экранирования HTML.
{'<p>Текст внутри тегов</p>' | escape } // &lt;p&gt;Текст внутри тегов&lt;/p&gt;

 Имеет несколько параметров. Первым параметром принимает режим работы, вторым — кодировку.

{$content | escape : type = 'html' : charset = 'UTF8'}

Режимы работы:

  • html — экранирует HTML сущности в строке.
  • url — экранирует строку для использования в URL.
  • js — экранирует строку для использования в JavaScript.
// html
{'<p>Текст внутри тегов</p>' | escape : 'html' : 'utf-8'} // &lt;p&gt;Текст внутри тегов&lt;/p&gt;

// url
{'http://site.com/?key=value' | escape : 'url'} // http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue

// js
{['key' => 'value'] | escape : 'js'}
unescape

Декодирование переменной. Модификатор unescape является обратным действием модификатора escape. Так же как и escape имеет режимы htmljs и URI.

// html
{'&lt;p&gt;Текст внутри тегов&lt;/p&gt;' | unescape : 'html' : 'utf-8'} // <p>Текст внутри тегов</p>

// url
{'http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue' | unescape : 'url'} // http://site.com/?key=value

// js
{'{"key":"value"}' | unescape : 'js'}

Режимы работы:

  • html — декодирует HTML сущности в строке.
  • url — декодирует строку для использования в URL.
  • js — декодирует строку для использования в JavaScript. 
strip Убирает пробелы в начале и конце текста. Если указан дополнительный параметр, то убираются и все повторяющиеся пробелы в тексте.
{"Текст     с    пробелами"| strip } // Текст с пробелами

{"    Многострочный
    текст    "| strip : true } // Многострочный текст
length (len, strlen)

Подсчитывает длину строки, массива, объекта. Может принимать строку или массив.

// Длинна строки
{'Длинна' | length} // 6

// Длинна массива
{['key' => 'value'] | length} // 1

// Длинна переменной
{if $images | length > 5}
    Слишком много изображений
{/if}
count

Подсчитывает количество элементов.

{set $array = [
"foo" => "bar",
"bar" => "foo",
]}

{$array | count} // 2
in

Оператор проверки наличия подстроки в строке или значения в массиве.

{if 'img' | in : $content}
  В тексте есть картинки
{/if}

// Искомую строку можно вынести в переменную
{var $key = '10'}

{if $key | in : 'У меня 10 яблок'}
    Ключ найден
{/if}

// массив + тернарный оператор
{$key | in : [1, 3, 42] ? 'ключ найден' : 'не найден'}
iterable Проверка возможности перебора переменной.
{var $array = ['key' => 'value']}
{if $array | iterable}
    {foreach $array as $key => $value}
        <p>{$key} is {$value}</p>
    {/foreach}
{/if}
replace

Заменяет все вхождения искомой строки на строку для замены. Принимает 2 обязательных параметра: искомую строку и строку замены.

{ $content | replace : search_string : replace_string }


{ $fruits | replace : "pear" : "orange"} // все pear будут заменены на orange

 

ereplace Выполняет поиск и замену по регулярному выражению.
{ $content | ereplace : pattern : replacement }

Выполняет поиск совпадений в строке $content с шаблоном pattern и заменяет их на <em>replacement</em>.

replacement может содержать ссылки вида \n$n или ${n}, причем последний вариант предпочтительней. Каждая такая ссылка будет заменена на подстроку, соответствующую n-ой подмаске. n может принимать значения от 0 до 99, причем ссылка \0 (либо $0) соответствует вхождению всего шаблона. 

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

{'April 15, 2014' | ereplace : '/(\w+) (\d+), (\d+)/i' : '${1}1, $3'} // April1, 2014

Замечание: во избежание скрытых ошибок при выполнении сущностей регулярные выражения стоит помещать в одинарные кавычки.

match

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

Специальные символы:

  • ? — соответствие одному или нулю любых символов. ?at соответствует CatcatBat или bat.
  • * — соответствие любому количеству символов. Law* соответствует LawLaws, или Lawyer.
  • [characters] — соответствие символа группе символов. [CB]at соответствует Cat или Bat, но не catrat или bat.
  • \ — экранирующий символ. Law\* будет соответствовать только Law*.
{ $string | match : pattern}


{if $color | match : "*gr[ae]y" }
  какой-то оттенок серого
{/if}
ematch

Выполняет проверку на соответствие регулярному выражению

{ $string | ematch : pattern }

{if $color | ematch : '/^(.*?)gr[ae]y$/i' }
  какой-то оттенок серого ...
{/if}
split

Разбивает строку и возвращает массив, используя первый параметр в качестве разделителя (по умолчанию — ,).

{ $string | split : delimiter = ',' }

{var $fruits = 'banana,apple,pear' | split } // ["banana", "apple", "pear"]
{var $fruits = 'banana,apple,pear' | split : ',apple,'} // ["banana", "pear"]
esplit Разбивает строку по регулярному выражению в первом параметре (по умолчанию /,\s*/).
{ $string | esplit : pattern = '/,\s*/' }

{var $fruits = 'banana, apple, pear' | esplit} // ["banana", "apple", "pear"]
{var $fruits = 'banana; apple; pear' | esplit : '/;\s/'} // ["banana", "apple", "pear"]
join

Объединяет элементы массива в строку, используя первый параметр в качестве соединителя (по умолчанию — ,).

{ $array | join : delimiter = "," }

{var $fruits1 = ["banana", "apple", "pear"]}
{$fruits1 | join} // banana, apple, pear
{$fruits1 | join : 'is not'} // banana is not apple is not pear
number (number_format) Форматирование числа php функцией number_format().
{var $number = 10000}

{$number | number : 0 : '.' : ' '} // выведет 10 000

Функция принимает один, два или четыре аргумента (не три):

{$int | number_format : number : decimals : dec_point : thousands_sep}
  • number — Форматируемое число.
  • decimals — Устанавливает число знаков после запятой.
  • dec_point — Устанавливает разделитель дробной части.
  • thousands_sep — Устанавливает разделитель тысяч.
md5, sha1, crc32 Подсчёт контрольной суммы строки разными алгоритмами.
{'text' | md5} // 1cb251ec0d568de6a929b520c4aed8d1
{'text' | sha1} // 372ea08cab33e71c02c651dbc83a474d32c676ea
{'text' | crc32} // 999008199
urldecode, urlencode, rawurldecode Кодирование и декодирование строки URL соответствующей PHP функцией.
{'http://site.com/?key=value' | urlencode} // http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue
{'http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue' | urldecode} // http://site.com/?key=value
base64_decode, base64_encode Кодирование и декодирование строки алгоритмом base 64.
{'text' | base64_encode} // dGV4dA==
{'dGV4dA==' | base64_decode} // text
json_encode (toJSON), json_decode (fromJSON) Кодирование и декодирование JSON формата.
{'{"key":"value"}' | fromJSON} // ["key" => "value"]
{["key" => "value"] | toJSON} // {"key":"value"}
http_build_query Генерация URL-кодированной строки из массива.
{['foo'=>'bar','baz'=>'boom'] | http_build_query} // foo=bar&baz=boom
print_r Распечатка переменной через соответствующую PHP функцию. Если передан параметр, то можно сохранить результат.
{$printed | print_r}

{var $printed = (['key' => 'value'] | print_r : true)} // Array ( [key] => value )
var_dump (dump) Распечатка переменной вместе с типом.
{$var | var_dump}
nl2br Вставляет HTML-код разрыва строки <br> перед каждым переводом строки. 
{$content | nl2br}
lower (low, lcase, lowercase, strtolower) Переводит строку в нижний регистр. Является эквивалентом функции PHP <a href="http://docs.php.net/manual/ru/function.strtolower.php" rel="noopener" target="_blank">strtolower()</a>.
{'Текст для проверки' | lower} // текст для проверки
upper (up, ucase, uppercase, strtoupper) Переводит строку в верхний регистр. Является эквивалентом функции PHP <a href="http://docs.php.net/manual/ru/function.strtoupper.php" rel="noopener" target="_blank">strtoupper()</a>.
{'Текст для проверки' | upper} // ТЕКСТ ДЛЯ ПРОВЕРКИ
ucwords Преобразует в верхний регистр первый символ каждого слова в строке, а остальные символы в нижний.
{'теКст Для провЕрки' | ucwords} // Текст Для Проверки
ucfirst Преобразует в верхний регистр первый символ первого слова в строке, а остальные символы в нижний.
{'теКст Для провЕрки' | ucfirst} // Текст для проверки
htmlent (htmlentities) Преобразует все возможные символы в соответствующие HTML-сущности.
{'<b>Текст для проверки</b>' | htmlent} // &lt;b&gt;Текст для проверки&lt;/b&gt;gt;
limit

Обрезает строку до указанного количества символов.

{'Этот модификатор обрезает строку' | limit : 16} // Этот модификатор

Если в строке есть html теги, они останутся не закрытыми. Для предотвращения неправильного отображения html используйте модификатор truncate.

truncate (ellipsis)

Обрезает переменную до определенной длинны, по умолчанию — 80 символов.

{var $str = 'Очень длинная строка, которую необходимо обрезать'}
{$str | truncate : 20} // Очень длинная строка...

Этот модификатор имеет несколько параметров:

  • length (обязателен) —  определяет максимальную длину обрезаемой строки;
  • etc, по умолчанию троеточие (…)  —  текстовая строка, которая заменяет обрезанный текст. Её длинна НЕ включена в максимальную длину обрезаемой строки.
  • by_word, по умолчанию FALSE  —  определяет, обрезать ли строку в промежутке между словами (true) или строго на указанной длине (false).
  • middle, по умолчанию FALSE —  определяет, нужно ли обрезать строку в конце (false) или в середине строки (true).
{ $content | truncate : length : etc : by_words : middle }

 Применение truncate с параметрами:

// Можно изменить окончание или добавить к нему какой-либо текст
{$str | truncate : 20 : '... Читать полностью'} // Очень длинная строка... Читать полностью

// Можно обрезать текст в середине строки
{$str | truncate : 20 : ' ... ' : true : true} // Очень длинная строка ... 

// Если в тексте есть html теги, то лучше обрезать в конце строки.
{$content| truncate : 20 : ' ... ' : true} 
esc (tag) Экранирование HTML и MODx тегов.
{'Привет, [[+username]]' | esc} // тег username не будет обработан
notags (striptags, stripTags, strip_tags) Удаление HTML тегов из строки.
{'<b>Привет!</b>' | notags} // Привет!
stripmodxtags Удаление тегов MODx из строки.
{'Привет, [[+username]]' | stripmodxtags} // Привет,
cdata Оборачивает вывод тегами CDATA. Обычно это нужно для экранирования значений в XML разметке.
{'Тестовый текст' | cdata} // <!--[CDATA[Тестовый текст]]-->
reverse (strrev) Переворачивает строку или массив с конца в начало.
{'mirrortext' | reverse} // txetrorrim
wordwrap Вставляет перенос строки после каждого n-ого символа (слова не разбиваются).
{'very very long text' | wordwrap : 3} // very<br />very<br />long<br />text
wordwrapcut Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова.
{'very very long text' | wordwrapcut : 3} // ver<br />y<br />ver<br />y<br />lon<br />g<br />tex<br />t
fuzzydate Выводит дату относительно сегодня и вчера, используя словари системы. Если прошло уже больше 2х дней, то форматирует дату через strftime 
{'2016-03-20 13:15' | fuzzydate : '%d.%m.%Y'} // 20.03.2016
{'' | date : 'Y-m-d 13:15' | fuzzydate} // сегодня в 01:15 PM
declension (decl) Склоняет слово, следующее за числом по правилам русского языка. Например: 1 яблоко, 2 яблока, 10 яблок. Вторым параметром указывается выводить ли само число, по умолчанию выводится только подходящий вариант слова. Разделитель вариантов можно задавать третьим параметром, по умолчанию |
{6 | declension : 'яблоко|яблока|яблок'} // яблок
{3 | declension : 'яблоко|яблока|яблок' : true} // 3 яблока
{101 | decl : 'яблоко,яблока,яблок' : false : ','} // яблоко
ismember (memberof, mo) Проверка принадлежности пользователя к группе или группам пользователей MODx. Если переменная пуста, то проверка проводится для текущего пользователя.
{1 | ismember : 'Administrator'} // true
{0 | ismember : ['Administrator', 'Manager']} // false
isloggedin, isnotloggedin Проверка авторизации текущего пользователя в контексте. Если контекст не указан, то проверяется текущий.
{'' | isloggedin : 'web'} // true
{'' | isnotloggedin : 'web'} // false
url Генерация ссылки на документ системы через modX::makeUrl.
{10 | url}
{10 | url : ['scheme' => 'full'] : ['param' => 'value']}
lexicon Вывод записи из словарей системы через modX:<strong>lexicon</strong>. Некоторые словари предварительно нужно загрузить.
{$_modx->lexicon->load('en:core:default')}
{'action_err_nfs' | lexicon : ['id' => 25] : 'en'} // No action with 25 found.
user (userinfo) Вывод поля пользователя системы.
{1 | user : 'fullname'} // Administrator
resource Вывод поля документа системы. Можно выводить и ТВ параметры.
{1 | resource : 'longtitle'} // Home page
{1 | resource : 'my_tv'} // My_tv value
print Функция распечатки и экранирования любых переменных. Используется для отладки, когда нужно узнать, что находится внутри. Единственный параметр указывает, нужно ли обернуть данные в тег <pre> (по умолчанию — да).
{$_modx->resource | print} // Распечатает все поля ресурса, включая TV
{1 | resource | print} // Распечатает массив с данными всего ресурса, но без TV
{$_modx->getPlaceholders() | print} // Распечатает все плейсхолдеры ресурса
{0 | user : 'extended' | print : false} // Распечатает массив поля `extended` текущего пользователя в одну строку
setOption Выставление значения в массив modX:config. Обязательно нужно указать ключ значения в массиве.
{'Новое имя сайта' | setOption : 'site_name'}
option (getOption) Получение значения из массива modX::config
{'site_name' | option} // Новое имя сайта
setPlaceholder (toPlaceholder) Выставление значения в массив modX::placeholders. Обязательно нужно указать ключ значения в массиве.
{'My text' | setPlaceholder : 'my_text'}
placeholder (fromPlaceholder) Получение значения из массива modX::placeholders.
{'my_text' | placeholder} // My text
gettype Возвращает тип переменной.
{var $int = 123}
{var $float = 1.5}
{var $str = 'test'}

{$int | gettype} // integer
{$float | gettype} // double
{$str | gettype} // string

Размещение файлов и кода

Для работы функций регистрации скриптов и файлов, на странице должны быть теги head и body.

Модификатор Описание
cssToHead Регистрация CSS кода в шапке страницы.
{'assets/css/bootstrap.css' | cssToHead}
htmlToHead Регистрация произвольного HTML в шапке страницы.
{'<div class="content">some html</div>' | htmlToHead}
htmlToBottom Регистрация произвольного HTML в подвале страницы.
{'<div class="content">some html</div>' | htmlToBottom}
jsToHead Регистрация JavaScript файла в шапке страницы. Если передать параметром true, то можно регистрировать сразу код.
{'<script>alert();</script>' | jsToHead : true} // При загрузке страницы будет javascript alert
jsToBottom Регистрация JavaScript в подвале страницы. Если передать параметром true, то можно регистрировать сразу код.
{'<script>alert();</script>' | jsToBottom : true} // При загрузке страницы будет javascript alert

Аналоги Php функций

Модификатор Описание
is_string Проверяет, является ли переменная строкой
is_array Определяет, является ли переменная массивом
is_numeric Проверяет, является ли переменная числом или строкой, содержащей число
is_int Проверяет, является ли переменная целым числом
is_object Проверяет, является ли переменная объектом
is_double Проверяет, является ли переменная числом с плавающей точкой
ip2long Конвертирует строку, содержащую IPv4-адрес в целое число
long2ip Конвертирует целое число в IPv4-адрес

PCRE модификаторы

Модификаторы работающие на библиотеке Perl Compatible Regular Expressions, которая реализует работу регулярных выражений в стиле Perl (с некоторыми отличиями).

Модификатор Описание
preg_quote Добавляет обратный слеш перед каждым служебным символом. Служебными считаются следующие символы: 
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
preg_match Выполняет проверку на соответствие регулярному выражению.
// Если соответствует выражению, выведем email
{if 'email@mail.ru'|preg_match : '/^.+@.+\\.\\w+$/' }
    email
{/if}
preg_get

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

// Получим первое изображение из поля content
{set $image = $_modx->resource.content | preg_get : '!http://.+\.(?:jpe?g|png|gif)!Ui}
preg_get_all Выполняет поиск по регулярному выражению, результат содержит набор всех вхождений.
preg_grep Возвращает массив вхождений, которые соответствуют шаблону.
// В результате будут только даты
{["26-04-1974", "Сергей", "27-11-1977", "Юля"] | preg_grep : "/(\d{2})-(\d{2})-(\d{4})/" | print_r : true}
preg_replace Выполняет поиск и замену по регулярному выражению
// выведет адрес сайта без протокола https
Website: {'https://site.name'| preg_replace : '~^https?://~': ''}
preg_filter Выполняет поиск и замену по регулярному выражению идентична preg_replace за исключением того, что возвращает только те значения, в которых найдено совпадение.
preg_split Разбивает строку по регулярному выражению.
{'I love MODX' | preg_split : '/ /' | print_r : true}// Array ( [0] => I [1] => love [2] => MODX )

Собственные модификаторы Fenom

Начиная с версии 2.6.0 в fenom появилась возможность создавать собственные модификаторы, при помощи плагина и события pdoToolsOnFenomInit

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom
            Получаем переменную $fenom при его первой инициализации. 
            Теперь можем вызывать его методы.*/

        /** Добавим модификатор вывода имени домена сайта из произвольной ссылки.*/

        $fenom->addModifier('website', function ($input) {
            if (!$url = parse_url($input)) {
                return $input;
            }
            $output = str_replace('www.', '', $url['host']);

            return strtolower($output);
        });
        break;
}

Данный плагин позволяет вызывать модификатор website из любого места в коде. Поскольку этот модификатор является внутренним методом Fenom и загружается один раз — при его инициализации, то и работает он быстрее любого сниппета.

Пример создания собственного модификатора ignore

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('ignore', function ($input) {
            $output = '{ignore}' . $input . '{/ignore}';
            return $output;
        });
        break;
}

Применение:

<div data-attr='{'{"0":{"items":1,"nav":"false"},"100":{"items":2}}' | ignore}'>
tnx

При создании страницы были использованы материалы:

webinmind.ru