Фильтры в 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](http://www.php.net/manual/ru/function.str-replace.php). Также экранирует символы [, ] и `   [[+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  Переводит таймстамп в текст, в соответствии с указанным форматом ([Формат даты](http://rtfm.modx.com/display/revolution20/Date+Formats))  [[+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`]]"; 

Цепочки фильтров (Множественные модификаторы)

Хорошим примером цепочки фильтров будет форматирование даты, например, так:

Модификатор UserInfo

Прямой доступ к данным из таблицы modx_user_attributes в базе данных, с помощью модификаторов вывода вместо сниппетов, может быть достигнуто просто за счет использования модификатора UserInfo. Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:

[[!+modx.user.id]] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [[*createdby]] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.

Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор UserInfo:

[[!+modx.user.id]] - Выведет ID пользователя

[[!+modx.user.username]] - Выведет логин пользователя Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.

Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения):