Open
Close

Modx revo модификаторы. Универсальный фильтр ресурсов. Создаем новые параметры и присваиваем значения

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

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

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

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

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

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

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

В следующей таблице перечислены некоторые фильтры и на примере показано их применение . Хоть в примерах и использован плейсхолдер, но фильтры могут применяться к любому тэгу 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=`

`]]

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 . Все переносы строк заменяет на
[[+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`]]

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


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

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

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

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

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

Внутренний ключ: [[!+modx.user.id:userinfo=`internalKey`]]

Имя пользователя: [[!+modx.user.id:userinfo=`username`]]

Полное имя: [[!+modx.user.id:userinfo=`fullname`]]

Роль: [[!+modx.user.id:userinfo=`role`]]

E-mail: [[!+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`]]

PHx (Placeholders Xtended) добавляет новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Рекурсивный парсер позволяет использовать вложенные теги. Возможно создавать свои модификаторы, путем создания сниппетов.

Скачать последнюю версию PHx из репозитория MODX можно по этой ссылке .

Новая установка

  1. Скачайте и распакуйте архив.

Обновление

  1. Скачайте и распакуйте архив.
  2. Переименуйте директорию /assets/plugins/phx в /assets/plugins/phx-old
  3. Создайте директорию "phx" в папке /assets/plugins.
  4. Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
  5. Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
  6. Отметьте событие "OnParseDocument" на вкладке "Системные события"

Конфигурация

На вкладке конфигурация, во время редактирования плагина скопируйте в поле "Конфигурация плагина":

&phxdebug=Лог событий;int;0 &phxmaxpass=Макс. число проходов;int;50

Для опытных пользователей

Вы можете изменить настройки по умолчанию для плагина PHx:

Лог событий

0 = Отключен
1 = Включено логирование событий PHx
Если включено PHx создает подробный лог на каждое событие, записанное в протоколе событий (Отчеты->Просмотр событий)

Макс. число проходов

Определяет максимально обрабатываемую глубину вложенных тегов. Рекомендуется оставить значение 50.

PHx (Placeholders Xtended) расширяет возможности использования плейсхолдеров, тегов содержимого (включая TV параметры) и тегов настройки сайта. Благодаря этому вы можете с легкостью определять формат вывода конечного результата. PHx встраивается в парсер MODX, расширяя его функционал модификаторами, условиями и в качестве бонуса делает его по-настоящему рекурсивным.

Поддерживаемые теги

PHx поддерживает следующие теги MODx:

  • [+placeholder+]
  • [*теги содержимого*] (например: [*content*], [*pagetitle*] и другие)
  • [*TV параметры*]
  • [(теги настройки)] (например: [(base_url)], [(site_name)] и другие)

Сниппеты, поддерживающие PHx

  • Ditto
  • MaxiGallery

Вы можете использовать PHx синтаксис в чанках, используемых сниппетами не из этого списка, но для этого требуется другой метод (см. раздел Tips & Tricks)

Обычный плейсхолдер вида

[+placeholder+]

легко превращается в плейсхолдер PHx:

[+placeholder:esc+]

Тоже самое вы можете сделать с тегом содержимого:

[*createdby*]

Добавляем модификатор:

[*createdby:date=`%a %B %d, %Y at %H:%M`*]

Также можно использовать несколько модификаторов сразу. Они будут обработаны слева направо:

Somevar:esc:nl2br:strip

Расширенное применение

Наличие специального плейсхолдера "phx" позволяет использовать синтаксис PHx без наличия реальной переменной.

[+phx:if=`[+this+]`:is=`[+that+]`:then=`do this`:else=`do that`+]

С некоторыми модифиакторами этот плейсхолдер приобретает определенное значение. В случае с модификатором "userinfo" он возвращает соответствующее значение из информации о текущем пользователе:

[+phx:userinfo=`username`+]

Известные проблемы

Синтаксис

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

[+
[*
[(
+]
*]
)]
]]

Парсер попытается их обработать и MODx выдаст ошибку. Обычно такой проблемы не возникает. Но в случае с JavaScript у вас может быть конструкция, похожая на эту:

Array

Которая спровоцирует странное поведени из-за +]. Также закрывающий тег CDATA:

/* ]]> */

Может создать проблемы.

Помните, что вы не сможете потерять данные вашего сайта, используя неправильный синтаксис PHx. Худшее, что может случится - ваш шаблон неправильно отобразится.

Строки

lcase

ucase

Приведет все символы строки к верхнему регистру.

[+string:ucase+]

На входе:

This is a string

THIS IS A STRING

ucfirst

Первая буква в строке станет заглавной.

[+string:ucfirst+]

На входе:

length | len

Возвратит длину строки.

На входе:

This is a string

notags

Вырежет все HTML теги из строки.

[+string:notags+]

На входе:

This is a string

This is a string

esc

Удаляет html теги и разрывы строк

htmlent

Конвертирует исходную переменную в html сущности. Аналог htmlentities() в PHP.

nl2br

Конвертирует символы перевода строки в теги.

[+string:nl2br+]

На входе:

This is
a string

This is
a string

strip

Удалит символы новой строки(\n), табуляторы(\t), идущие подряд пробелы.

[+string:strip+]

На входе:

This is
a
string

This is a string

Другие модификаторы

reverse

Перевернет задом наоборот буквы.

wordwrap

Breaks words in the current value longer than the given length of characters by putting a space in between.

По умолчанию: 70 символов.

Wordwrap(=`length`)

length - символы

limit

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

По умолчанию: 100 символов.

limit(=`length`)

Специальные

date

Преобразует метку времени unix timestamps в соответствии с заданным форматом.

date(=`dateformat`)

dateformat: В соответствии с форматом PHP-функции strftime

[*createdon:date=`%d.%m.%Y`*]

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

setlocale(LC_ALL, "de_DE@euro", "de_DE", "de", "ge");

md5

Создает MD5-хэш текущего значения.

userinfo

Поля, используемые в базе данных MODx из таблицы user_attributes (например: username, useremail).

Userinfo=`field`

  • cachepwd : Cache password
  • comment : Comment
  • country : Страна
  • dob : Дата рождения в формате времени UNIX
  • email : Email
  • fax : Факс
  • fullname : Полное имя
  • gender : Пол
  • internalKey : User internal key
  • lastlogin : Last login, in UNIX time format
  • logincount : Number of logins
  • mobilephone : Мобильный телефон
  • password : Пароль
  • phone : Телефон
  • photo : Фотография
  • role : Роль
  • state : Статус
  • thislogin : This login, in UNIX time format
  • username : Логин
  • zip : Почтовый индекс

math

Использовать вычисления, такие, как - * + /.

Math=`calculation`

"?" символ заменяется текущим значением расширения, но вы также можете использовать вложенные теги.

Пример расчета: ?+1+(2+3)+4/5*6

ifempty

Использовать "other value" если значение placeholder/templatevar пустое.

Ifempty=`other value`

select

Принимает значение, в зависимости от значений placeholder/templatevar.

Select=`options`

параметры: value1=output1&value2=output2

На входе: 1

[+placeholder:select=`0=OFF&1=ON&2=UNKNOWN`+]

Вернет: ON

Условные выражения

is

ne

alias: isnot, isnt

не равно (!=)

eg

больше или равно (>=)

el

меньше или равно (<=)

gt

больше (>)

lt

меньше (<)

mo=`Webgroups`

синонимы(алиасы): isinrole, ir, memberof

Принимает в качестве параметра разделенный запятыми список веб-групп и возвращает значение true/false в зависимости от того, принадлежит текущий пользователь к какой-либо из этих групп или нет (заменяет собой модификатор "inrole" , который необходимо было сочетать с условным оператором).

