Фільтри, вони ж модифікатори, в CMF MODx Revolution. Умовні модифікатори для шаблонів в MODX Modx фільтри

Умовні модіфіктори в Revolution дозволяють вам маніпулювати способом представлення або аналізу даних в тегах. Так-же дозволяють змінювати значення всередині ваших шаблонів.

Наприклад у нас є сниппет MainSlide (він виводить з таблиці MySql зображення в слайдер):

Для виведення слайдера на головній сторінці потрібно зробити просту умову за допомогою модифікатора MODX, даний модифікатор notempty робить перевірку міститься в плейсхолдоре рядок чи ні:

[[+ PlSliderMain: notempty \u003d `[[+ PlSliderMain]]`]]

В даному прикладі ми дані поклали в плейсхолдер і після робимо перевірку через модифікатор, так-же можна перевіряти поля MODX і создинние додаткові поля:

Якщо у вас є більш довгий код в операторі a: then \u003d ``: else \u003d ``, і ви хочете зробити його більш читабельним, поставивши його на кілька рядків, це потрібно зробити в такий спосіб:

[[+ Placeholder: is \u003d `0`: then \u003d`
// code
`: Else \u003d`
// code
`]]

У наступній списку перераховані найпотрібніші умовні з існуючих модифікаторів і наведені приклади їх використання. Вихідні модифікатори можуть використовуватися з будь-якими тегами MODx.

модифікатор or, and

Перевірка на кілька значень.

[[+ Slide: is \u003d `5`: or: is \u003d` 6`: then \u003d `В слайдері є контент`: else \u003d` В слайдері пусто`]]
[[+ Slide: is \u003d `5`: and: is \u003d` 6`: then \u003d `В слайдері є контент`: else \u003d` В слайдері пусто`]]

модифікатор is

Якщо тег дорівнює модифікатору.

[[* Slide: is \u003d `5`: then \u003d` В слайдері є контент`]]
[[* Slide: is \u003d `5`: then \u003d` В слайдері є контент`: else \u003d `В слайдері пусто`]]

модифікатор ne

Якщо порожній дорівнює модифікатору.

[[* Id: ne \u003d `1`: then \u003d` Чи не головна страніца`: else \u003d `Головна страніца`]]

модифікатор notempty

Поверне, вказаний модифікатор, якщо значення не порожньо.

[[* Content: notempty \u003d `[[* content]]`]]

модифікатор hide, show

Приховує елемент, якщо умова виконується або показує.

модифікатор then, else

Умова, якщо тег відповідає модифікатору, виводимо повідомлення.
Умова, якщо тег не відповідає модифікатору, виводимо повідомлення. Використовується тільки в зв'язці з "then"

[[* Id: is \u003d `1`: then \u003d` Виводимо слайдер`: else \u003d `Слайдер тільки на главной`]]

Сьогодні корисна стаття про фільтри phx і їх модифікатори MODX Revo за допомогою яких ви зможете прямо всередині шаблонів, маніпулювати значенням різних тегів.

Навіщо вони потрібні?

phx модифікатори полегшують життя modx розробникам. Припустимо у нас є сайт з каруселлю зображень (ну або з банером), який потрібно виводити тільки на головній сторінці. Для цього досить помістити його в окремий чанк і потім вивести в шаблоні за допомогою такої конструкції

де: 1 - id головної сторінки,
$ carusel - чанк з кодом каруселі (банера).
Тільки повні чайники створюють новий шаблон, заради кількох рядків коду каруселі. Я теж таким був, загалом не впадаємо і впроваджуємо phx в розробку.

Розберемо вищенаведену конструкцію по докладніше:

[[* Id: is \u003d `1`: then \u003d` [[$ carusel]] `]]

* id - виводить id поточної сторінки;

: Is \u003d `1`: then \u003d

- перевіряє чи рівне * Id \u003d\u003d 1? і якщо так само, то виводиться вміст then;
$ carusel - виводить чанк carusel.

