Модификаторы modx. Использование условий if else в MODx. Настраиваем сниппет tagManager2

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

Зачем они нужны?

phx модификаторы облегчают жизнь modx разработчикам. Допустим у нас есть сайт с каруселью изображений (ну или с баннером), который нужно выводить только на главной странице . Для этого достаточно поместить его в отдельный чанк и затем вывести в шаблоне при помощи такой конструкции

Где: 1 — id главной страницы,
$carusel — чанк с кодом карусели (баннера).
Только полные чайники создают новый шаблон, ради нескольких строк кода карусели. Я тоже таким был, в общем не отчаиваемся и внедряем phx в разработку.

Разберем вышеприведенную конструкцию по подробнее:

[[*id:is=`1`:then=`[[$carusel]]`]]

*id — выводит id текущей страницы;

:is=`1`:then=

— проверяет равно ли *id == 1 ? и если равно, то выводится содержимое then ;
$carusel — выводит чанк carusel.

Вместо *id, можно использовать и другие поля, например *template — выведет текущий используемый шаблон. Либо можно проверять заполнено или нет TV-поле (пусть будет *keywords) и если оно заполнено, то выводить его. Разберем данный случай поподробнее. Дано стандартная разметка:

Задача: не выводить эту строку, если TV keywords не заполнено.
Решение.

[[*keywords:!empty=``]]

Нагрузки

Нужно следить за обработкой модификаторов, бездумное их использование вызовет лишние нагрузки. Вернемся к карусели, данная запись считывается слева направо и МОДХ выполняет все вложенные условия, в независимости от того, верное условие или нет, будет ли выводится на текущей странице содержимое [[$carusel]] , в любом случае его содержимое обработается. В связи с этим более целесообразно переписать запись:

[[$caru[[*id:is=`1`:then=`sel`]]]]

В этом случае, содержимое чанка $carusel , будет обработано в случае, если выполняется условие

*id:is=`1`

т.к. выполняется

[[*id:is=`1`:then=`sel`]]

и если id текущей страницы равно 1, последнее что обрабатывается — [[$carusel]] , если id не равно 1, тогда — [[$caru]] . А если чанка $caru — нет в элементах, то и нагрузки не будет.

А вообще идеальный вывод будет выглядеть так.

[[$[[*id:is=`1`:then=`carusel`]]]]

О том, как правильно интегрировать верстку в modx revo в рекомендую почитать здесь.

Примечание! Вы можете комбинировать сколько угодно модификаторов под логику работы компонентов сайта, но главное помните, их основная суть — облегчить разработку , а не усложнять без того сложные задачи. Обычно, самый эффективный и действенный способ — это самый простой, так как чем проще и понятней конструкция — тем легче с ней будет работать в дальнейшем. Ниже перечислены основные модификаторы, которые можете использовать для любого тега МОДХ Рево.

Цепочки модификаторов

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

[[+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`]] Zip код: [[!+modx.user.id:userinfo=`zip`]] Фото: [[!+modx.user.id:userinfo=`photo`]] Комментарий: [[!+modx.user.id:userinfo=`comment`]] Дата последнего входа: [[!+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]] Количество входов: [[!+modx.user.id:userinfo=`logincount`]]

Особое внимание обращаем на восклицательный знак [[ ! +modx.user.id]] . Он позволяет НЕ кэшировать содержимое вывода. Почему нужно не кешировать? Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:

Добро пожаловать, [[!+modx.user.id:userinfo=`username`]]!

По задумке на этой странице, выводится приветственное сообщение пользователю. Так вот, если результат будет кешироваться, то при первом входе на эту страницу — сохранится имя пользователя который только что зашел — и всем остальным будет показываться не их имя, а имя того пользователя который вошел на эту страницу первым. Чтобы этого избежать — просто не кэшируем этот тэг, с помощью восклицательного знака перед вызовом [[! +modx…

P.s.: Не забываем отключать кэширование тегов, где нужно! Чтобы это сделать — нужно ИЗБАВЛЯТЬСЯ от восклицательных знаков (! ) . Результаты большинства сниппетов вплоне себе могут работать из кэша. В следующем уроке разберем .

Да, ещё один способ реализации 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-фильтр готов.

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

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

В этой статье Я бы хотел рассказать Вам о фильтрах (модификаторах) в 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`]]

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

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

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

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

В Revolution фильтры вывода ведут себя так же, как и PHx в Evolution, только фильтры теперь встроены прямо в движок MODX. Синтаксис выглядит так:

[]

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

[]

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

[]

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

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

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

Модификатор Описание Пример использования
if, input Передаёт произвольный текст на ввод, для следующего модификатора [[*id:input=`[[+placeholder]]`:is=`1`:then=`Да`:else=`Нет`]]
or ИЛИ [[+numbooks:is=`5`:or:is=`6`:then=`Здесь 5 или 6 книг`:else=`Не уверен, сколько книг`]]
and Объединение нескольких модификаторов связью И [[+numbooks:gt=`5`:and:lt=`10`:then=`Здесь от 5 до 10 книг`:else=`Книг или меньше 5, или больше 10`]]
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=`Простите, но все продано.`]]
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()`. Также экранирует теги MODX. [[+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]]
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 Принимает таймстамп и возвращает дату в виде "Сегодня в 16:20 PM" [[+createdon:fuzzydate]]
ago Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. [[+createdon:ago]]
md5 Создает MD5-хеш значения [[+password:md5]]
cdata Оборачивает вывод тегами CDATA [[+content:cdata]]
userinfo Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя [[!+modx.user.id:userinfo=`username`]]
isloggedin Возвращает 1, если пользователь авторизован в текущем контексте [[!+modx.user.id:isloggedin:is=`1`:then=`Yes`:else=`No`]]
isnotloggedin Возвращает 1, если пользователь не авторизован в текущем контексте [[!+modx.user.id:isnotloggedin:is=`1`:then=`No`:else=`Yes`]]
urlencode Конвертирует значение как URL, то есть применяет PHP фнукцию `urlencode()` [[+mystring:urlencode]]
urldecode Конвертирует значение как из URL, то есть применяет PHP фнукцию `urldecode()` [[+myparam:urldecode]]

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

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

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

[[!getResources:default=`К сожалению, ничего не найдено`? &tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%[[!tag:htmlent]]%` &includeTVs=`1` ]]

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

Любой сниппет может использоваться как модификатор вывода. Для этого просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет [] , добавляющий к выводу определенное количество восклицательных знаков:

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

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

Параметр Значение Значение в примере