Фільтри phx та модифікатори. Універсальний фільтр ресурсів Фільтри модифікатори
І так, фільтр, який ви зможете собі зробити на сайт дуже універсальний!
Його можна буде застосувати до будь-якого проекту і при цьому заощадивши багато часу
Спочатку необхідно встановити пакет 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 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(); response = $(response);$(ajaxCont ainerSelector).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( $(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(); )) $("").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->до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? &tpl=`tplCatItem` &limit=`3` &parents=`5` &fields=`image,area,floor,garage,price` ]]
- tpl=`tplCatItem` - чанк айтема у списку каталогу;
- limit=`3` - Скільки записів виводити і скільки записів підвантажувати при кліку на кнопці «Завантажити ще»;
- parents=`5` - вказуємо id документа для каталогу ресурсів;
- fields=`image,area,floor,garage,price` - перераховуємо TV's, які необхідно показати у чанці tplCatItem і які необхідно обробляти при фільтрації.
[[+pagetitle]]
Поверх | [[+tv.floor]] |
Площа | [[+tv.area]] кв.м. |
Гараж | [[+tv.garage:is=`1`:then=`Є`:else=`Ні`]] |
Ціна: | [[+tv.price]] |
Ajax сортування по TV
У нашому скрипті є готове рішення для сортування результатів фільтрації по будь-якому полю TV. У форму фільтра вставте наступні приховані поля і не змінюйте їх значення, вони просто повинні бути у формі фільтра:
У будь-якому місці вашого HTML шаблону зробіть висновок кнопки і в data атрибуті вкажіть поле, яким хочете фільтрувати видачу:
Сортувати за ціною:
При натисканні торкається клас button-sort-asc, який можете використовувати для оформлення кнопки при зміні напряму сортування, додавання стрілочок і т. д. в атрибут data-sort-by можна писати будь-який TV, що бере участь у фільтрації. Із сортуванням все.
Отже, ми розглянули створення нескладного Ajax фільтру ресурсів в MODx з виведенням результатів у сніпеті pdoResources.
Фільтри в Revolution дозволяють обробляти та змінювати значення тегів усередині ваших шаблонів, чанків, сніпетів.
Фільтри введення
В даний час фільтри введення використовуються при підготовці до обробки виводу фільтрів. Зазвичай вони використовуються лише усередині ядра MODX.
Фільтри виводу
У MODX Revolution фільтри виведення використовуються як один або кілька модифікаторів виведення, вони схожі з PHx викликами MODx Evolution, але відрізняються тим, що вже спочатку вбудовані в ядро.
Синтаксис модифікаторів:
[[+element:modifier=`value`]]
Фільтри можуть застосовуватися послідовно (пишуться зліва направо):
[[+element:modifier=`value`:anothermodifier=`value2`:andanothermodifier:yetanother=`value3`]]
Також фільтри можуть застосовуватися для модифікації виведення сніпетів. Фільтр потрібно прописувати перед усіма параметрами (перед знаком питання):
Модифікатори виводу
У таблиці представлені деякі модифікатори та приклади їх використання. У прикладах вони застосовуються до плейсхолдерів, але ви повинні пам'ятати, що модифікатори можуть застосовуватися до будь-яких тегів MODX Revolution.
Модифікатор | Опис | Приклад використання |
if, input | if - задає додаткову умову, input - додає тег оброблювані дані | [[+num:is=`10`:and:if=`[[+num]]`:ne=`15`:then=`Так, дорівнює 10 і не 15`]] |
or, and | Об'єднання кількох модифікаторів зв'язком АБО, та зв'язком І | [[+numProducts:is=`10`:or:is=`11`:then=`Тут 10 або 11 товарів`:else=`Не впевнений, скільки товарів`]] |
isequalto, isequal, equalto, equals, is, eq | Порівнює значення, що передається з встановленим. Якщо значення збігаються, виводиться значення "then", якщо ні - "else" | [[+numProducts:isequalto=`10`:then=`Тут 10 товарів`:else=`Не впевнений, скільки товарів`]] |
notequalto, notequals, isnt, isnot, neq, ne | Порівнює значення, що передається з встановленим. Якщо значення НЕ збігаються, виводиться значення "then", якщо ні - "else" | [[+numProducts:notequalto=`10`:then=`Не впевнений, скільки товарів`:else=`Тут 10 товарів`]] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | Те ж саме, лише умова "Більше чи одно" | [[+numProducts:gte=`10`:then=`Тут 10 товарів або більше`:else=`Тут менше 10 товарів`]] |
isgreaterthan, greaterthan, isgt, gt | Те ж саме, лише умова "Строго більше" | [[+numProducts:gt=`10`:then=`Тут більше 10 товарів`:else=`Тут 10 товарів або менше`]] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | Те ж саме, лише умова "Менше чи одно" | [[+numProducts:lte=`10`:then=`Тут 10 товарів або менше`:else=`Тут більше 10 товарів`]] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | Те ж саме, лише умова "Строго менше" | [[+numProducts:lte=`10`:then=`Тут менше 10 товарів`:else=`Тут 10 товарів або більше`]] |
hide | Приховує елемент, якщо умова виконується | [[+numProducts:lt=`1`:hide]] |
show | Відображає елемент, якщо умова виконується | [[+numProducts:gt=`0`:show]] |
then | Використовується для складання умов | [[+numProducts:gt=`0`:then=`Товари є!`]] |
else | Використовується для складання умов (разом з "then") | [[+numProducts:gt=`0`:then=`Товари в наявності!`:else=`Пробачте, але все продано.`]] |
memberof, ismember, mo | Перевіряє, чи є членом зазначеної групи користувачів | [[+modx.user.id:memberof=`Administrator`]] |
Модифікатори для роботи з рядками
Модифікатор | Опис | Приклад використання |
cat | Додає значення після тега | [[+numProducts:cat=`товарів`]] |
lcase, lowercase, strtolower | Перекладає всі літери в нижній регістр | [[+title:lcase]] |
ucase, uppercase, strtoupper | Перекладає всі літери у верхній регістр | [[+longtitle:ucase]] |
ucwords | Робить першу букву в словах великої | [[+title:ucwords]] |
ucfirst | Робить першу букву в рядку великому | [[+name:ucfirst]] |
htmlent, htmlentities | Перетворює всі символи в HTML-сутності | [[+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 | Вирізує всі теги (можна вказати дозволені теги). | [[+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]] |
math | Повертає результат розвинених обчислень (навантажує на процесор. Не рекомендується) | |
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=`Привіт, [[+name]]!`]] |
nl2br | Замінює символи нового рядка (\n) на HTML-тег |
[[+textfile:nl2br]] |
date | Перекладає таймстамп у текст відповідно до зазначеного формату (Формат дати) | [[+birthyear:date=`%Y`]] |
strtotime | Перекладає дату у вигляді тексту в UNIX таймстамп | [[+thetime:strtotime]] |
fuzzydate | Повертає дату у форматі "вчора, сьогодні, …". Приймає значення дати. | [[+createdon:fuzzydate]] |
ago | Повертає кількість секунд, хвилин, тижнів або місяців, що пройшли з дати, вказаної в мітці. | [[+createdon:ago]] |
md5 | Створює MD5-хеш значення | [[+password:md5]] |
cdata | Обертає висновок тегами CDATA | [[+content:cdata]] |
userinfo | Повертає потрібне значення з профілю користувача. Необхідно вказувати ID користувача | [[+modx.user.id:userinfo=`username`]] |
isloggedin | Повертає true, якщо користувач автентифікований у контексті | [[+modx.user.id:isloggedin]] |
isnotloggedin | Повертає true, якщо користувач НЕавтентифікований у поточному контексті | [[+modx.user.id:isnotloggedin]] |
urlencode | Конвертує значення в URL | [[+mystring:urlencode]] |
urldecode | Конвертує значення з URL | [[+myparam:urldecode]] |
Використання модифікаторів виводу разом із параметрами
Якщо тег має параметри, їх необхідно прописувати відразу після модифікатора:
Створення модифікатора користувача
Будь-який сніпет може використовуватися і як модифікатор виведення. Для його використання просто вкажіть ім'я сніпета замість модифікатора. Наприклад, створимо сніпет makeExciting, що додає до висновку певну кількість знаків оклику:
[[*pagetitle:makeExciting=`4`]]
Такий виклик тега передасть у сніпет makeExciting наступні параметри для обробки:
Модифікатор UserInfo
Прямий доступ до даних таблиці modx_user_attributesу базі даних, за допомогою модифікаторів виведення замість сніпетів, може бути досягнуто просто за рахунок використання модифікатора UserInfo.
Виберіть потрібний стовпець з таблиці та вкажіть його як властивість модифікатора, наприклад, так:
Значення | Модифікатор |
Внутрішній ключ користувача | [[!+modx.user.id:userinfo=`internalKey`]] |
Логін | [[!+modx.user.id:userinfo=`username`]] |
Повне ім'я | [[!+modx.user.id:userinfo=`fullname`]] |
Роль | [[!+modx.user.id:userinfo=`role`]] |
[[!+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`]] |
Сьогодні корисна стаття про фільтри 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…
PS: Не забуваємо відключатикешування тегів, де потрібно! Щоб це зробити – потрібно ПОБУТАТИвід знаків оклику ( ! ). Результати більшості сніпетів цілком можуть працювати з кешу. У наступному уроці розберемо.
Фільтри в революції дозволяють керувати способом представлення даних. Вони дозволяють змінювати значення усередині шаблонів.
У революції вихідний фільтр застосовується один або більше разів із серії вихідних модифікаторів, які поводяться подібно до PHx викликів у MODx Evolution - за винятком, що вони вбудовані в ядро. Синтаксис виглядає так:
[ ]
Вони також можуть бути з'єднані (виконується зліва направо):
[ ]
Ви також можете використовувати їх, щоб змінити вихід сніпету; увага, модифікатор йде після імені сніпета і перед знаком питання, наприклад,
[ ]
У наступній таблиці наведено деякі з існуючих модифікаторів і наведено приклади їх використання. Хоча наведені нижче приклади для деяких тегів, вихідні модифікатори можуть бути використані з будь-яким тегом MODx. Переконайтеся, що модифікатор отримує дані.
Умовні модифікатори:
Модифікатор |
Опис |
приклад |
if, input |
||
Логічне АБО |
[ [+numbooks:is=`5`:or:is=`6`:then=`There are 5 or 6 books!`:else=`Not sure how many books`] ] |
|
Логічне І |
||
isequalto, isequal, equalto, equals, is, eq |
[ [+numbooks:isequalto=`5`:then=`There are 5 books!`:else=`Not sure how many books`] ] |
|
notequalto, notequals, isnt, isnot, neq, ne |
[ [+numbooks:notequalto=`5`:then=`Not sure how many books`:else=`There are 5 books!`] ] |
|
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte |
Більше чи рівно |
[ [+numbooks:gte=`5`:then=`There are 5 books or more than 5 books`:else=`There are less than 5 books`] ] |
isgreaterthan, greaterthan, isgt, gt |
[ [+numbooks:gt=`5`:then=`There are more than 5 books`:else=`There are less than 5 books`] ] |
|
equaltoorlessthan, lessthanorequalto, el, le, islte, lte |
Менше або дорівнює |
[ [+numbooks:lte=`5`:then=`There are 5 or less than 5 books`:else=`There are more than 5 books`] ] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt |
[ [+numbooks:lt=`5`:then=`There are less than 5 books`:else=`There are more than 5 books`] ] |
|
[ [+numbooks:lt=`1`:hide] ] |
||
[ [+numbooks:gt=`0`:show] ] |
||
[ [+numbooks:gt=`0`:then=`Now available!`] ] |
||
[ [+numbooks:gt=`0`:then=`Now available!`:else=`Sorry, currently sold out.`] ] |
||
memberof, ismember, mo |
[ [+modx.user.id:memberof=`Administrator`] ] |
Строкові модифікатори:
Модифікатор |
Опис |
приклад |
Якщо не порожньо |
[ [+numbooks:cat=`books`] ] |
|
lcase, lowercase, strtolower |
Транформація у малі літери |
[ [+title:lcase] ] |
ucase, uppercase, strtoupper |
Трансформація у великі літери |
[ [+headline:ucase] ] |
Перша буква слова заголовна |
[ [+title:ucwords] ] |
|
Перша буква заголовна |
[ [+name:ucfirst] ] |
|
htmlent, htmlentities |
Заміна тегів HTML |
[ [+email:htmlent] ] |
esc,escape |
Безпечно прибирає символи |
[ [+email:escape] ] |
Заміна перекладу каретки, табуляції та безлічі прогалин на одну прогалину |
[ [+textdocument:strip] ] |
|
stripString |
Видаляє значення з рядка |
[ [+name:stripString=`Mr.`] ] |
Заміна значення |
[ [+pagetitle:replace=`Mr.==Mrs.`] ] |
|
striptags, stripTags, notags, strip_tags |
Прибирає HTML теги |
[[+code:strip_tags=` |
len,length, strlen |
Довжина рядка |
[ [+longstring:strlen] ] |
reverse, strrev |
Реверс рядка |
[ [+mirrortext:reverse] ] |
Wordwrap |
Новий рядок після вказаної кількості символів |
[ [+bodytext:wordwrap=`80`] ] |
wordwrapcut |
Вставляє новий рядок після певної кількості символів. |
[ [+bodytext:wordwrapcut=`80`] ] |
Кількість символів, що виводиться |
[ [+description:limit=`50`] ] |
|
ellipsis |
Обрізання рядка після вказаної кількості символів |
[ [+description:ellipsis=`50`] ] |
Відображає сирий елемент без тега. Корисно для документації. |
[ [+showThis:tag] ] |
Якщо значення може змінюватися динамічно, його слід зробити некешованим. Наприклад:
[ [+placeholder:default=`A default value!`] ]
Це означає, що значення іноді може бути порожнім, а іноді ні. Навіщо його зберігати у кеші? Це може виключити, що значення може з'явитися.
Якщо ви не впевнені, чи буде результат при виконанні сніпета, то логічно зробити значення за замовчуванням:
[ [!getResources:default=`Sorry - не збирається вашого search.`? &tplFirst=`blogTpl` &parents=`2,3,4,8` &tvFilters=`blog_tags==%%` &includeTVs=`1`] ]
Фільтри 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 | Замінює символи нового рядка на 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 наступні параметри для обробки:
Параметр | Значення | Значення у прикладі |
---|