Замість * id, можна використовувати і інші поля, наприклад * template - виведе поточний використовуваний шаблон. Або можна перевіряти заповнене чи ні TV-поле (нехай буде * keywords) і якщо воно заповнене, то виводити його. Розберемо даний випадок детальніше. Дано стандартна розмітка:

завдання: не виводити цей рядок, якщо TV keywords не заповнено.
Рішення.

[[* Keywords:! Empty \u003d ` `]]

навантаження

Потрібно стежити за обробкою модифікаторів, бездумне їх використання викличе зайві навантаження. Повернемося до каруселі, даний запис зчитується зліва направо і Модха виконує всі вкладені умови, в незалежності від того, вірне умова чи ні, чи буде виводиться на поточній сторінці вміст [[$ Carusel]], В будь-якому випадку його вміст буде опрацьовано. У зв'язку з цим більш доцільно переписати запис:

[[$ Caru [[* id: is \u003d `1`: then \u003d` sel`]]]]

В цьому випадку, вміст чанка $ carusel, Буде оброблено в разі, якщо виконується умова

* Id: is \u003d `1`

тому виконується

[[* Id: is \u003d `1`: then \u003d` sel`]]

і якщо id поточної сторінки дорівнює 1, останнє що обробляється - [[$ Carusel]], Якщо id не дорівнює 1, тоді - [[$ Caru]]. А якщо чанка $ caru - немає в елементах, то і навантаження не буде.

А взагалі ідеальний висновок буде виглядати так.

[[$ [[* Id: is \u003d `1`: then \u003d` carusel`]]]]

Про те, як правильно інтегрувати верстку в modx revo в рекомендую почитати тут.

Примітка! Ви можете комбінувати скільки завгодно модифікаторів під логіку роботи компонентів сайту, але головне пам'ятайте, їх основна суть - полегшити розробку, А не ускладнювати без того складні завдання. Зазвичай, найефективніший і дієвий спосіб - це найпростіший, так як чим простіше і зрозуміліше конструкція - тим легше з нею буде працювати надалі. Нижче перераховані основні модифікатори, які можете використовувати для будь-якого тега Модха Рево.

ланцюжки модифікаторів

Хорошим прикладом побудови ланцюжка буде відформатувати рядок дати в інший формат, наприклад, так:

[[+ Mydate: strtotime: date \u003d `% Y-% m-% d`]]

Прямий доступ до таблиці «modx_user_attributes» в базі даних з використанням вихідних модифікаторів замість сниппета можна здійснити просто шляхом використання модифікатора userinfo. Вибрати відповідний стовпець з таблиці і вказати його в якості властивості вихідного модифікатора, наприклад, так:

Внутрішній ключ користувача: [[! + Modx.user.id: userinfo \u003d `internalKey`]] Логін: [[! + Modx.user.id: userinfo \u003d` username`]] Повне ім'я: [[! + Modx.user .id: userinfo \u003d `fullname`]] Роль: [[! + modx.user.id: userinfo \u003d` role`]] E-mail: [[! + modx.user.id: userinfo \u003d `email`]] Телефон: [[! + modx.user.id: userinfo \u003d `phone`]] Мобільний телефон: [[! + modx.user.id: userinfo \u003d` mobilephone`]] Факс: [[! + modx.user.id : userinfo \u003d `fax`]] День народження: [[! + modx.user.id: userinfo \u003d` dob`: date \u003d `% Y-% m-% d`]] Пол: [[! + modx.user .id: userinfo \u003d `gender`]] Країна: [[! + modx.user.id: userinfo \u003d` country`]] Штат: [[! + modx.user.id: userinfo \u003d `state`]] Zip код : [[! + modx.user.id: userinfo \u003d `zip`]] Фото: [[! + modx.user.id: userinfo \u003d` photo`]] Коментар: [[! + modx.user.id: userinfo \u003d `comment`]] Дата останнього входу: [[! + modx.user.id: userinfo \u003d` lastlogin`: date \u003d `% Y-% m-% d`]] Кількість входів: [[! + modx.user .id: userinfo \u003d `logincount`]]

