Умовні модифікатори для шаблонів MODX. Універсальний фільтр ресурсів Підключення JS скрипта Ajax фільтра

Фільтри 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 наступні параметри для обробки: Параметр Значення

Значення у прикладі

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

[ ]

У революції вихідний фільтр застосовується один або більше разів із серії вихідних модифікаторів, які поводяться подібно до 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

Логічне І

notequalto, notequals, isnt, isnot, neq, ne

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

greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte

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

Більше або дорівнює

isgreaterthan, greaterthan, isgt, gt

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

equaltoorlessthan, lessthanorequalto, el, le, islte, lte

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

Менше або дорівнює

islowerthan, islessthan, lowerthan, lessthan, islt, lt

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

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

memberof, ismember, mo

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

[ [+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 - не збирається вашого search.`?

&tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%%` &includeTVs=`1`] ]

Так, ще один спосіб реалізації Ajax-фільтру на сайті =)

Почнемо із простого виведення на сторінці звичайного списку ресурсів. Обов'язково домагайтеся, щоб нормально працювала AJAX-пагінація, тому що своїх механізмів роботи з AJAX ми не писатимемо, а використовуватимемо методи AJAX, які є в pdoPage.

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

($pagetitle)

Вага: ($weight)

Висота: ($height)

", ]}
Тип: ($speed_type)

("page.nav" | placeholder)


від 100 000 руб.

$(document).on("change keyup", "#filters input", function()( // Перевіряємо, що pdoPage підключений if (typeof(pdoPage) == "undefined") return; // Збираємо значення всіх фільтрів у єдиний масив var fields = (); $ $. "")<= 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) "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) 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
та вкажемо його у параметрі else frontend_js

// ... 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 готовий.

У цій статті Я б хотів розповісти Вам про фільтрах (модифікаторах) у 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`]]

Вітаю, друзі! Сьогодні ми навчимося створювати фільтр ресурсів у MODx Revolution з можливістю сортування за будь-яким TV полем та підвантаженням результатів по кліку "Завантажити ще". Для виведення результатів будемо використовувати сніпет pdoResources.

Класнути

Запинити

Завантажити всі сніпети та необхідні файли уроку.

Для початку необхідно встановити пакет pdoResources, що входить до складу пакету pdoTools. Ви можете встановити весь набір пакетів pdo (pdoTools) або тільки pdoResources окремим пакетом для створення фільтра на MODx Revolution.

Після встановлення пакетів, давайте підключимо сніппет, який ви завантажили у ваш проект. Якщо ви розробляєте каталог зараз з нуля, то раджу дотримуватись використання певних класів для 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 Ajax Filter Form ajaxFormButtonStart = ".ajax-start", // CSS Selector of Button Start Filtering ajaxFormButtonReset = ".ajax-reset", // CSS Selector of Button Reset Ajax Form sortDownText = "За спаданням", sortUpText = "По зростанню"; if($(" .ajax-filter-count").length) ( var count = $(".ajax-filter-count").data("count"); $(ajaxCountSelector).text(count); ) else ( $(ajaxCountSelector ).text($(ajaxItemSelector).length); ) )ajaxCount(); function ajaxMainFunction() response = $ (response); $ (ajaxContainerSelector).

  • Рядки 5-13:визначення змінних для селекторів CSS Ajax фільтра. Не змінюємо, якщо використовуємо стандартні значення, як у малюнку вище;
  • Рядки 15-22:скрипт лічильника ресурсів у результатах фільтрації;
  • Рядки 24-35:основна функція Ajax фільтрації;
  • Рядки 37-49:обробник події на кліку на кнопку "Завантажити ще";
  • Рядки 51-54:обробник події на кліку на кнопці "фільтрувати". Ця кнопка може бути відсутня, оскільки фільтрація відбувається автоматично. Автоматична фільтрація може бути вимкнена шляхом видалення рядків 68-70;
  • Рядки 56-66:обробник події очищення форми та скидання фільтра. Рядки 59-63 відповідають за скидання параметрів сортування;
  • Рядки 68-70:функція автоматичного сортування за зміни полів форми фільтра;
  • Рядки 72-82:Універсальна функція сортування за tv параметром.

Я постарався зробити цей скрипт максимально універсальним, тому якщо ви використовуєте стандартні селектори елементів фільтра Ajax, то редагувати ні чого не потрібно.

Підключення 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->доJSON(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 = "
Завантажити ще ".$lim." з ".$more."
"; ) return $modx->runSnippet("pdoResources",$params).$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 і які необхідно обробляти при фільтрації. Приклад чанка

tplCatItem

[[+tv.floor]] `]]
[[+pagetitle]] Поверх
[[+tv.area:isnot=``:then=` Площа
[[+tv.area]] кв.м. Гараж
[[+tv.garage:is=`1`:then=`Є`:else=`Ні`]] Ціна:

Комплексний приклад виведення у фронтенд можете переглянути у репозиторії проекту на гітхабі у файлі demo.html.

Ajax сортування по TV

У нашому скрипті є готове рішення для сортування результатів фільтрації по будь-якому полю TV. У форму фільтра вставте наступні приховані поля і не змінюйте їх значення, вони просто повинні бути у формі фільтра:

У будь-якому місці вашого HTML шаблону зробіть висновок кнопки і в data атрибуті вкажіть поле, яким хочете фільтрувати видачу:

Сортувати за ціною: За зростанням

При кліку торкається клас button-sort-asc, який можете використовувати для оформлення кнопки при зміні напряму сортування, додавання стрілочок тощо в атрибут data-sort-byможна писати будь-який TV, що бере участь у фільтрації. Із сортуванням все.

Отже, ми розглянули створення нескладного Ajax фільтру ресурсів у MODx з виведенням результатів у СНІПЕТ pdoResources.



gastroguru 2017