Модификаторы 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.
Для фильтров я буду использовать такую вёрстку. Но вёрстка тут особой роли не играет - главное указать правильные классы в 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 следующие параметры для обработки:
Параметр | Значение | Значение в примере |
---|