Особливу увагу звертаємо на знак оклику [[ ! + Modx.user.id]]. він дозволяє НЕ кешувати вміст виведення. Чому потрібно не кешувати? Уявімо це так: на сайті 5 користувачів. Перший користувач зайшов на сторінку з викликом:

Ласкаво просимо, [[! + Modx.user.id: userinfo \u003d `username`]]!

За задумом на цій сторінці, виводиться вітальне повідомлення користувачу. Так ось, якщо результат буде кешироваться, то при першому вході на цю сторінку - збережеться ім'я користувача який щойно зайшов - і всім іншим буде показуватися не їхня ім'я, а ім'я того користувача який увійшов на цю сторінку першим. Щоб цього уникнути - просто не кешіруем цей тег, за допомогою знаку оклику перед викликом [[ ! + Modx ...

P.s .: Не забуваємо відключати кешування тегів, де потрібно! Щоб це зробити - потрібно позбавлятися від знаків оклику ( ! ). Результати більшості фрагментів вплоне собі можуть працювати з кешу. У наступному уроці розберемо.

У MODx існують вбудований синтаксис для використання конструкцій if else.

модифікатори виведення

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

Умовні модифікатори виведення

модифікатор опис приклад використання
if, input if - задає додаткову умову input - додає в тег обративаемие дані
or Об'єднання декількох модифікаторів зв'язком АБО

[[* Id: is \u003d `5`: or: is \u003d` 6`: then \u003d `номер 5 або 6`: else \u003d` інший номер`]]

and Об'єднання декількох модифікаторів зв'язком І

[[* Id: is \u003d `1`: and: if \u003d` [[* id]] `: ne \u003d` 2`: then \u003d `da`: else \u003d` net`]]

isequalto, isequal, equalto, equals, is, eq Порівнює передане значення з встановленим. Якщо значення збігаються, виводиться значення «then», якщо ні - «else»

[[* Id: is \u003d `5`: then \u003d` номер 5`: else \u003d `номер не 5`]]

notequalto, notequals, isnt, isnot, neq, ne Порівнює передане значення з встановленим. Якщо значення НЕ збігаються, виводиться значення «then», якщо ні - «else»

[[* Id: isnot \u003d `5`: then \u003d` номер не 5`: else \u003d `мабуть номер 5`]]

greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte Те ж, тільки умова «Більше або дорівнює»

[[* Id: gte \u003d `5`: then \u003d` номер 5 або больше`: else \u003d `менше п'ятого номера`]]

isgreaterthan, greaterthan, isgt, gt Те ж, тільки умова «Строго більше»

[[* Id: gt \u003d `5`: then \u003d` номер більше пяті`: else \u003d `номер 5 або меньше`]]

equaltoorlessthan, lessthanorequalto, el, le, islte, lte Те ж, тільки умова «Менше або дорівнює»

[[* Id: lte \u003d `5`: then \u003d` номер 5 або меньше`: else \u003d `більше, ніж номер 5`]]

islowerthan, islessthan, lowerthan, lessthan, islt, lt Те ж, тільки умова «Строго менше»

[[* Id: lte \u003d `5`: then \u003d` номер точно менше 5`: else \u003d `номер 5 або больше`]]

hide Приховує елемент, якщо умова виконується

[[* Id: lt \u003d `1`: hide]]

show Відображає елемент, якщо умова виконується

[[* Id: gt \u003d `0`: show]]

then Використовується для складання умов

[[* Id: gt \u003d `0`: then \u003d` Книги в наявності! `]]

else Використовується для складання умов (спільно з «then»)

[[* Id: gt \u003d `0`: then \u003d` Книги в наявності! `: Else \u003d` Вибачте, але все продано.`]]

select Встановити своє значення, в залежності від модифікатора та виведення тега. Так само можна використовувати "else", наприклад якщо значення [[+ controls]] - не підходить під шаблон select

[[+ Controls: select \u003d `0 \u003d ВИКЛ & 1 \u003d ВКЛ & 2 \u003d ХЗ`: else \u003d` Ошібка`]]

memberof, ismember, mo Перевіряє, чи є користувач членом зазначеної групи користувачів

