В MODx существуют встроенный синтаксис для использования конструкций if else.
Модификаторы вывода
В таблице представлены некоторые модификаторы и примеры их использования. В примерах модификаторы применяются к плейсхолдерам, но вы должны помнить, что они могут применяться к любым тегам MODX. Убедитесь, что используемый тег выводит хоть что-то, что модификатор будет обрабатывать.
Условные модификаторы вывода
Модификатор | Описание | Пример использования |
if, input | if - задает дополнительное условие input - добавляет в тег обратываемые данные | |
or | Объединение нескольких модификаторов связью ИЛИ |
[ [*id:is=`5`:or:is=`6`:then=`номер 5 или 6`:else=`другой номер`]] |
and | Объединение нескольких модификаторов связью И | [ [*id:is=`1`:and:if=`[ [*id]]`:ne=`2`:then=`da`:else=`net`]] |
isequalto, isequal, equalto, equals, is, eq | Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет - «else» |
[ [*id:is=`5`:then=`номер 5`:else=`номер не 5`]] |
notequalto, notequals, isnt, isnot, neq, ne | Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет - «else» |
[ [*id:isnot=`5`:then=`номер не 5`:else=`видимо номер 5`]] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | То же, только условие «Больше или равно» |
[ [*id:gte=`5`:then=`номер 5 или больше`:else=`меньше пятого номера`]] |
isgreaterthan, greaterthan, isgt, gt | То же, только условие «Строго больше» |
[ [*id:gt=`5`:then=`номер больше пяти`:else=`номер 5 или меньше`]] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | То же, только условие «Меньше или равно» |
[ [*id:lte=`5`:then=`номер 5 или меньше`:else=`больше, чем номер 5`]] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | То же, только условие «Строго меньше» |
[ [*id:lte=`5`:then=`номер точно меньше 5`:else=`номер 5 или больше`]] |
hide | Скрывает элемент, если условие выполняется |
[ [*id:lt=`1`:hide]] |
show | Отображает элемент, если условие выполняется |
[ [*id:gt=`0`:show]] |
then | Используется для составления условий |
[ [*id:gt=`0`:then=`Книги в наличии!`]] |
else | Используется для составления условий (совместно с «then») |
[ [*id:gt=`0`:then=`Книги в наличии!`:else=`Простите, но все продано.`]] |
select | Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать "else", например если значение [ [+controls]] - не подходит под шаблон select | [ [+controls:select=`0=ВЫКЛ&1=ВКЛ&2=ХЗ`:else=`Ошибка`]] |
memberof, ismember, mo | Проверяет, является ли пользователь членом указанной группы пользователей |
[ [+modx.user.id:memberof=`Administrator`]] |
Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
Также для того что бы иметь возможность пользоваться вложеными конструкциями можно воспользоваться дополнительным пакетом, который имеет короткое и емкое название If. Загрузить его можно зайдя в Система-> Управление пакетами.
Так будет выглядить код условия:
[ [!If? &subject=`[ [+total]]` &operator=`GT` &operand=`3` &then=`You have more than 3 items!`]]
Параметры пакета if:
subject - Параметр, по которому выполняются условия.
operator - Оператор сравнения с subject
operand - Используеться по необходимости и являет собой значение subject (предмета сравнения) с использованием operator (оператора сравнения).
then - Код, который выводиться в том случае если условие принимает значение true
else - Код, который выводиться в том случае если условие принимает значение false
debug - Если значение true, отобразит все переданные параметры
die - Если отладка (debag) прошла успешно и соответствует значению true, то после вывода параметров применить функцию die().
Параметры
Название | Описание | По умолчания |
subject | Параметр, по которому выполняются условия. | |
operator | Оператор сравнения с subject | = |
operand | Используеться по необходимости и являет собой значение subject (предмета сравнения) с использованием operator (оператора сравнения). | |
then | true | |
else | Код, который выводиться в том случае если условие принимает значение false | |
debug | Если значение true , отобразит все переданные параметры | 0 |
die | Если отладка ( debag ) прошла успешно и соответствует значению true , то после вывода параметров применить функцию die() . | 0 |
Операторы:
Название: | Описание: |
!=,neq,not,isnot,isnt,unequal,notequal | Проверяет если subject не равен указанному значению operand |
==,=,eq,is,equal,equals,equalto | Проверяет если subject равен указанному значению operand |
< ,lt,less,lessthan | Проверяте если subject меньше указанного значения operand |
> ,gt,greater,greaterthan | Проверяет если subject больше указанного значения operand |
< =,lte,lessthanequals,lessthanorequalto | Проверяет если subject меньше или равно указанного значения operand |
> =,gte,greaterthanequals,greaterthanequalto | Проверяет если subject больше или равно указанного значения operand |
isempty,empty | Проверяет если subject имеет пустое значение |
!empty,notempty,isnotempty | Проверяет если subject имеет какое-либо значение |
isnull,null | Проверяет если subject равен null |
inarray,in_array,ia | Проверяет если subject найден в списке operand (строка разделённая запятой) |
Да, ещё один способ реализации 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`] ]
И так, фильтр который вы сможете себе сделать на сайт очень универсальный!
Его можно будет применить к любому проекту и при этом сэкономив много времени
Для начала необходимо установить пакет pdoResources, который входит в состав пакета pdoTools. Вы можете установить или весь набор пакетов pdo (pdoTools) или только pdoResources отдельным пакетом для создания фильтра на MODx Revolution.
После установки пакетов, давайте подключим сниппет, который вы скачали с GitHub в ваш проект. Если вы разрабатываете каталог сейчас с нуля, то советую придерживаться использования определенных классов для Ajax фильтрации.
Однако если у вас уже готовый каталог, вы можете определить классы элементов Ajax фиьтра в JS файле (см. ниже).
Обратите внимание, что.ajax-item должен быть непосредственным потомком.ajax-container. Если вы используете сетку Bootstrap для разметки колонок, можете определить класс контейнера как «row ajax-container», а колонки айтема как «col-md-4 ajax-item».
Подключение JS скрипта Ajax фильтра
Подключим скрипт JS к проекту. Вы можете подключить его как отдельным файлом, так и непосредственно в файл кастомных скриптов проекта. Для работы скрипта требуется jQuery.
$(function() { //MODx pdoResources Ajax Filter //Filter Settings var fadeSpeed = 200, // Fade Animation Speed ajaxCountSelector = ".ajax-count", // CSS Selector of Items Counter ajaxContainerSelector = ".ajax-container", // CSS Selector of Ajax Container ajaxItemSelector = ".ajax-item", // CSS Selector of Ajax Item ajaxFormSelector = ".ajax-form", // CSS Selector of Ajax Filter Form ajaxFormButtonStart = ".ajax-start", // CSS Selector of Button Start Filtering ajaxFormButtonReset = ".ajax-reset", // CSS Selector of Button Reset Ajax Form sortDownText = "По убыванию", sortUpText = "По возрастанию"; function ajaxCount() { if($(".ajax-filter-count").length) { var count = $(".ajax-filter-count").data("count"); $(ajaxCountSelector).text(count); } else { $(ajaxCountSelector).text($(ajaxItemSelector).length); } }ajaxCount(); function ajaxMainFunction() { $.ajax({ data: $(ajaxFormSelector).serialize() }).done(function(response) { var $response = $(response); $(ajaxContainerSelector).fadeOut(fadeSpeed); setTimeout(function() { $(ajaxContainerSelector).html($response.find(ajaxContainerSelector).html()).fadeIn(fadeSpeed); ajaxCount(); }, fadeSpeed); }); } $(ajaxContainerSelector).on("click", ".ajax-more", function(e) { e.preventDefault(); var offset = $(ajaxItemSelector).length; $.ajax({ data: $(ajaxFormSelector).serialize()+"&offset="+offset }).done(function(response) { $(".ajax-more").remove(); var $response = $(response); $response.find(ajaxItemSelector).hide(); $(ajaxContainerSelector).append($response.find(ajaxContainerSelector).html()); $(ajaxItemSelector).fadeIn(); }); }) $(ajaxFormButtonStart).click(function(e) { e.preventDefault(); ajaxMainFunction(); }) $(ajaxFormButtonReset).click(function(e) { e.preventDefault(); $(ajaxFormSelector).trigger("reset"); $("input").val("pagetitle"); $("input").val("asc"); setTimeout(function() { $("").data("sort-dir", "asc").toggleClass("button-sort-asc").text(sortUpText); }, fadeSpeed); ajaxMainFunction(); ajaxCount(); }) $(""+ajaxFormSelector+" input").change(function() { ajaxMainFunction(); }) $("").data("sort-dir", "asc").click(function() { var ths = $(this); $("input").val($(this).data("sort-by")); $("input").val($(this).data("sort-dir")); setTimeout(function() { $("").not(this).toggleClass("button-sort-asc").text(sortUpText); ths.data("sort-dir") == "asc" ? ths.data("sort-dir", "desc").text(sortDownText) : ths.data("sort-dir", "asc").text(sortUpText); $(this).toggleClass("button-sort-asc"); }, fadeSpeed); ajaxMainFunction(); }); });
- Строки 5-13: определение переменных для CSS селекторов Ajax фильтра. Не меняем, если используем стандартные значения, как на рисунке выше;
- Строки 15-22: скрипт счетчика ресурсов в результатах фильтрации;
- Строки 24-35: основная функция Ajax фильтрации;
- Строки 37-49: обработчик события по клику на кнопку «Загрузить еще»;
- Строки 51-54: обработчик события по клику на кнопке «фильтровать». Данная кнопка может отсутствовать, так как фильтрация происходит автоматически.
- Автоматическая фильтрация может быть отключена путем удаления строк 68-70;
- Строки 56-66: обработчик события очистки формы и сброса фильтра. Строки 59-63 отвечают за сброс параметров сортировки;
- Строки 68-70: функция автоматической сортировки при изменении полей формы фильтра;
- Строки 72-82: универсальная функция сортировки по tv параметру.
Подключение PHP сниппета в MODx Revolution
Создайте новый сниппет в панели управления MODx catalogFilter и заполните его следующим содержимым:=".$_GET["area_from"]; } if($_GET["area_to"]) { $filter = "area<=".$_GET["area_to"]; } //Checkbox Type if($_GET["garage"]) { $filter = "garage=1"; } //End Settings //Sort if($_GET["sortby"]) { $sortby = $_GET["sortby"]; } else { $sortby = "pagetitle"; } if($_GET["sortdir"]) { $sortdir = $_GET["sortdir"]; } else { $sortdir = "asc"; } //End Sort //Offset $offset = 0; if($_GET["offset"]){ $offset = $_GET["offset"]; } if($filter) { $where = $modx->toJSON(array($filter)); } else { $where = ""; } $params_count = array("parents" => $parents, "limit" => 0, "tpl" => "@INLINE ,", "select" => "id", "includeTVs" => $fields, "showHidden" => "1", "where" => $where); $count = $modx->runSnippet("pdoResources",$params_count); $count = count(explode(",",$count))-1; $modx->setPlaceholder("count",$count); $params = array("parents" => $parents, "limit" => $limit, "offset" => $offset, "tpl" => $tpl, "select" => "id,pagetitle,introtext,content", "includeTVs" => $fields, "showHidden" => "1", "sortby" => $sortby, "sortdir" => $sortdir, "where" => $where); $more = $count - $offset - $limit; $lim = $more > $limit ? $limit: $more; $button = ""; if($more > 0){ $button = "
Между комментариями //Filter Fields Settings и //End Settings находятся параметры, которые вам необходимо отредактировать под свой проект. Тут ни чего сложного, просто прописываете name полей input и проверяете их условием if. Для полей типа Radio, Select и Text используем пример из строк 5-8. Для определения промежуточного значения от и до можно воспользоваться примером из строк 11-16. Для чекбоксов подойдет пример из строк 19-21.
В строке 74 сниппета вы можете задать свои классы, но не удаляйте текущюю разметку, так как она учавствует в скриптах для подгрузки контента.
Пример возможных значений в панели управления MODx для радиокнопок: Первый==1||Второй==2||Третий==3
Пример вывода радиокнопок во фронтенд:
Здесь именование name=«floor» соответствует строкам 6-8 нашего сниппета catalogFilter. Аналогично реализована обработка других полей формы. Я думаю, это понятно и создание своих собственных полей не будет для вас проблемой.
Вывод сниппета осуществляется в шаблоне каталога следующим образом:
[[!catalogFilter? &tpl=`tplCatItem` &limit=`3` &parents=`5` &fields=`image,area,floor,garage,price` ]]
- tpl=`tplCatItem` - чанк айтема в списке каталога;
- limit=`3` - Сколько записей выводить и по сколько записей подгружать при клике на кнопке «Загрузить еще»;
- parents=`5` - указываем id роительского документа для каталога ресурсов;
- fields=`image,area,floor,garage,price` - перечисляем TV"s, которые необходимо показать в чанке tplCatItem и которые необходимо обрабатывать при фильтрации.
[[+pagetitle]]
Этаж | [[+tv.floor]] |
Площадь | [[+tv.area]] кв.м. |
Гараж | [[+tv.garage:is=`1`:then=`Есть`:else=`Нет`]] |
Цена: | [[+tv.price]] |
Ajax сортировка по TV
В нашем скрипте имеется готовое решение для сортировки результатов фильтрации по любому TV полю. В форму фильтра вставьте следующие скрытые поля и не меняйте их значение, они просто должны быть в форме фильтра:
В любом месте вашего HTML шаблона сделайте вывод кнопки и в data атрибуте укажите поле, по которому хотите фильтровать выдачу:
Сортировать по цене:
При клике тогглится класс button-sort-asc, который можете использовать для оформления кнопки при смене направления сортировки, добавления стрелочек и т. д. в атрибут data-sort-by можно писать любой TV, учавствующий в фильтрации. С сортировкой все.
Итак, мы рассмотрели создание несложного Ajax фильтра ресурсов в MODx с выводом результатов в сниппет pdoResources.
Условные модификторы в Revolution позволяют вам манипулировать способом представления или анализа данных в тегах. Так-же позволяют изменять значения внутри ваших шаблонов.
Например у нас есть сниппет MainSlide (он выводит из таблицы MySql изображения в слайдер):
Для вывода слайдера на главной странице нужно сделать простое условие с помощью модификатора MODX, данный модификатор notempty делает проверку содержится ли в плейсхолдоре строка или нет:
[[+PlSliderMain:notempty=`[[+PlSliderMain]]`]]
В данном примере мы данные положили в плейсхолдер и после делаем проверку через модификатор, так-же можно проверять поля MODX и создынные дополнительные поля:
Если у вас есть более длинный код в операторе a: then = ``: else = ``, и вы хотите сделать его более читаемым, поставив его на несколько строк, это нужно сделать следующим образом:
[[+placeholder:is=`0`:then=`
// code
`:else=`
// code
`]]
В следующей списке перечислены самые нужные условные из существующих модификаторов и приведены примеры их использования. Выходные модификаторы могут использоваться с любыми тегами MODx.
Модификатор or,and
Проверка на несколько значений.
[[+slide:is=`5`:or:is=`6`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]
[[+slide:is=`5`:and:is=`6`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]
Модификатор is
Если тег равен модификатору.
[[*slide:is=`5`:then=`В слайдере есть контент`]]
[[*slide:is=`5`:then=`В слайдере есть контент`:else=`В слайдере пусто`]]
Модификатор ne
Если тег не равен модификатору.
[[*id:ne=`1`:then=`Не главная страница`:else=`Главная страница`]]
Модификатор notempty
Вернет, указанный модификатор, если значение не пусто.
[[*content:notempty=`[[*content]]`]]
Модификатор hide, show
Скрывает элемент, если условие выполняется или показывает.
Модификатор then, else
Условие, если тег соответствует модификатору, выводим сообщение.
Условие, если тег не соответствует модификатору, выводим сообщение. Используется только в связке с "then"
[[*id:is=`1`:then=`Выводим слайдер`:else=`Слайдер только на главной`]]