[+phx:mo=`myWebgroup`:then=`I"m a member`:else=`I"m NOT a member`+]

if =`value`

Принимает в качестве параметра переменную для сравнения. Также может быть использовано в сочетании с :or или :and .

[+phx:if=`[+price+]`:gt=`0`:then=`Цена: [+price+]`+]

or

Логическое ИЛИ (проверяется, верно ли первое или второе условие).

[+phx:if=`[*id*]`:is=`2`:or:is=`3`:then=`{{Chunk}}`:else=`{{OtherChunk}}`+]

В данном примере если текущий ID равен 2 или 3, то выводится чанк {{Chunk}}, иначе выводится чанк {{OtherChunk}}.

and

Логическое И (проверяется, верны ли оба условия).

[+phx:if=`[!UltimateParent!]`:is=`1`:and:isnot=`[*id*]`:then=`{{ChildChunk}}`:else=`{{ParentChunk}}`+]

В данном примере если UltimateParent равен 1 и при этом не равен текущему ID, то выводится чанк {{ChildChunk}}, иначе выводится чанк { {ParentChunk}}.

then =`template`

Значение template отображается, когда все условия верны. Здесь можно указать вызов {{чанка}}, [[сниппета]] или же чистый HTML.

else =`template`

Значение template отображается, когда условия не верны. Здесь можно указать вызов {{чанка}}, [[сниппета]] или же чистый HTML.

show

Используется подобно then , но в качестве шаблона для вывода используется исходное значение. Выполняется, если условия верны.

[+myplaceholder:len:gt=`3`:show+]

В данном примере значение плейсхолдера будет выведено, если его длина составляет более 3 символов.

Пользовательские модификаторы

Модификатор представляет собой простой сниппет, который обрабатывает заданное значение. Существует возможность создавать свои собственные модификаторы/мини-сниппеты, добавив новый сниппет в менеджере ресурсов MODx или же создав файл в папке модификаторов плагина PHx.

Поскольку код модификатора несложен, то ему не нужны никакие параметры, за исключением тех, которые он получает от парсера.

Существуют две основные переменные:

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

Пример.

Приведем пару примеров использования модификаторов. Допустим, что плейсхолдер myplaceholder имеет значение "test" :

[+myplaceholder:mymodifier+]

Переменная $output содержит значение "test".
Переменная $options не содержит ничего, т.к. модификатору не был передан параметр.

[+myplaceholder:mymodifier=`my options`+]

Переменная $output все еще содержит значение "test".
Переменная $options теперь содержит значение "my options"

Прочие переменные (для продвинутых пользователей)

$input - содержит исходное немодифицированное значение.
$condition - массив, содержащий элементы, образующие условное выражение (0, 1, || и &&).

Создание собственного модификатора

Пример 1: I love MODx

Используя полученные знания, создадим новый пользовательский модификатор. Это будет модификатор без параметра, который просто добавит текст " because I love MODx" к переменной. Для этого необходимо проделать следующие шаги:

1. В Менеджере ресурсов надо зайти в Ресурсы(Элементы) -> Управление ресурсами (элементами) -> Сниппеты

2. Нажать "Новый сниппет"

phx:love "

Для того, чтобы сниппет воспринимался как модификатор для PHx, его название должно иметь префикс "phx:" без пробелов между ним и собственно именем сниппета. Тогда можно будет его использовать как модификатор, добавив:love к любому плейсхолдеру, например: [+myplaceholder:love+].

4. Теперь добавим код модификатора в поле для кода. Допустим, это будет код следующего вида:

5. Сохраним изменения и наш новый модификатор (:love ) готов к использованию!

Пример 2: I love MODx even more

Создадим модификатор, подобный модификатору :love из предыдущего примера, но дополнительно дадим ему возможность добавлять к исходной строке значение переданного параметра, если оно было указано.

1. В Менеджере ресурсов надо зайти в Ресурсы(Элементы) -> Управление ресурсами (элементами) -> Сниппеты