[[+ Modx.user.id: memberof \u003d `Administrator`]]

Також фільтри можуть застосовуватися для модифікації виводу сніпетів. Фільтр потрібно прописувати перед усіма параметрами (перед знаком питання):

Також для того що б мати можливість користуватися вкладення конструкціями можна скористатися додатковим пакетом, який має короткий і ємне назву If. Завантажити його можна зайшовши в Система-\u003e Управління пакетами.

Так буде виглядати код умови:

[[! If? & Subject \u003d `[[+ total]]` & operator \u003d `GT` & operand \u003d` 3` & then \u003d `You have more than 3 items!`]]

Параметри пакета if:

subject - Параметр, за яким виконуються умови.

operator - Оператор порівняння з subject

operand - Використовується в разі потреби і являє собою значення subject (предмета порівняння) з використанням operator (оператора порівняння).

then - Код, який виводитися в тому випадку якщо умова приймає значення true

else - Код, який виводитися в тому випадку якщо умова приймає значення false

debug - Якщо значення true, відобразить всі передані параметри

die - Якщо налагодження (debag) пройшла успішно і відповідає значенню true, то після виведення параметрів застосувати функцію die ().

параметри

Назва опис за умовчання
subject Параметр, за яким виконуються умови.
operator Оператор порівняння з subject =
operand Використовується в разі потреби і являє собою значення subject (Предмета порівняння) з використанням operator (Оператора порівняння).
then true
else Код, який виводитися в тому випадку якщо умова приймає значення false
debug Якщо значення true , Відобразить всі передані параметри 0
die Якщо налагодження (debag ) Пройшла успішно і відповідає значенню true , То після виведення параметрів застосувати функцію die (). 0

Оператори:

Назва: опис:
! \u003d, Neq, not, isnot, isnt, unequal, notequal Перевіряє якщо subject НЕ дорівнює зазначеному значенню operand
\u003d\u003d, \u003d, eq, is, equal, equals, equalto Перевіряє якщо subject дорівнює зазначеному значенню operand
< ,lt,less,lessthan Проверяте якщо subject менше вказаного значення operand
\u003e, Gt, greater, greaterthan Перевіряє якщо subject більше зазначеного значення operand
< =,lte,lessthanequals,lessthanorequalto Перевіряє якщо subject менше або дорівнює вказаного значення operand
\u003e \u003d, Gte, greaterthanequals, greaterthanequalto Перевіряє якщо subject більше або дорівнює вказаного значення operand
isempty, empty Перевіряє якщо subject має пусте значення
! Empty, notempty, isnotempty Перевіряє якщо subject має якесь значення
is, null Перевіряє якщо subject дорівнює null
inarray, in_array, ia Перевіряє якщо subject знайдений в списку operand (Рядок розділена коми)

І так, фільтр який ви зможете собі зробити на сайт дуже універсальний!
Його можна буде застосувати до будь-якого проекту і при цьому заощадивши багато часу

