19 октября 2011 г.

В этой статье Я бы хотел рассказать Вам о фильтрах (модификаторах) в MODx.

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

В этой статье Я буду говорить про MODx Revolution. Возможность применять фильтры существует благодаря сниппету PHx, который по умолчанию уже встроен в ядро MODx Revolution, в ядре же Evolution PHx отсутствует, поэтому на Evo его необходимо устанавливать отдельно.

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

Синтаксис фильтров выглядит следующим образом:

[[element:modifier=`value`]]

Очень удобно то, что их можно выстраивать в цепочки:

[[element:modifier:anothermodifier=`value`:andanothermodifier:yetanother=`value2`]]

При этом, передавать параметры в сниппеты также возможно. Главное, чтобы фильтр прописывался между названием сниппета и вопросительным знаком:

[[mySnippet:modifier=`value`? &mySnippetParam=`something`]]

В следующей таблице перечислены некоторые фильтры и на примере показано их применение. Хоть в примерах и использован плейсхолдер, но фильтры могут применяться к любому тэгу MODx'а. Убедитесь в том, что плейсхолдер действительно что-либо возвращает.

Условные модификаторы

МодификаторОписаниеПример
or  Может использоваться со строковыми модификаторами для организации отношения логического "И"  
and  Может использоваться со строковыми модификаторами для организации отношения логического "ИЛИ"  
isequalto, isequal, equalto, equals, is, eq  Сравнивает вывод с заданным значением и в случае совпадения продолжает парсинг тэга. Используется совместно с "then" и "else"  [[+numbooks:isequalto=`5`:then=`There are 5 books!`:else=`Not sure how many books`]]
notequalto, notequals, isnt, isnot, neq, ne  Сравнивает вывод с заданным значением и в случае не совпадения продолжает парсинг тэга. Используется совместно с "then" и "else"  [[+numbooks:notequalto=`5`:then=`Not sure how many books`:else=`There are 5 books!`]]
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte 

Сравнивает вывод с заданным значением и в случае если вывод больше либо равен переданному значению продолжает парсинг тэга. Используется совместно с "then" и "else"

[[+numbooks:gte=`5`:then=`There are 5 books or more than 5 books`:else=`There are less than 5 books`]] 
isgreaterthan, greaterthan, isgt, gt 

Сравнивает вывод с заданным значением. Если вывод больше -продолжает парсинг. Используется с "then" и "else"

[[+numbooks:gt=`5`:then=`There are more than 5 books`:else=`There are less than 5 books`]]
equaltoorlessthan, lessthanorequalto, el, le, islte, lte  Сравнивает вывод с заданным значением и в случае если вывод меньше либо равен переданному значению продолжает парсинг тэга. Используется совместно с "then" и "else" [[+numbooks:lte=`5`:then=`There are 5 or less than 5 books`:else=`There are more than 5 books`]] 
islowerthan, islessthan, lowerthan, lessthan, islt, lt  Сравнивает вывод с заданным значением. Если вывод меньше -продолжает парсинг. Используется с "then" и "else" [[+numbooks:lte=`5`:then=`Менее 5 книг`:else=`Более 5 книг`]]
hide  Проверяет предшествующие условия. Если они были истинными - скрывает элемент. [[+numbooks:lt=`1`:hide]] 
show  Проверяет предшествующие условия. Если они были истинными - отображает элемент. [[+numbooks:gt=`0`:show]] 
then  Используется как следствие какого-либо условия [[+numbooks:gt=`0`:then=`Now available!`]] 
else  Используется как следствие какого-либо условия. Применяется совместно с "then" [[+numbooks:gt=`0`:then=`Now available!`:else=`Sorry, currently sold out.`]] 
memberof, ismember, mo  Возвращает результат проверки на принадлежность пользователя заданной группе. [[+modx.user.id:memberof=`Administrator`]] 

 

Строковые модификаторы 

МодификаторОписание Пример
cat Добавляет к выводу указанную строку, если вывод не пустой. [[+numbooks:cat=` books`]]
lcase, lowercase, strtolower Переводит все символы строки в нижний регистр. Идентично функции PHP strtolower [[+title:lcase]]
ucase, uppercase, strtoupper Переводит все символы строки в верхний регистр. Идентично функции PHP strtoupper [[+headline:ucase]]
ucwords Переводит первые буквы всех слов в строке в верхний регистр. Идентично функции PHP ucwords [[+title:ucwords]]
ucfirst Переводит первую букву строки в верхний регистр. Идентично функции PHP ucfirst [[+name:ucfirst]]
htmlent, htmlentities

Идентично функции PHP htmlentities. Использует текущее значение системного параметра "modx_charset" с флагом ENT_QUOTES