2. Нажать "Новый сниппет"

3. В качестве имени сниппета задать "phx:love2 "

Для того, чтобы сниппет воспринимался как модификатор для PHx, его название должно иметь префикс "phx: " без пробелов между ним и собственно именем сниппета. Тогда можно будет его использовать как модификатор, добавив:love к любому плейсхолдеру, например: [+myplaceholder:love2+] .

ChunkGood .

Прочие примеры

[+myplaceholder:gt=`1`:then=`Yes`:else=`No`+]
[+myplaceholder:lt=`3`:and:gt=`1`:then=`Yes`:else=`No`+]
[+myplaceholder:lt=`[+someplaceholder+]`:then=`Yes`:else=`No`+]
[+myplaceholder:islt=`2`:then=`Yes`:else=`No`+]
[+myplaceholder:isnot=`2`:or:lt=`3`:then=`Yes`:else=`No`+]

Все примеры вернут Yes .

[+myplaceholder:isnot=`2`:then=`Yes`:else=`No`+]
[+myplaceholder:gt=`[+someplaceholder+]`:then=`Yes`:else=`No`+]
[+myplaceholder:lt=`2`:then=`Yes`:else=`No`+]
[+myplaceholder:gt=`2`:then=`Yes`:else=`No`+]
[+myplaceholder:lt=`1`:then=`Yes`:else=`No`+]

Все примеры вернут No .

Фильтры в революции позволяют управлять способом представления данных. Они позволяют изменять значения внутри шаблонов.

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

[ ]

Они также могут быть соединены (выполняется слева направо):

[ ]

Вы также можете использовать их, чтобы изменить выход сниппета; внимание, модификатор идет после имени сниппета и перед вопросительным знаком, например,

[ ]

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

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

Модификатор

Описание

Пример

if, input

Логическое ИЛИ

[ [+numbooks:is=`5`:or:is=`6`:then=`There are 5 or 6 books!`:else=`Not sure how many books`] ]

Логическое И

isequalto, isequal, equalto, equals, is, eq

[ [+numbooks:isequalto=`5`:then=`There are 5 books!`:else=`Not sure how many books`] ]

notequalto, notequals, isnt, isnot, neq, ne

[ [+numbooks:notequalto=`5`:then=`Not sure how many books`:else=`There are 5 books!`] ]

greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte

Больше или равно

[ [+numbooks:gte=`5`:then=`There are 5 books or more than 5 books`:else=`There are less than 5 books`] ]

isgreaterthan, greaterthan, isgt, gt

[ [+numbooks:gt=`5`:then=`There are more than 5 books`:else=`There are less than 5 books`] ]

equaltoorlessthan, lessthanorequalto, el, le, islte, lte

Меньше или равно