Для початку необхідно встановити пакет 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 \u200b\u200b\u003d 200, // Fade Animation Speed \u200b\u200bajaxCountSelector \u003d ".ajax-count", // CSS Selector of Items Counter ajaxContainerSelector \u003d ".ajax-container" , // CSS Selector of Ajax Container ajaxItemSelector \u003d ".ajax-item", // CSS Selector of Ajax Item ajaxFormSelector \u003d ".ajax-form", // CSS Selector of Ajax Filter Form ajaxFormButtonStart \u003d ".ajax-start", // CSS Selector of Button Start Filtering ajaxFormButtonReset \u003d ".ajax-reset", // CSS Selector of Button Reset Ajax Form sortDownText \u003d "За зменшенням", sortUpText \u003d "По зростанню"; function ajaxCount () (if ($ ( " .ajax-filter-count "). length) (var count \u003d $ (". ajax-filter-count "). data (" count "); $ (ajaxCountSelector) .text (count);) else ($ (ajaxCountSelector ) .text ($ (ajaxItemSelector) .length);)) ajaxCount (); function ajaxMainFunction () ($ .ajax ((data: $ (ajaxFormSelector) .serialize ())). done (function (response) (var $ response \u003d $ (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 \u003d $ (ajaxItemSelector) .length; $ .ajax ((data: $ (ajaxFormSelector ) .serialize () + "& offset \u003d" + offset)). done (function (response) ($ ( ". ajax-more"). remove (); var $ response \u003d $ (response); $ response.find ( ajaxItemSelector) .hide (); $ (ajaxContainerSelector) .append ($ response.find (ajaxContainerSelector) .html ()); $ (ajaxItemSelector) .fadeIn ();));)) $ (ajaxFormButtonStart) .click (function ( e) (e.preventDefault (); ajaxMainFunction ();)) $ (ajaxFormButtonReset) .click (function (e) (e.preventDefault (); $ (ajaxFormSelector) .trigger ( "reset"); $ ( "input" ) .val ( "pagetitle"); $ ( "input"). val ( "asc"); setTimeout (function () ($ ( ""). data ( "sort-dir", "asc"). toggleClass ( "button-sort-asc"). text (sortUpText);), fadeSpeed); ajaxMainFunction (); ajaxCount ();)) $ ( "" + ajaxFormSelector + "input"). change (function () (ajaxMainFunction (); )) $ ( ""). data ( "sort-dir", "asc"). click (function () (var ths \u003d $ (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") \u003d\u003d "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 і заповніть його наступного змісту:
\u003d ". $ _ GET [" area_from "];) if ($ _ GET [" area_to "]) ($ filter \u003d" area<=".$_GET["area_to"]; } //Checkbox Type if($_GET["garage"]) { $filter = "garage=1"; } //End Settings //Sort if($_GET["sortby"]) { $sortby = $_GET["sortby"]; } else { $sortby = "pagetitle"; } if($_GET["sortdir"]) { $sortdir = $_GET["sortdir"]; } else { $sortdir = "asc"; } //End Sort //Offset $offset = 0; if($_GET["offset"]){ $offset = $_GET["offset"]; } if($filter) { $where = $modx->toJSON (array ($ filter)); ) Else ($ where \u003d "";) $ params_count \u003d array ( "parents" \u003d\u003e $ parents, "limit" \u003d\u003e 0, "tpl" \u003d\u003e "@INLINE,", "select" \u003d\u003e "id", "includeTVs" \u003d\u003e $ fields, "showHidden" \u003d\u003e "1", "where" \u003d\u003e $ where); $ Count \u003d $ modx-\u003e runSnippet ( "pdoResources", $ params_count); $ Count \u003d count (explode ( ",", $ count)) - 1; $ Modx-\u003e setPlaceholder ( "count", $ count); $ Params \u003d array ( "parents" \u003d\u003e $ parents, "limit" \u003d\u003e $ limit, "offset" \u003d\u003e $ offset, "tpl" \u003d\u003e $ tpl, "select" \u003d\u003e "id, pagetitle, introtext, content "," includeTVs "\u003d\u003e $ fields," showHidden "\u003d\u003e" 1 "," sortby "\u003d\u003e $ sortby," sortdir "\u003d\u003e $ sortdir," where "\u003d\u003e $ where); $ More \u003d $ count - $ offset - $ limit; $ Lim \u003d $ more\u003e $ limit? $ Limit: $ more; $ Button \u003d ""; if ($ more\u003e 0) ($ button \u003d "
Завантажити ще ". $ Lim." з ". $ more."
";) Return $ modx-\u003e runSnippet (" pdoResources ", $ params). $ Button;

Між коментарями // Filter Fields Settings і // End Settings знаходяться параметри, які вам необхідно відредагувати під свій проект. Тут ні чого складного, просто прописуєте name полів input і перевіряєте їх умовою if. Для полів типу Radio, Select і Text використовуємо приклад з рядків 5-8. Для визначення проміжного значення від і до можна скористатися прикладом з рядків 11-16. Для чекбоксів підійде приклад з рядків 19-21.

У рядку 74 сниппета ви можете задати свої класи, але не видаляє поточний розмітку, так як вона бере участь в скриптах для подгрузки контенту.

