Модификаторы
Модификаторы Fenom в MODx
Оглавление
- Модификаторы Fenom в MODx
- Встроенные модификаторы
- date
- date_format
- escape (e)
- unescape
- truncate (ellipsis)
- strip
- length (len, strlen)
- count
- in
- iterable
- replace
- ereplace
- match
- ematch
- split
- esplit
- join
- number (number_format)
- md5, sha1, crc32
- urldecode, urlencode, rawurldecode
- base64_decode, base64_encode
- json_encode (toJSON), json_decode (fromJSON)
- http_build_query
- print_r
- var_dump (dump)
- nl2br
- lower (low, lcase, lowercase, strtolower)
- upper (up, ucase, uppercase, strtoupper)
- ucwords
- ucfirst
- htmlent (htmlentities)
- limit
- esc (tag)
- notags (striptags, stripTags, strip_tags)
- stripmodxtags
- cdata
- reverse (strrev)
- wordwrap
- wordwrapcut
- fuzzydate
- declension (decl)
- ismember (memberof, mo)
- isloggedin, isnotloggedin
- url
- lexicon
- user (userinfo)
- resource
- setOption
- option (getOption)
- setPlaceholder (toPlaceholder)
- placeholder (fromPlaceholder)
- cssToHead
- htmlToHead
- htmlToBottom
- jsToHead
- jsToBottom
- gettype
- Другие модификаторы (функции)
- Встроенные модификаторы
- PCRE модификаторы
Для начала рекомендую почитать официальную документацию по модификаторам в 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'}
Модификатор поддерживает несколько режимов работы:
html
— экранирует HTML сущности в строке.url
— экранирует строку для использования в URL.js
— экранирует строку для использования в JavaScript.
{'<p>value</p>' | escape : 'html' : 'utf-8'} // <p>value</p>
{'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
.
{'<p>value</p>' | 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}
$length
, обязателен. Определяет максимальную длину обрезаемой строки.$etc
, по умолчанию … Текстовая строка, которая заменяет обрезанный текст. Её длинна НЕ включена в максимальную длину обрезаемой строки.$by_word
, по умолчанию FALSE. Определяет, обрезать ли строку в промежутке между словами (true) или строго на указанной длине (false).$middle
, по умолчанию FALSE. Определяет, нужно ли обрезать строку в конце (false) или в середине строки (true).
{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}
Специальные символы:
?
— соответствие одному или нулю любых символов.?at
соответствуетCat
,cat
,Bat
илиbat
.*
— соответствие любому количеству символов.Law*
соответствуетLaw
,Laws
, илиLawyer
.[characters]
— соответствие символа группе символов.[CB]at
соответствуетCat
илиBat
, но неcat
,rat
илиbat
.\
— экрнирующийсимвол.Law\*
будет соответвовать толькоLaw*
.
{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}
$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} // <b>Текст для проверки</b>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
Функция распечатки и экранирования любых переменных. Очень удобно использовать для отладки, когда нужно узнать, что находится внутри. Единственный параметр указывает, нужно ли обернуть данные в тег <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
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 )
Время запросов: 0,1247 s
Количество запросов: 27
Источник: cache