Фильтры в Revolution позволяют манипулировать тем, как будут обрабатываться те или иные теги. Они позволяют вам изменять значения прямо внутри ваших шаблонов.
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODX.
В MODX Revolution Фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро. Синтаксис модификаторов:
Фильтры могут применяться последовательно. Для этого напишите их подряд (слева направо):
Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
В таблице представлены некоторые модификаторы и примеры их использования. В примерах модификаторы применяются к плейсхолдерам, но вы должны помнить, что они могут применяться к любым тегам MODX. Убедитесь, что используемый тег выводит хоть что-то, что модификатор будет обрабатывать.
Модификатор | Описание | Пример использования |
---|---|---|
if, input | ||
or | Объединение нескольких модификаторов связью ИЛИ | [ [+numbooks:is=`5`:or:is=`6`:then=`Здесь 5 или 6 книг`:else=`Не уверен, сколько книг`] ] |
and | Объединение нескольких модификаторов связью И | |
isequalto, isequal, equalto, equals, is, eq | Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет - «else» | [ [+numbooks:isequalto=`5`:then=`Здесь 5 книг`:else=`Не уверен, сколько книг`] ] |
notequalto, notequals, isnt, isnot, neq, ne | Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет - «else» | [ [+numbooks:notequalto=`5`:then=`Не уверен, сколько книг`:else=`Здесь 5 книг`] ] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | То же, только условие «Больше или равно» | [ [+numbooks:gte=`5`:then=`Здесь 5 книг или больше`:else=`Здесь меньше пяти книг`] ] |
isgreaterthan, greaterthan, isgt, gt | То же, только условие «Строго больше» | [ [+numbooks:gt=`5`:then=`Здесь больше пяти книг`:else=`Здесь 5 книг или меньше`] ] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | То же, только условие «Меньше или равно» | [ [+numbooks:lte=`5`:then=`Здесь 5 книг или меньше`:else=`Здесь больше пяти книг`] ] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | То же, только условие «Строго меньше» | [ [+numbooks:lte=`5`:then=`Здесь меньше пяти книг`:else=`Здесь 5 книг или больше`] ] |
hide | Скрывает элемент, если условие выполняется | [ [+numbooks:lt=`1`:hide] ] |
show | Отображает элемент, если условие выполняется | [ [+numbooks:gt=`0`:show] ] |
then | Используется для составления условий | [ [+numbooks:gt=`0`:then=`Книги в наличии!`] ] |
else | Используется для составления условий (совместно с «then») | [ [+numbooks:gt=`0`:then=`Книги в наличии!`:else=`Простите, но все продано.`] ] |
select | ||
memberof, ismember, mo | Проверяет, является ли пользователь членом указанной группы пользователей | [ [+modx.user.id:memberof=`Administrator`] ] |
Модификатор | Описание | Пример использования |
---|---|---|
cat | Добавляет значение после тега | [ [+numbooks:cat=` книг`] ] |
lcase, lowercase, strtolower | Переводит все буквы в нижний регистр | [ [+title:lcase] ] |
ucase, uppercase, strtoupper | Переводит все буквы в верхний регистр | [ [+headline:ucase] ] |
ucwords | Делает первую букву в словах заглавной | [ [+title:ucwords] ] |
ucfirst | Делает первую букву в строке заглавной | [ [+name:ucfirst] ] |
htmlent, htmlentities | Преобразует все символы в HTML-сущности | [ [+email:htmlent] ] |
esc,escape | Безопасно экранирует символы, используя регулярные выражения и str_replace. Также экранирует символы [, ] и ` | [ [+email:escape] ] |
strip | Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом | [ [+textdocument:strip] ] |
stripString | Вырезает из строки указанную подстроку | [ [+name:stripString=`Mr.`] ] |
replace | Производит замену подстрок | [ [+pagetitle:replace=`Mr.==Mrs.`] ] |
striptags, stripTags,notags,strip_tags | Вырезает все теги (можно указать разрешенные теги). Не используйте для обеспечения безопасности. | [ [+code:strip_tags=`<p>`] ] |
len,length, strlen | Выводит длину строки | [ [+longstring:strlen] ] |
reverse, strrev | Переворачивает строку символ за символом | [ [+mirrortext:reverse] ] |
wordwrap | Вставляет перенос строки после каждого n-ого символа (слова не разбиваются) | [ [+bodytext:wordwrap=`80`] ] |
wordwrapcut | Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова | [ [+bodytext:wordwrapcut=`80`] ] |
limit | Выводит определенное количество символов с начала строки (значение по умолчанию - 100) | [ [+description:limit=`50`] ] |
ellipsis | Добавляет многоточие и обрезает строку, если она длиннее, чем определенное количество символов (значение по умолчанию - 100) | [ [+description:ellipsis=`50`] ] |
tag | Экранирование. Отображает элемент так как он есть, без :tag. Для использования в документации | [ [+showThis:tag] ] |
math | Возвращает результат продвинутых вычислений (нагружает на процессор. Не рекомендуется) | |
add,increment,incr | Прибавляет указанное число (значение по умолчанию +1) | [ [+downloads:incr] ] [ [+blackjack:add=`21`] ] |
subtract,decrement,decr | Вычитает указанное число (значение по умолчанию -1) | [ [+countdown:decr] ] [ [+moneys:subtract=`100`] ] |
multiply,mpy | Умножает на указанное число (значение по умолчанию *2) | [ [+trifecta:mpy=`3`] ] |
divide,div | Делит на указанное число (значение по умолчанию /2) | [ [+rating:div=`4`] ] |
modulus,mod | Возвращает модуль числа (по-умолчанию: %2, возвращает 0 или 1) ) | [ [+number:mod] ] |
ifempty,default,empty, isempty | Возращает значение модификатора, если значение тега пусто | [ [+name:default=`anonymous`] ] |
notempty, !empty, ifnotempty, isnotempty | Возращает значение модификатора, если значение тега НЕпусто | [ [+name:notempty=`Hello [ [+name] ]!`] ] |
nl2br | Заменяет символы новой строки (\n) на HTML-тег <br /> | [ [+textfile:nl2br] ] |
date | Переводит таймстамп в текст, в соответствии с указанным форматом (Формат даты) | [ [+birthyear:date=`%Y`] ] |
strtotime | Переводит дату в виде текста в UNIX таймстамп | [ [+thetime:strtotime] ] |
fuzzydate | Возвращает дату в формате "вчера, сегодня...". Принимает значение даты. | [ [+createdon:fuzzydate] ] |
ago | Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. | [ [+createdon:ago] ] |
md5 | Создает MD5-хеш значения | [ [+password:md5] ] |
cdata | Оборачивает вывод тегами CDATA | [ [+content:cdata] ] |
userinfo | Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя | [ [+modx.user.id:userinfo=`username`] ] |
isloggedin | Возвращает true, если пользователь аутентифицирован в текущем контексте | [ [+modx.user.id:isloggedin] ] |
isnotloggedin | Возвращает true, если пользователь НЕаутентифицирован в текущем контексте | [ [+modx.user.id:isnotloggedin] ] |
urlencode | Конвертирует значение в URL | [ [+mystring:urlencode] ] |
urldecode | Конвертирует значение из URL | [ [+myparam:urldecode] ] |
В общем случае, содержимое плейсхолдера, которое изменяется динамически, не должно кешироваться. Например:
Результат работы примера может быть пустым, а может и нет. Как мы можем кешировать это? Пример, приведенный выше, отражает природу модификатора вывода.
Возможно применение модификаторов вывода в кешируемом плейсхолдере - но только если Сниппет может быть кеширован. Иначе, мы совершаем алогичное действие - пытаемся кешировать то, что не является статическим содержимым.
Получаем правило: нельзя устанавливать кеширование плейсхолдера в некешируемом сниппете, если результат работы сниппета может изменяться.
Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:
Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет makeExciting, добавляющий к выводу определенное количество восклицательных знаков:
Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:
Параметр | Значение | Значение в примере |
---|---|---|
input | Значение элемента | В переменной $input будет значение заголовка страницы ([ [*pagetitle] ]) |
options | Значение модификатора (после знака =) | $options = 4; |
token | Тип элемента | $token = "*"; (символ, определяющий, что данный элемент - поле ресурса |
name | Имя элемента | $name = "pagetitle"; |
tag | Весь тег полностью | $tag = "[ [*pagetitle:makeExciting=`4`] ]"; |
Хорошим примером цепочки фильтров будет форматирование даты, например, так:
Прямой доступ к данным из таблицы modx_user_attributes в базе данных, с помощью модификаторов вывода вместо сниппетов, может быть достигнуто просто за счет использования модификатора UserInfo. Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:
[ [ ! + modx . user . id] ] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [ [*createdby] ] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.
Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор UserInfo:
[ [!+modx.user.id] ] - Выведет ID пользователя
[ [!+modx.user.username] ] - Выведет логин пользователя
Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.
Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения):
Открыть ещеФильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков, сниппетах.
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри ядра MODX.
В MODX Revolution фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро.
Синтаксис модификаторов:
[[element:modifier=`value`]]
Фильтры могут применяться последовательно (пишутся слева направо):
[[element:modifier=`value`:anothermodifier=`value2`:andanothermodifier:yetanother=`value3`]]
Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
[[Snippet:modifier=`value`? &SnippetParam=`something`]]
В таблице представлены некоторые модификаторы и примеры их использования. В примерах они применяются к плейсхолдерам, но вы должны помнить, что модификаторы могут применяться к любым тегам MODX.
Модификатор | Описание | Пример использования |
if, input | ||
or | Объединение нескольких модификаторов связью ИЛИ | [[+numProducts:is=`10`:or:is=`11`:then=`Здесь 10 или 11 товаров`:else=`Не уверен, сколько товаров`]] |
and | Объединение нескольких модификаторов связью И | |
isequalto, isequal, equalto, equals, is, eq | Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет — «else» | [[+numProducts:isequalto=`10`:then=`Здесь 10 товаров`:else=`Не уверен, сколько товаров`]] |
notequalto, notequals, isnt, isnot, neq, ne | Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет — «else» | [[+numProducts:notequalto=`10`:then=`Не уверен, сколько товаров`:else=`Здесь 10 товаров`]] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | То же, только условие «Больше или равно» | [[+numProducts:gte=`10`:then=`Здесь 10 товаров или больше`:else=`Здесь меньше 10 товаров`]] |
isgreaterthan, greaterthan, isgt, gt | То же, только условие «Строго больше» | [[+numProducts:gt=`10`:then=`Здесь больше 10 товаров`:else=`Здесь 10 товаров или меньше`]] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | То же, только условие «Меньше или равно» | [[+numProducts:lte=`10`:then=`Здесь 10 товаров или меньше`:else=`Здесь больше 10 товаров`]] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | То же, только условие «Строго меньше» | [[+numProducts:lte=`10`:then=`Здесь меньше 10 товаров`:else=`Здесь 10 товаров или больше`]] |
hide | Скрывает элемент, если условие выполняется | [[+numProducts:lt=`1`:hide]] |
show | Отображает элемент, если условие выполняется | [[+numProducts:gt=`0`:show]] |
then | Используется для составления условий | [[+numProducts:gt=`0`:then=`Товары в наличии!`]] |
else | Используется для составления условий (совместно с «then») | [[+numProducts:gt=`0`:then=`Товары в наличии!`:else=`Простите, но все продано.`]] |
select | ||
memberof, ismember, mo | Проверяет, является ли пользователь членом указанной группы пользователей | [[+modx.user.id:memberof=`Administrator`]] |
Модификатор | Описание | Пример использования |
---|---|---|
cat | Добавляет значение после тега | [[+numProducts:cat=` товаров`]] |
lcase, lowercase, strtolower | Переводит все буквы в нижний регистр | [[+title:lcase]] |
ucase, uppercase, strtoupper | Переводит все буквы в верхний регистр | [[+longtitle:ucase]] |
ucwords | Делает первую букву в словах заглавной | [[+title:ucwords]] |
ucfirst | Делает первую букву в строке заглавной | [[+name:ucfirst]] |
htmlent, htmlentities | Преобразует все символы в | [[+email:htmlent]] |
esc,escape | Безопасно экранирует символы, используя регулярные выражения и str_replace. Также экранирует символы [, ] и ` | [[+email:escape]] |
strip | Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом | [[+textdocument:strip]] |
stripString | Вырезает из строки указанную подстроку | [[+name:stripString=`Mr.`]] |
replace | Производит замену подстрок | [[+pagetitle:replace=`Mr.==Mrs.`]] |
striptags, stripTags,notags,strip_tags | Вырезает все теги (можно указать разрешенные теги). | [[+code:strip_tags=`<p>`]] |
len,length, strlen | Выводит длину строки | [[+longstring:strlen]] |
reverse, strrev | Переворачивает строку символ за символом | [[+mirrortext:reverse]] |
wordwrap | Вставляет перенос строки после каждого | [[+bodytext:wordwrap=`80`]] |
wordwrapcut | Вставляет перенос строки после каждого | [[+bodytext:wordwrapcut=`80`]] |
limit | Выводит определенное количество символов с начала строки (значение по умолчанию — 100) | [[+description:limit=`50`]] |
ellipsis | Добавляет многоточие и обрезает строку, если она длиннее, чем определенное количество символов (значение по умолчанию — 100) | [[+description:ellipsis=`50`]] |
tag | Экранирование. Отображает элемент так как он есть, без:tag. Для использования в документации | [[+showThis:tag]] |
math | Возвращает результат продвинутых вычислений (нагружает на процессор. Не рекомендуется) | |
add,increment,incr | Прибавляет указанное число (значение по умолчанию +1) | [[+downloads:incr]] [[+blackjack:add=`21`]] |
subtract,decrement,decr | Вычитает указанное число (значение по умолчанию -1) | [[+countdown:decr]] [[+moneys:subtract=`100`]] |
multiply,mpy | Умножает на указанное число (значение по умолчанию *2) | [[+trifecta:mpy=`3`]] |
divide,div | Делит на указанное число (значение по умолчанию /2) | [[+rating:div=`4`]] |
modulus,mod | Возвращает модуль числа ( | [[+number:mod]] |
ifempty,default,empty, isempty | Возвращает значение модификатора, если значение тега пусто | [[+name:default=`anonymous`]] |
notempty, !empty, ifnotempty, isnotempty | Возвращает значение модификатора, если значение тега НЕ пусто | [[+name:notempty=`Привет, [[+name]]!`]] |
nl2br | Заменяет символы новой строки (\n) на | [[+textfile:nl2br]] |
date | Переводит таймстамп в текст, в соответствии с указанным форматом (Формат даты) | [[+birthyear:date=`%Y`]] |
strtotime | Переводит дату в виде текста в UNIX таймстамп | [[+thetime:strtotime]] |
fuzzydate | Возвращает дату в формате «вчера, сегодня, …». Принимает значение даты. | [[+createdon:fuzzydate]] |
ago | Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. | [[+createdon:ago]] |
md5 | Создает | [[+password:md5]] |
cdata | Оборачивает вывод тегами CDATA | [[+content:cdata]] |
userinfo | Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя | [[+modx.user.id:userinfo=`username`]] |
isloggedin | Возвращает true, если пользователь аутентифицирован в текущем контексте | [[+modx.user.id:isloggedin]] |
isnotloggedin | Возвращает true, если пользователь НЕаутентифицирован в текущем контексте | [[+modx.user.id:isnotloggedin]] |
urlencode | Конвертирует значение в URL | [[+mystring:urlencode]] |
urldecode | Конвертирует значение из URL | [[+myparam:urldecode]] |
В общем случае, содержимое плейсхолдера, которое изменяется динамически, не должно кешироваться.
Например:
[[+placeholder:default=`К сожалению, ничего не найдено`]]
Результат работы примера может быть пустым, а может и нет. Как мы можем кешировать это? Пример, приведенный выше, отражает природу модификатора вывода.
Возможно применение модификаторов вывода в кешируемом плейсхолдере — но только если Сниппет может быть кеширован. Иначе, мы совершаем алогичное действие — пытаемся кешировать то, что не является статическим содержимым.
Получаем правило: нельзя устанавливать кеширование плейсхолдера в некешируемом сниппете, если результат работы сниппета может изменяться.
Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:
[[!pdoResources:default=`К сожалению, ничего не найдено`?
&parents=`5`
&depth=`5`
&tpl=`news_tpl`
&includeTVs=`image`
]]
Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет makeExciting, добавляющий к выводу определенное количество восклицательных знаков:
[[*pagetitle:makeExciting=`4`]]
Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:
Параметр | Значение | Значение в примере |
input | Значение элемента | В переменной $input будет значение заголовка страницы ([[*pagetitle]]) |
options | Значение модификатора (после знака =) | $options = 4; |
token | Тип элемента | $token = «*«; (символ, определяющий, что данный элемент — поле ресурса |
name | Имя элемента | $name = «pagetitle»; |
tag | Весь тег полностью | $tag = «[[*pagetitle:makeExciting=`4`]]«; |
Прямой доступ к данным из таблицы modx_user_attributes в базе данных, с помощью модификаторов вывода вместо сниппетов, может быть достигнуто просто за счет использования модификатора UserInfo.
Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:
Значение | Модификатор |
Внутренний ключ пользователя | [[!+modx.user.id:userinfo=`internalKey`]] |
Логин | [[!+modx.user.id:userinfo=`username`]] |
Полное имя | [[!+modx.user.id:userinfo=`fullname`]] |
Роль | [[!+modx.user.id:userinfo=`role`]] |
[[!+modx.user.id:userinfo=`email`]] | |
Телефон | [[!+modx.user.id:userinfo=`phone`]] |
Мобильный телефон | [[!+modx.user.id:userinfo=`mobilephone`]] |
Факс | [[!+modx.user.id:userinfo=`fax`]] |
Дата рождения | [[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]] |
Пол | [[!+modx.user.id:userinfo=`gender`]] |
Страна | [[+modx.user.id:userinfo=`country`]] |
Область | [[+modx.user.id:userinfo=`state`]] |
Почтовый индекс | [[+modx.user.id:userinfo=`zip`]] |
Фото | [[+modx.user.id:userinfo=`photo`]] |
Комментарий | [[+modx.user.id:userinfo=`comment`]] |
Пароль | [[+modx.user.id:userinfo=`password`]] |
Кеш пароля | [[+modx.user.id:userinfo=`cachepwd`]] |
Последняя авторизация | [[+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]] |
Дата текущей авторизации | [[+modx.user.id:userinfo=`thislogin`:date=`%Y-%m-%d`]] |
Количество авторизаций | [[+modx.user.id:userinfo=`logincount`]] |
[[!+modx.user.id]] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [[*createdby]] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.
Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор UserInfo:
[[!+modx.user.id]] — Выведет ID пользователя
[[!+modx.user.username]] — Выведет логин пользователя
Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.
Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения):
// Используем модификатор:
[[+title:lcase]]
[[+something:notempty=`Hello[[+name]]`]]
// Используем сниппет:
[[lcase? &subject=`title`]]
[[notempty? &subject=`something` &then=`Hello[[+name]]`]]
// Используем общий сниппет фильтра:
[[Filter? &subject=`title` &operator=`lcase`]]
[[Filter? &subject=`something` &operator=`notempty` &meter=`Hello [[+name]]`]]
Материал взят отсюда — Фильтры
26.05.2017 07:15 3837
26.05.2017 07:15 3074
26.08.2016 00:00 2801
26.05.2017 07:15 1969
26.02.2017 00:00 1310
03.12.2014 15:54 1561
24.01.2015 14:00 974
25.03.2016 15:37 4335
12.01.2015 08:00 1148
12.01.2015 08:00 1363
06.10.2014 15:54 3201
06.03.2015 04:15 2775
12.10.2014 15:58 1076
30.01.2015 09:00 1687
12.10.2014 15:58 1010
03.04.2015 00:00 1955
12.01.2015 15:54 1048
24.12.2015 11:47 2984
09.06.2017 00:00 2052
09.12.2014 15:00 2107
05.05.2018 07:15 2236
20.04.2016 00:00 3364
12.10.2014 15:58 1331
10.05.2015 15:54 4097
02.09.2015 15:54 2102
06.04.2014 16:40 1741
01.11.2016 09:23 2364