Приклад можливих значень в панелі управління MODx для радіокнопок: Перший \u003d\u003d 1 || Другий \u003d\u003d 2 || Третій \u003d\u003d 3

Приклад виведення радіокнопок у фронтенд:

Тут іменування name \u003d "floor» відповідає рядкам 6-8 нашого сниппета catalogFilter. Аналогічно реалізована обробка інших полів форми. Я думаю, це зрозуміло і створення своїх власних полів не буде для вас проблемою.

Висновок сниппета здійснюється в шаблоні каталогу наступним чином:

[[! CatalogFilter? & Tpl \u003d `tplCatItem` & limit \u003d` 3` & parents \u003d `5` & fields \u003d` image, area, floor, garage, price`]]

  • tpl \u003d `tplCatItem` - чанк Айтем в списку каталогу;
  • limit \u003d `3` - Скільки записів виводити і по скільки записів довантажувати при кліці на кнопці« Завантажити ще »;
  • parents \u003d `5` - вказуємо id роітельского документа для каталогу ресурсів;
  • fields \u003d `image, area, floor, garage, price` - перераховуємо TV" s, які необхідно показати в чанка tplCatItem і які необхідно обробляти при фільтрації.
Приклад чанка tplCatItem

[[+ Pagetitle]]

[[+ Tv.area: isnot \u003d ``: then \u003d ` `]]
поверх [[+ Tv.floor]]
Площа [[+ Tv.area]] кв.м.
гараж [[+ Tv.garage: is \u003d `1`: then \u003d` Есть`: else \u003d `немає`]]
Ціна: [[+ Tv.price]]

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

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

Сортувати за ціною:

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

Отже, ми розглянули створення нескладного Ajax фільтра ресурсів в MODx з висновком результатів в сниппет pdoResources.

Сьогодні корисна стаття про фільтри phx і їх модифікатори MODX Revo за допомогою яких ви зможете прямо всередині шаблонів, маніпулювати значенням різних тегів.

Навіщо вони потрібні?

phx модифікатори полегшують життя modx розробникам. Припустимо у нас є сайт з каруселлю зображень (ну або з банером), який потрібно виводити тільки на головній сторінці. Для цього досить помістити його в окремий чанк і потім вивести в шаблоні за допомогою такої конструкції

де: 1 - id головної сторінки,
$ carusel - чанк з кодом каруселі (банера).
Тільки повні чайники створюють новий шаблон, заради кількох рядків коду каруселі. Я теж таким був, загалом не впадаємо і впроваджуємо phx в розробку.

Розберемо вищенаведену конструкцію по докладніше:

[[* Id: is \u003d `1`: then \u003d` [[$ carusel]] `]]

* id - виводить id поточної сторінки;

: Is \u003d `1`: then \u003d

- перевіряє чи рівне * Id \u003d\u003d 1? і якщо так само, то виводиться вміст then;
$ carusel - виводить чанк carusel.

Замість * id, можна використовувати і інші поля, наприклад * template - виведе поточний використовуваний шаблон. Або можна перевіряти заповнене чи ні TV-поле (нехай буде * keywords) і якщо воно заповнене, то виводити його. Розберемо даний випадок детальніше. Дано стандартна розмітка:

завдання: не виводити цей рядок, якщо TV keywords не заповнено.
Рішення.

[[* Keywords:! Empty \u003d ` `]]

навантаження

Потрібно стежити за обробкою модифікаторів, бездумне їх використання викличе зайві навантаження. Повернемося до каруселі, даний запис зчитується зліва направо і Модха виконує всі вкладені умови, в незалежності від того, вірне умова чи ні, чи буде виводиться на поточній сторінці вміст [[$ Carusel]], В будь-якому випадку його вміст буде опрацьовано. У зв'язку з цим більш доцільно переписати запис:

[[$ Caru [[* id: is \u003d `1`: then \u003d` sel`]]]]

В цьому випадку, вміст чанка $ carusel, Буде оброблено в разі, якщо виконується умова

* Id: is \u003d `1`