[[+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 Удаляет все PHP и HTML тэги за исключением указанного. Идентично функции PHP strip_tags [[+code:strip_tags=`<p>`]]
len,length, strlen  Выводит длину строки. Идентично функции PHP strlen [[+longstring:strlen]]
reverse, strrev Идентично функции PHP strrev [[+mirrortext:reverse]]
wordwrap Идентично функции PHP wordwrap. Принимает оптимальное значение для установки позиции переноса слов. [[+bodytext:wordwrap=`80`]]
wordwrapcut Идентично функции PHP wordwrap с разрывом слов.  Принимает оптимальное значение для установки позиции переноса слов. [[+bodytext:wordwrapcut=`80`]]
limit Ограничивает (обрезает) длину строки в заданное количество символов. По умолчанию ограничение длины составляет 100 символов. [[+description:limit=`50`]]
ellipsis Обрезает строку до заданного количества символов и добавялет многоточие. По умолчанию ограничение составляет 100 символов. [[+description:ellipsis=`50`]]
tag Отображает вызываемый элемент без :tag. Полезно для документации, например, как у меня =) [[+showThis]]
math Возвращает результат вычислений (не рекомендуется т.к. создает нагрузку на процессор)  
add,increment,incr Возвращает значение наращенное на заданную величину (по умолчанию на единицу) [[+downloads:incr]] 
[[+blackjack:add=`21`]]
subtract,decrement,decr Декрементирует из значения заданную величину (по умолчанию: -1) [[+countdown:decr]] 
[[+moneys:subtract=`100`]]
multiply,mpy Возвращает результат умножения на число (по умолчанию: *2) [[+trifecta:mpy=`3`]]
divide,div Возвращает результат деления на число (умолчание: /2) Не допускается 0. [[+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 Идентично функции PHP nl2br. Все переносы строк заменяет на <br> [[+textfile:nl2br]]
date Идентично функции PHP strftime. Формат передается в качестве значения. См. Date Formats. [[+birthyear:date=`%Y`]]
strtotime Идентично функции PHP strtotime. Применимо только к датам. См Date Formats. [[+thetime:strtotime]]
fuzzydate Возвращает дату в формате "сегодня в 13:40", "вчера в 18:40". [[+publishedon:fuzzydate]]
ago Возвращает количество секунд, минут, часов, недель и т.д от даты до текущего момента. Применимо только к датам [[+createdon:ago]]
md5 Идентично функции PHP md5. [[+password:md5]]
cdata Заключает строку в тэги CDATA. [[+content:cdata]]
userinfo Возвращает запрашиваемы пользовательские данные. Применимо к ID пользователя в MODx. В модификатор передается поле, которое необходимо возвратить. [[+modx.user.id:userinfo=`username`]]
isloggedin Возвращает "true" если пользователь авторизован в данном контексте. [[+modx.user.id:isloggedin]]
isnotloggedin Возвращает "true" если пользователь авторизован в данном контексте [[+modx.user.id:isnotloggedin]]
urlencode Идентично функции PHP urlencode [[+mystring:urlencode]]
urldecode Идентично функции PHP urldecode [[+myparam:urldecode]]

 

Создание пользовательский модификаторов

Сниппеты могут использоваться в качестве модификаторов. Для этого просто вместо название фильтра следует вписать имя сниппета. Например, у нас есть сниппет с названием "makeDownloadLink"

[[+file:makeDownloadLink=`notitle`]]

Этот вызов передаст в сниппет следующие параметры:

ПараметрЗначениеПример результата
input Значение вывода. Значение, которое передает
options Любое значение переданное в модификатор. 'notitle'
token Тип элемента, к которому применяется модификатор. + (токен перед `file`)
name Имя, к которому применяется модификатор. file
tag Строка вызова [[+file:makeDownloadLink=`notitle`]]

Результатом будет являться то, что будет возвращать сниппет.


Примеры использования

Здесь приведен пример, когда фильтры вызываются друг за другом. Данный пример форматирует дату из строки в другой формат:

[[+mydate:strtotime:date=`%Y-%m-%d`]]

Прямой доступ к таблице modx_user_attributes из базы данных из сниппета может быть заменен на простое использование модификатора userinfo. Для получения нужного поля, необходимо в параметры модификатора передать название столбца из БД.

Внутренний ключ: [[!+modx.user.id:userinfo=`internalKey`]]<br>
Имя пользователя: [[!+modx.user.id:userinfo=`username`]]<br>
Полное имя: [[!+modx.user.id:userinfo=`fullname`]]<br>
Роль: [[!+modx.user.id:userinfo=`role`]]<br>
E-mail: [[!+modx.user.id:userinfo=`email`]]<br>
Телефон: [[!+modx.user.id:userinfo=`phone`]]<br>
Мобильный: [[!+modx.user.id:userinfo=`mobilephone`]]<br>
Факс: [[!+modx.user.id:userinfo=`fax`]]<br>
Дата рождения: [[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]]<br>
Пол: [[!+modx.user.id:userinfo=`gender`]]<br>
Страна: [[+modx.user.id:userinfo=`country`]]<br>
Область: [[+modx.user.id:userinfo=`state`]]<br>
Почтовый индекс: [[+modx.user.id:userinfo=`zip`]]<br>
Аватарка: [[+modx.user.id:userinfo=`photo`]]<br>
Комментарий: [[+modx.user.id:userinfo=`comment`]]<br>
Пароль: [[+modx.user.id:userinfo=`password`]]<br>
Кэш пароля: [[+modx.user.id:userinfo=`cachepwd`]]<br>
Дата последнего логина: [[+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]]<br>
Дата текущего логина:[[+modx.user.id:userinfo=`thislogin`:date=`%Y-%m-%d`]]<br>
Число входов: [[+modx.user.id:userinfo=`logincount`]]

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

Вот, вкратце о модификаторах (фильтрах), которые могут быть полезны при создании сайта на MODx Revolution. Впрочем данный материал также применим и для Evolution.

Буду рад если статья будет кому-то полезна. Если где-то заметите ошибку - дайте мне знать =)

Материал взят отсюда

Автор: Артур Минимулин ⚫ 19 октября 2011 г.Тэги: