Вибір читачів
Популярні статті
Фільтри 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=`На жаль, нічого не знайдено`?
Створення модифікатора користувача
Будь-який сніпет може використовуватися як модифікатор виводу. Для цього просто вкажіть ім'я сніпета замість модифікатора. Наприклад, створимо сниппет [] , який додає висновку певну кількість знаків оклику:
[[*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-фільтру на сайті =)
("page.nav" | placeholder)
$(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 до проекту. Ви можете підключити його як окремим файлом, так і безпосередньо до файлу кастомних скриптів проекту. Для роботи скрипта потрібний 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).
Я постарався зробити цей скрипт максимально універсальним, тому якщо ви використовуєте стандартні селектори елементів фільтра Ajax, то редагувати ні чого не потрібно.
Створіть новий сніпет в панелі керування 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 = "Між коментарями //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?
- перераховуємо TV"s, які необхідно показати в чанці tplCatItem і які необхідно обробляти при фільтрації. Приклад чанка
[[+pagetitle]] | Поверх |
[[+tv.area:isnot=``:then=` | Площа |
[[+tv.area]] кв.м. | Гараж |
[[+tv.garage:is=`1`:then=`Є`:else=`Ні`]] | Ціна: |
Комплексний приклад виведення у фронтенд можете переглянути у репозиторії проекту на гітхабі у файлі demo.html.
У нашому скрипті є готове рішення для сортування результатів фільтрації по будь-якому полю TV. У форму фільтра вставте наступні приховані поля і не змінюйте їх значення, вони просто повинні бути у формі фільтра:
У будь-якому місці вашого HTML шаблону зробіть висновок кнопки і в data атрибуті вкажіть поле, яким хочете фільтрувати видачу:
Сортувати за ціною: За зростанням
При кліку торкається клас button-sort-asc, який можете використовувати для оформлення кнопки при зміні напряму сортування, додавання стрілочок тощо в атрибут data-sort-byможна писати будь-який TV, що бере участь у фільтрації. Із сортуванням все.
Отже, ми розглянули створення нескладного Ajax фільтру ресурсів у MODx з виведенням результатів у СНІПЕТ pdoResources.
Статті на тему: | |
Як зникнути з мережі назавжди
Щороку у світі безвісти зникають сотні тисяч людей. Частина випадків... Використовуємо Chrome без миші Основні функції та керування браузерами
Після переходу на Хром з Опери мені не вистачало однієї речі: використання... Бібліотека стандартних підсистем Завершення роботи користувачів
На прикладі редакції БСП 2.1.2.34 (платформа 1С 8.2) я розгляну... |