Использование условий if else в MODx. Универсальный фильтр ресурсов Фильтры модификаторы
И так, фильтр который вы сможете себе сделать на сайт очень универсальный!
Его можно будет применить к любому проекту и при этом сэкономив много времени
Для начала необходимо установить пакет 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.
Всем доброго здравия. В этой статье я расскажу как сделать фильтр документов по tv-параметрам на сайте под управлением Modx Revolution. Мы будем использовать сниппет tagManager2 от Аndchir . Этот сниппет умеет работать сразу с несколькими tv, а также с числовыми данными (в виде цены) и множественным списком. Каждый этот пример мы разберем далее.
1. Для начала нужно установить tagManager2
Для этого идем в Приложения/Установщик/
жмем кнопку «Загрузить дополнение» и в строке поиска вбиваем tagManager2
Также еще нужно установить сниппет getPage и getProducts . Таким образом раздел «Управление пакетами» должен выглядеть так (сниппет translit, кстати, отвечает за транслитерацию псевдонимов на латиницу)
Загружаем, устанавливаем пакеты и идем в «Настройки системы»
2. Настраиваем сниппет tagManager2
В Системных настройках выбираем раздел tag_manager2
Мы увидим параметры настройки фильтра
Там все достаточно просто и понятно, но все же:
- В «ID ресурса каталога верхнего уровня» указываете id шаблона каталога или категории, где будут фильтроваться товары или страницы
- В «Дополнительный разделитель множественного списка» ставим знак #. Ниже вы узнаете зачем он нужен
- В «Имена TV или полей с множественным списком» прописываем tv с множественным списком. Как их создать я покажу ниже
- «Имена TV или полей с числовыми значениями» - здесь нужно указать tv-параметры, в которых будут цифры. Обычно это параметр цены. Данный фильтр будет выведен в виде ползунка «от и до»
- В «ID шаблонов товаров» прописываем id страниц, которые нужно фильтровать и к которым прикреплены tv-параметры, указанные выше
- В «Имя набора параметров, используемого для фильтрации» прописываем catalog_filters. Данный шаблон мы будем использовать в шаблонах параметров getPage и getProducts
- Прописать в «Сниппет связанный с набором параметров» название сниппета, который будет осуществлять вывод и пагинацию страниц или товаров. Обычно это getPage .
3. Создаем набор параметров catalog_filters в getPage
Идем в сниппет getPage
Переходим во вкладку «Параметры» и нажимаем на кнопку «Добавить набор параметров» . Можно конечно и отредактировать существующий, но тогда есть шанс затирания параметров, которые мы сейчас создадим при обновлении getPage. Если не собираетесь обновлять можете просто редактировать.
Редактируем существующие параметры и присваиваем значения:
Создаем новые параметры и присваиваем значения
Отредактированные параметры будут отображаться зеленым цветом, созданные - фиолетовым
4. Создаем или редактируем tv параметры для фильтра
Я создал для примера 3 tv-параметра
Особое внимание хочу привлечь к тому, что нужно указывать Имя (Заголовок) tv-параметра, а иначе он может просто не отображаться в модуле управления фильтрами
5.Создаем чанк filtr_tpl
Этот чанк отвечает за вывод каждого отдельно результата в getProducts
6. Создаем структуру в дереве документов
У меня она выглядит так:
Главная страница у нас с ID 1, а у товаров id шаблона 1 (это у нас стоит в настройках tag_manager2, если у Вас другие значения, не забудьте поменять в настройках)
7. Редактируем filters.js
Идем по адресу /assets/components/tag_manager2/js/web/filters.js и вместо
Multitags: ["tags"],//Имена доп. полей с множественными значениями
вставляем код с нашими подставленными значениями
Multitags: ["filtr1", "filtr2"],//Имена доп. полей с множественными значениями
Здесь все предельно просто и понятно. Мы вставили свои tv-поля с множественными значениями. А вообще это конфиг всех настроек (но лучше без разрешения больших дяденек их не трогать, я имею ввиду советов создателей модуля)
8. Выводим фильтр и результаты фильтрации
Сам фильтр
[]Вывод результатов с пагинацией
-
[[!+page.nav]]
Сортировка результатов
9. Активируем фильтр
Теперь нужно лишь активировать наш фильтр. Для этого идем в Приложения/Управление фильтрами .
Здесь нужно поставить галочки возле каждого фильтра и нажать кнопку «Сохранить» .
Если вы все сделали правильно, то фильтр должен заработать. На этом все. Если появились вопросы - задавайте в комментариях, постараюсь ответить. А вообще вот документация по tagManager2 . Успехов в разработке. В "Демо" один из моих сайтов, на котором реализован фильтр с помощью 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.: Не забываем отключать кэширование тегов, где нужно! Чтобы это сделать — нужно ИЗБАВЛЯТЬСЯ от восклицательных знаков (! ) . Результаты большинства сниппетов вплоне себе могут работать из кэша. В следующем уроке разберем .
PHx (Placeholders Xtended) добавляет новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Рекурсивный парсер позволяет использовать вложенные теги. Возможно создавать свои модификаторы, путем создания сниппетов.
Скачать последнюю версию PHx из репозитория MODX можно по этой ссылке .
Новая установка
- Скачайте и распакуйте архив.
Обновление
- Скачайте и распакуйте архив.
- Переименуйте директорию /assets/plugins/phx в /assets/plugins/phx-old
- Создайте директорию "phx" в папке /assets/plugins.
- Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
- Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
- Отметьте событие "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 .
В этой статье Я бы хотел рассказать Вам о фильтрах (модификаторах) в 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`]]