[ [+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

[ [+numbooks:lt=`5`:then=`There are less than 5 books`:else=`There are more than 5 books`] ]

[ [+numbooks:lt=`1`:hide] ]

[ [+numbooks:gt=`0`:show] ]

[ [+numbooks:gt=`0`:then=`Now available!`] ]

[ [+numbooks:gt=`0`:then=`Now available!`:else=`Sorry, currently sold out.`] ]

memberof, ismember, mo

[ [+modx.user.id:memberof=`Administrator`] ]

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

Модификатор

Описание

Пример

Если не пусто

[ [+numbooks:cat=` books`] ]

lcase, lowercase, strtolower

Транформация в малые буквы

[ [+title:lcase] ]

ucase, uppercase, strtoupper

Трансформация в большие буквы

[ [+headline:ucase] ]

Первая буква слова заглавная

[ [+title:ucwords] ]

Первая буква заглавная

[ [+name:ucfirst] ]

htmlent, htmlentities

Замена тегов HTML

[ [+email:htmlent] ]

esc,escape

Безопасно убирает символы

[ [+email:escape] ]

Замена перевода каретки, табуляции и множества пробелов на один пробел

[ [+textdocument:strip] ]

stripString

Удаляет значение из строки

[ [+name:stripString=`Mr.`] ]

Замена значения

[ [+pagetitle:replace=`Mr.==Mrs.`] ]

striptags, stripTags,notags,strip_tags

Убирает HTML теги

[ [+code:strip_tags=`

len,length, strlen

Длина строки

[ [+longstring:strlen] ]

reverse, strrev

Реверс строки

[ [+mirrortext:reverse] ]

wordwrap

Новая строка после указанного количества символов

[ [+bodytext:wordwrap=`80`] ]

wordwrapcut

Вставляет символ новой строки после определенного количества символов.

[ [+bodytext:wordwrapcut=`80`] ]

Выводимое кол-во символов

[ [+description:limit=`50`] ]

ellipsis

Обрезание строки после указанного кол-ва символов

[ [+description:ellipsis=`50`] ]

Отображает сырой элемент без: тега. Полезно для документации.

[ [+showThis:tag] ]

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

[ [+placeholder:default=`A default value!`] ]

Это означает, что значение может иногда быть пустым, а иногда нет. Зачем его хранить в кэше? Это может исключить то, что значение может появиться.

Если вы не уверены будет ли результат при выполнении сниппета, то логично сделать значение по умолчанию:

[ [!getResources:default=`Sorry - nothing matched your search.`? &tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%%` &includeTVs=`1`] ]

Фильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков, сниппетов.

Фильтры ввода

В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри ядра MODX.

Фильтры вывода

В MODX Revolution фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро.

Синтаксис модификаторов:

[[+element:modifier=`value`]]

Фильтры могут применяться последовательно (пишутся слева направо):

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

Также фильтры могут применяться для модификации вывода сниппетов . Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):

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

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

Модификатор Описание Пример использования
if, input if - задает дополнительное условие, input - добавляет в тег обрабатываемые данные [[+num:is=`10`:and:if=`[[+num]]`:ne=`15`:then=`Да, равно 10 и не 15`]]
or, and Объединение нескольких модификаторов связью ИЛИ, и связью И [[+numProducts:is=`10`:or:is=`11`:then=`Здесь 10 или 11 товаров`:else=`Не уверен, сколько товаров`]]
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=`Простите, но все продано.`]]
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 Преобразует все символы в 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=`
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=`Привет, [[+name]]!`]]
nl2br Заменяет символы новой строки (\n) на HTML-тег
[[+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, добавляющий к выводу определенное количество восклицательных знаков:

[[*pagetitle:makeExciting=`4`]]

Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:

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

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

Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:

Значение Модификатор
Внутренний ключ пользователя [[!+modx.user.id:userinfo=`internalKey`]]
Логин [[!+modx.user.id:userinfo=`username`]]
Полное имя [[!+modx.user.id:userinfo=`fullname`]]
Роль [[!+modx.user.id:userinfo=`role`]]
E-mail [[!+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`]]

Да, ещё один способ реализации Ajax-фильтра на сайте =)

Начнём с простого вывода на странице обычного списка ресурсов. Обязательно добейтесь, чтобы нормально работала AJAX-пагинация, потому что своих механизмов работы с AJAX мы писать не будем, а будем использовать методы AJAX, которые есть в pdoPage.

