Оглавление

Для начала рекомендую почитать официальную документацию по модификаторам в Fenom.

Модификаторы Fenom в MODx

Fenom умеет использовать сниппеты MODx в качестве модификаторов. Например, установив компонент dateAgo, вы сразу можете использовать его для вывода дат:

{$_modx->runSnippet('!pdoPage', [
    'parents' => 0,
    'tpl' => '@INLINE <p>{$id} - {$pagetitle} {$createdon | dateago}</p>',
])}

Также работает и Jevix, и любые другие сниппеты-фильтры MODx, которые принимают параметры $input и $options.

{$_modx->runSnippet('!pdoPage', [
    'parents' => 0,
    'includeContent' => 1,
    'tpl' => '@INLINE <p>{$id} - {$pagetitle} {$createdon | dateago} {$content | jevix}</p>',
])}

Модификаторы могут работать последовательно:

{$_modx->runSnippet('!pdoPage', [
    'parents' => 0,
    'includeContent' => 1,
    'tpl' => '@INLINE <p>{$id} - {$pagetitle} {$createdon | date_format:"%Y-%m-%d %H:%M:%S" | dateago}</p>',
])}

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

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

В Fenom есть встроенные модификаторы. Модификаторы могут быть применены к переменным, пользовательским функциям или строкам. Для их применения надо после модифицируемого значения указать символ | (вертикальная черта) и название модификатора. Так же модификаторы могут принимать параметры, которые влияют на их поведение. Эти параметры следуют за названием модификатора и разделяются : (двоеточием).

Вот список модификаторов и описание (в скобках указаны равноценные синонимы):

date

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

{'2015-01-10 12:45' | date : 'd.m.Y'} // 10.01.2015
{'' | date : 'Y'} // текущий год

date_format

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

{'2015-01-10 12:45' | date_format : '%d.%m.%Y'} // 10.01.2015
{'' | date_format : '%Y'} // текущий год

escape (e)

Экранирование переменной. Первым параметром принимает режим работы, вторым — кодировку. Используется для кодирования или экранирования спецсимволов по алгоритмам экранирования HTML, URL’ов и Javascript. По умолчанию активирован режим экранирования HTML.

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

Модификатор поддерживает несколько режимов работы:

{'<p>value</p>' | escape : 'html' : 'utf-8'} // &lt;p&gt;value&lt;/p&gt;
{'http://site.com/?key=value' | escape : 'url'} // http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue
{['key' => 'value'] | escape : 'js'}

unescape

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

{'&lt;p&gt;value&lt;/p&gt;' | unescape : 'html' : 'utf-8'} // <p>value</p>
{'http%3A%2F%2Fsite.com%2F%3Fkey%3Dvalue' | unescape : 'url'} // http://site.com/?key=value
{'{"key":"value"}' | unescape : 'js'}

truncate (ellipsis)

Обрезает переменную до определенной длинны, по умолчанию — 80 символов. В качестве необязательного второго параметра, вы можете передать строку текста, которая будет отображаться в конце обрезанной переменной. Символы этой строки не включаются в общую длину обрезаемой строки. По умолчанию, truncate попытается обрезать строку в промежутке между словами. Если вы хотите обрезать строку строго на указанной длине, передайте в третий необязательный параметр значение true.

{$long_string|truncate:$length:$etc:$by_words:$middle}
{var $str = 'very very long string'}
{$str | truncate : 10 : ' read more...'} // very very read more...
{$str | truncate : 5 : ' ... ' : true : true} // very ... string

strip

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

{"text     with      spaces"|strip} // text with spaces
{"    multi
    line
    text    "|strip:true} // multi line text

length (len, strlen)

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

{'var' | length} // 3
{['key' => 'value'] | len} // 1
{if $images | length > 5}
    to many images
{/if}

count

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

{set $array = [
"foo" => "bar",
"bar" => "foo",
]}
{$array | count} // 2

in

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

{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

Заменяет все вхождения строки поиска на строку замены.

{$string|replace:$search:$replace}

Возвращает строку, в котором все вхождения $search в $subject заменены на $replace.

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

ereplace

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

{$string|ereplace:$pattern:$replacement}

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

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

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

match

Проверяет совпадение строки с паттерном. Среднестатистический пользователь знаком с подстановками оболочки, как минимум с самыми простыми из них — ? и *, так что использование match вместо ematch для поиска в пользовательской части сайта может быть намного удобнее для пользователей, не являющихся программистами.

{$string|match:$pattern}

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

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

ematch

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

{$string|ematch:$pattern}

Ищет в заданном тексте $subject совпадения с шаблоном $pattern.

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

split

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

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

Возвращает массив строк, полученных разбиением строки с использованием $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 = ","}

Объединяет элементы массива с помощью строки $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}

md5, sha1, crc32

Подсчёт контрольной суммы строки разными алгоритмами.

{'text' | md5} // 1cb251ec0d568de6a929b520c4aed8d1
{'text' | sha1} // 372ea08cab33e71c02c651dbc83a474d32c676ea
{'text' | crc32} // 999008199

urldecode, urlencode, rawurldecode

Обработка строки соответствующей 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 strtolower().

{'Текст для проверки' | lower} // текст для проверки

upper (up, ucase, uppercase, strtoupper)

Переводит строку в верхний регистр. Является эквивалентом функции PHP strtoupper().

{'Текст для проверки' | upper} // ТЕКСТ ДЛЯ ПРОВЕРКИ

ucwords

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

{'теКст Для провЕрки' | ucwords} // Текст Для Проверки

ucfirst

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

{'теКст Для провЕрки' | ucfirst} // Текст для проверки

htmlent (htmlentities)

Преобразует все возможные символы в соответствующие HTML-сущности.

{'<b>Текст для проверки</b>' | htmlent} // &lt;b&gt;Текст для проверки&lt;/b&gt;gt;

limit

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

{'Привет, как дела' | limit : 6} // Привет

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:lexicon. Некоторые словари предварительно нужно загрузить.

{$_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> (по умолчанию — да).

{1 | resource | 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

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

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

gettype

Возвращает тип переменной.

{var $int = 123}
{var $float = 1.5}
{var $str = 'test'}
{$int | gettype} // integer
{$float | gettype} // double
{$str | gettype} // string

Другие модификаторы (функции)

Помимо описанных выше, в Fenom присутствую следующие функции:

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

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

Например, выведем название сайта без http:

Website: {'http://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 )