тому виконується

[[* Id: is \u003d `1`: then \u003d` sel`]]

і якщо id поточної сторінки дорівнює 1, останнє що обробляється - [[$ Carusel]], Якщо id не дорівнює 1, тоді - [[$ Caru]]. А якщо чанка $ caru - немає в елементах, то і навантаження не буде.

А взагалі ідеальний висновок буде виглядати так.

[[$ [[* Id: is \u003d `1`: then \u003d` carusel`]]]]

Про те, як правильно інтегрувати верстку в modx revo в рекомендую почитати тут.

Примітка! Ви можете комбінувати скільки завгодно модифікаторів під логіку роботи компонентів сайту, але головне пам'ятайте, їх основна суть - полегшити розробку, А не ускладнювати без того складні завдання. Зазвичай, найефективніший і дієвий спосіб - це найпростіший, так як чим простіше і зрозуміліше конструкція - тим легше з нею буде працювати надалі. Нижче перераховані основні модифікатори, які можете використовувати для будь-якого тега Модха Рево.

ланцюжки модифікаторів

Хорошим прикладом побудови ланцюжка буде відформатувати рядок дати в інший формат, наприклад, так:

[[+ Mydate: strtotime: date \u003d `% Y-% m-% d`]]

Прямий доступ до таблиці «modx_user_attributes» в базі даних з використанням вихідних модифікаторів замість сниппета можна здійснити просто шляхом використання модифікатора userinfo. Вибрати відповідний стовпець з таблиці і вказати його в якості властивості вихідного модифікатора, наприклад, так:

Внутрішній ключ користувача: [[! + Modx.user.id: userinfo \u003d `internalKey`]] Логін: [[! + Modx.user.id: userinfo \u003d` username`]] Повне ім'я: [[! + Modx.user .id: userinfo \u003d `fullname`]] Роль: [[! + modx.user.id: userinfo \u003d` role`]] E-mail: [[! + modx.user.id: userinfo \u003d `email`]] Телефон: [[! + modx.user.id: userinfo \u003d `phone`]] Мобільний телефон: [[! + modx.user.id: userinfo \u003d` mobilephone`]] Факс: [[! + modx.user.id : userinfo \u003d `fax`]] День народження: [[! + modx.user.id: userinfo \u003d` dob`: date \u003d `% Y-% m-% d`]] Пол: [[! + modx.user .id: userinfo \u003d `gender`]] Країна: [[! + modx.user.id: userinfo \u003d` country`]] Штат: [[! + modx.user.id: userinfo \u003d `state`]] Zip код : [[! + modx.user.id: userinfo \u003d `zip`]] Фото: [[! + modx.user.id: userinfo \u003d` photo`]] Коментар: [[! + modx.user.id: userinfo \u003d `comment`]] Дата останнього входу: [[! + modx.user.id: userinfo \u003d` lastlogin`: date \u003d `% Y-% m-% d`]] Кількість входів: [[! + modx.user .id: userinfo \u003d `logincount`]]

Особливу увагу звертаємо на знак оклику [[ ! + Modx.user.id]]. він дозволяє НЕ кешувати вміст виведення. Чому потрібно не кешувати? Уявімо це так: на сайті 5 користувачів. Перший користувач зайшов на сторінку з викликом:

Ласкаво просимо, [[! + Modx.user.id: userinfo \u003d `username`]]!

За задумом на цій сторінці, виводиться вітальне повідомлення користувачу. Так ось, якщо результат буде кешироваться, то при першому вході на цю сторінку - збережеться ім'я користувача який щойно зайшов - і всім іншим буде показуватися не їхня ім'я, а ім'я того користувача який увійшов на цю сторінку першим. Щоб цього уникнути - просто не кешіруем цей тег, за допомогою знаку оклику перед викликом [[ ! + Modx ...

P.s .: Не забуваємо відключати кешування тегів, де потрібно! Щоб це зробити - потрібно позбавлятися від знаків оклику ( ! ). Результати більшості фрагментів вплоне собі можуть працювати з кешу. У наступному уроці розберемо.