{"!pdoPage" | snippet: [ "ajaxMode" => "default", "parents" => 0, "limit" => 3, "includeTVs" => "height,weight,speed_type,price", "tvPrefix" => "", "tpl" => "@INLINE

{$pagetitle}

Вес: {$weight}

Высота: {$height}

Тип: {$speed_type}

", ]}
{"page.nav" | placeholder}

Для фильтров я буду использовать такую вёрстку. Но вёрстка тут особой роли не играет - главное указать правильные классы в JS-коде.


JS-код обработки фильтров выглядит как-то так:

$(document).on("change keyup", "#filters input", function(){ // Проверяем, что pdoPage подключён if (typeof(pdoPage) == "undefined") return; // Собираем значения всех фильтров в единый массив var fields = {}; $.each($("#filters").serializeArray(), function(){ // Если параметр не является массивом (чекбоксом), то все просто if (this.name.indexOf("") <= 0) { fields = this.value; } else { // Для чекбоксов посложнее var name = this.name.replace("",""); if (typeof(fields) == "undefined") { fields = ; } fields.push(this.value); } }); // И отправляем этот массив на сервер. $.post(document.location.href, { action: "filter", fields: fields, // Параметр hash - обязательный (он содержит настройки pdoPage) hash: pdoPage.configs.page.hash }, function(data) { // Просим pdoPage загрузить новый список ресурсов var tmp = document.location.href.split("?"); pdoPage.keys.page = 0; pdoPage.loadPage(tmp, pdoPage.configs.page); }); });
Уже сейчас при изменении значения фильтров список ресурсов будет обновляться. Теперь осталось «объяснить», как обрабатывать фильтры. Для этого создаём плагин на событие OnHandleRequest :

context->key == "mgr" || empty($_SERVER["HTTP_X_REQUESTED_WITH"]) || $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest") return; switch ($_POST["action"]) { case "filter": $output = array("success" => false, "message" => ""); // Проверяем, что hash получен и параметры pdoPage существуют if (isset($_POST["hash"]) && !empty($_POST["hash"]) && isset($_SESSION["pdoPage"][$_POST["hash"]]) && !empty($_SESSION["pdoPage"][$_POST["hash"]])) { $hash = (string) $_POST["hash"]; // Указываем только ТВ, доступные для фильтрации $tvs = array("height","weight","speed_type"); // Наполняем условие выборки $where = array(); foreach ($tvs as $tv) { switch ($tv) { case "price": // Пример обработки чекбоксов if (isset($_POST["fields"]["price"]) && !empty($_POST["fields"]["price"])) { $where_price = ; foreach ($_POST["fields"]["price"] as $range) { $value = explode("-", $range); if (count($value) != 2) { continue; } $min = (int) $value; $max = (int) $value; $where_range = "CAST(`TVprice`.`value` AS DECIMAL(13,3)) >= " . $min; if ($max) { $where_range .= " AND CAST(`TVprice`.`value` AS DECIMAL(13,3)) <= " . $max; } $where_price = "(" . $where_range . ")"; } $where = "(" . implode(" OR ", $where_price) . ")"; } break; default: if (isset($_POST["fields"][$tv]) && $_POST["fields"][$tv] !== "") { $where[$tv] = $_POST["fields"][$tv]; } break; } } // Добавляем это условие в параметры pdoPage "на лету" $_SESSION["pdoPage"][$hash]["where"] = $where; $output["message"] = $where; $output["success"] = true; } else { $output["message"] = "Error"; } echo $modx->toJSON($output); die(); break; default: break; }
Теперь наши фильтры работают. Единственное - pdoPage «не знает», что показывать, когда ни один результат не найден. Чтобы такой случай учесть, создадим файл pdopage.custom.js и укажем его в параметре frontend_js :

{"!pdoPage" | snippet: [ "ajaxMode" => "default", "frontend_js" => "/assets/components/pdotools/js/pdopage.custom.js", "parents" => 0, "limit" => 3, // ... }
В стандартном коде мы добавим только условие else на случай, если ответ от сервера будет пустым:

// ... pdoPage.loadPage = function (href, config, mode) { // ... $.post(config["connectorUrl"], params, function (response) { if (response && response["total"]) { // ... } else { // Добавляем условие else wrapper.find(rows).html("Ничего не найдено"); wrapper.find(pagination).html(""); wrapper.removeClass("loading"); wrapper.css({opacity: 1}); if (config["mode"] == "default") { $("html, body").animate({scrollTop: wrapper.position().top - 50 || 0}, 0); } } }, "json"); }; // ...
На этом простой AJAX-фильтр готов.