12 марта 2017, 14:55

Фильтры phx ( модификаторы ) в modx revo

Фильтры phx ( модификаторы ) в modx revo

Фильтры phx ( модификаторы ) в modx revo

Фильтры PHx (Placeholders Xtended) добавляют новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Фильтры модификаторы phx позволяют манипулировать значением тегов, непосредственно внутри шаблона.

Все довольно просто, модификаторы phx значительно облегчают жизнь разработчику сайта. Например есть сайт и необходимо только на главной странице показывать слайдер, ну или любой другой банер. В шаблоне сайта достаточно прописать

[[*id:is=`1`:then=`[[$slider]]`]]
,

где 1 - это id главной страницы, а $slider - чанк с html кодом слайдера... и т.д. и т.п. Только чайники создают новый шаблон и копируют туда весь html-код страницы, ради пары строчек слайдера/банера. Но не печальтесь, все мы такими были, поэтому просвещайтесь и пользуйтесь в будущем фильтрами модификаторами phx.

[[*id:is=`1`:then=`[[$slider]]`]]

Дано:
*id - выводит id текущей страницы;
:is=`1`:then= - проверяет равно ли *id == 1? и если ДА, то выводит содержимое then;
$slider - выводит чанк в котором находится верстка и вывод слайдера.

Вместо *id, использовано может быть любое другое поле, например *template - выведет текущий используемый шаблон. Или можно проверять не пусто ли TV-поле *slider или как там его?

Примеры использования PHx фильтра в MODx


Пример 1:

Хорошим тоном считается когда клик по логотипу компании отправляет на главную страницу сайта. Но ссылка должна быть неактивна, если пользователь находится как раз на главной.

Т.к. в MODX чаще всего вы используете шаблоны страниц, в данном случае вам бы потребовалось создать два шаблона.

Один для главной без ссылки:

<img src="logo.svg">

Второй для внутренних страниц со ссылкой:

<a href="[[~1]]"><img src="logo.svg"></a>

Это неудобно. С помощью PHx модификатора is (равенство) вы можете сделать так:

[[*id:is=`1`:then=`<img src="logo.svg">`:else=`<a href="[[~1]]"><img src="logo.svg"></a>`]]

Если id страницы равен 1, вернуть логотип со ссылкой, а если id не равен 1, вернуть логотип без ссылки. Тем самым вы избавляетесь от создания двух практически идентичных шаблонов и обходитесь одним, но с модификатором вывода.

Пример 2:

Нам требуется вывести разные названия страницы в зависимости от шаблона.

[[*template:is=`1`:or:is=`2`:then=`[[*pagetitle]]`:else=`[[*longtitle]]`]]

Если шаблон страницы равен 1 или равен 2, вернуть [[*pagetitle]], иначе вернуть [[*longtitle]]

Как видите, можно использовать несколько модификаторов в одной цепочке. Хотя, правильнее было бы написать так:

[[[[*template:is=`1`:or:is=`2`:then=`*pagetitle`:else=`*longtitle`]]]]

В следующих таблицах перечислены некоторые модификаторы PHx, которые могут быть использованы для любого тега MODx Revolution.

Модификаторы условия


Модификатор Описание Пример
if,input if - задает дополнительное условие
input - добавляет в тег обратываемые данные
[[+phx:input=`/assets/img/photo.gif`]] - добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение.
Или [[+phx:input=`/assets/img/photo.gif`:contains=`photo.gif`:then=`da`:else=`net`]] проверить есть ли в пути определенная последовательность символов.

[[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]] - если id-ресурса = 1 и не равно 2, выводим "da", или же "net"
or,and or - условие "ИЛИ"
and - условие "И"
[[*id:is=`1`:or:if=`[[*id]]`:is=`2`:then=`da`:else=`net`]] - если id-ресурса = 1 или = 2, выводим "da", или же "net".

[[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`da`:else=`net`]] - если id-ресурса = 1 и не равно 2, выводим "da", или же "net"
isequalto, isequal, equalto, equals, is, eq Если тег равен модификатору, используется с "then" и "else." [[*id:is=`1`:then=`da`:else=`net`]] - если id-ресурса = 1, выводим "da", или же "net"
notequalto, notequals, isnt, isnot, neq, ne Если тег не равен модификатору, используется с "then" и "else". [[*id:ne=`1`:then=`da`:else=`net`]] - если id-ресурса не равно 1, выводим "da", или же "net"
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte Если тег больше или равен модификатору, используется с "then" и "else". [[*id:ge=`1`:then=`da`:else=`net`]] - если id-ресурса больше или равен 1, выводим "da", или же "net"
isgreaterthan, greaterthan, isgt, gt Если тег больше модификатора, используется с "then" и "else". [[*id:gt=`1`:then=`da`:else=`net`]] - если id-ресурса больше 1, выводим "da", или же "net"
equaltoorlessthan, lessthanorequalto, el, le, islte, lte Если тег меньше или равен модификатору, используется с "then" и "else". [[*id:el=`10`:then=`da`:else=`net`]] - если id-ресурса меньше или равно 10, выводим "da", или же "net"
islowerthan, islessthan, lowerthan, lessthan, islt, lt Если тег меньше модификатора, используется с "then" и "else". [[*id:lt=`10`:then=`da`:else=`net`]] - если id-ресурса меньше 10, выводим "da", или же "net"
contains Если тег содержит модификатор, используется с "then" и "else". [[+author:contains=`Сэ́мюэл Кле́менс`:then=`Марк Твен`]] - если в теге содержится фраза "Сэ́мюэл Кле́менс" выводим "Марк Твен"
containsnot Если тег не содержит модификатор, используется с "then" и "else". [[+author:containsnot=`Сэ́мюэл Кле́менс`:then=`Кто-нибудь еще`]] - если в теге не содержится фраза "Сэ́мюэл Кле́менс" выводим "Кто-нибудь еще"
hide Если предыдущий модификатор возвращает положительное значение ("then"), то не выводим обработанный тег. [[*id:is=`10`:hide]] - если id-ресурса = 10, ничего не выводим
show Если предыдущий модификатор возвращает положительное значение ("then"), то выводим обработанный тег. [[*id:is=`10`:show]] - если id-ресурса = 10, выводим.
then Условие, если тег соответствует модификатору, выводим сообщение, иначе ничего не выводим [[*id:is=`10`:then=`ept`]] - если id-ресурса = 10, выводим "ept".
else Условие, если тег не соответствует модификатору, выводим сообщение. Используется только в связке с "then" [[*id:is=`10`:then=`ept`:else=`nooo`]] - если id-ресурса = 10, выводим "ept" иначе "nooo".
select Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать "else", например если значение - не подходит под шаблон select [[+controls:select=`0=ВЫКЛ&amp;1=ВКЛ&amp;2=ХЗ`:else=`Ошибка`]] - если тег - выводит "0", значит выводим "ВЫКЛ", если тот же тег равен "1" выводим "ВКЛ", если "2" выводим "ХЗ", если тег не подходит нашей выборке, то выводим "Ошибка".
in Работает аналогично php in_array, если тег совпадет с одним из элементов модификатора (разделяются они запятыми), то выводим then, если не совпало else [[*template:in=`3,4`:then=`[[$myChank]]`:else=`пробел`]] - если тег 12 (текущий шаблон) - равен "3" или "4", значит выводим , если не равен, выводим else.

 

Модификаторы строки


Модификатор Описание Пример
cat Добавляет к тегу строку. [[+num:cat=` раз`]], выведет к примеру "10 раз".
lcase, lowercase, strtolower Переведет значение тега в нижний регистр, аналогично функции php strtolower. [[*pagetitle:lcase]]
ucase, uppercase, strtoupper Переведет текст в верхний регистр, аналогично функции php strtoupper. [[*pagetitle:ucase]]
ucwords Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords. [[*pagetitle:ucwords]]
ucfirst Переведет только первую букву строки в верхний регистр, аналогично функции php ucfirst. [[*pagetitle:ucfirst]]
htmlent, htmlentities Преобразует все символы в соответствющие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции php htmlentities. Использует текущие настройки системы "modx_charset" с флагом "ENT_QUOTES". [[*pagetitle:htmlentities]]
esc,escape Экранирует разные "плохие символы", так же экранирует [, ] и `. [[*content:esc]]
strip Заменяет все переносы строк, табуляции и множественные пробелы с на один пробел. [[*content:strip]]
stripString Вырезает из строки заданную строку. [[*pagetitle:stripString=`писька`]]
replace Обычная замена. [[*pagetitle:replace=`писька==конфетка`]]
striptags, stripTags,notags,strip_tags Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags [[*longtitle:strip_tags=`

`]]

len,length, strlen Возвращает длину строки, аналогично функции php strlen [[*longtitle:strlen]]
reverse, strrev Переворачивает строку, аналогично функции php strrev [[*longtitle:reverse]]
wordwrap Устанавливает переносы в зависимости от кол-ва символов слова, аналогично функции php wordwrap [[*pagetitle:wordwrap=`10`]]
limit Устанавливает лимит на длинну строки и обрезает ее. [[*pagetitle:limit=`10`]]
ellipsis Устанавливает лимит на длинну строки и обрезает ее, добавляя три точки в конце [[*pagetitle:ellipsis=`10`]]
tag Вернет, запись тега. [[*pagetitle:ellipsis=`10`:tag]]вернет: [[*pagetitle:ellipsis=`10`]]
add, increment, incr Вернет, значение + модификатор ( по умолчанию +1 ). [[+num:incr]] или [[+num:add=`97`]]
subtract, decrement, decr Вернет, значение - модификатор ( по умолчанию -1 ). [[+num:decr]] или [[+num:decr=`97`]]
multiply, mpy Вернет, значение * модификатор ( по умолчанию *2 ). [[+num:mpy]] или [[+num:mpy=`5`]]
divide, div Вернет, значение / модификатор ( по умолчанию /2 ). [[+num:div]] или [[+num:div=`5`]]
modulus, mod Вернет, целочисленный остаток от деления значения на модификатор ( по умолчанию % 2. Вернет 1 или 0. ) [[+num:mod]] или [[+num:mod=`5`]]
ifempty, default, empty, isempty Вернет, указанный модификатор, если значение пусто. [[*pagetitle:empty=`Пусто`]]
notempty, !empty, ifnotempty, isnotempty Вернет, указанный модификатор, если значение не пусто. [[*pagetitle:!empty=`Не пусто!`]]
nl2br Вернет строку с "<br />" или "<br>" вставленные перед всеми (\r\n, \n\r, \n и \r)..., аналогично функции php nl2br [[*pagetitle:nl2br]]Фильтры phx ( модификаторы ) в modx revo
date Аналогично функции PHP strftime. Значение - отформатировано. [[+birthyear:date=`%Y`]]
strtotime Аналогично функции PHP strtotime. Вернет дату.  [[*createdon:strtotime]], - вернет типа "1489554128"
fuzzydate Вернет дату. Типа вчера, сегодня.... [[*createdon:fuzzydate]], - вернет типа "Mar 15"
ago Вернет дату в прошедших секундах, минутах, неделях или месяцах. [[*createdon:ago]], - вернет типа "6 месяцев назад"
md5 Аналогично функции php md5. [[+password:md5]].
cdata Вставляет строку в оболочку "CDATA" тегов. [[*pagetitle:cdata]].
userinfo Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя ( modUser ). [[+modx.user.id:userinfo=`username`]].
isloggedin Возвращает true, если пользователь авторизирован в этом контексте. [[+modx.user.id:isloggedin]].
isnotloggedin Возвращает true, если пользователь не авторизирован в этом контексте. [[+modx.user.id:isnotloggedin]].
toPlaceholder Помещает результат вывода тега в плейсхолдер, причем там где был помещен - ничего не выводится, а телепортируется в указанный плейсхолдер. До этого модификатора можно использовать любые другие модификаторы. [[+number:toPlaceholder=`итого`]], помещает содержимое в плейсхолдер . Можно усложнять запись добавляя в левую часть выражения любые другие модификаторы: [[+number:is=`10`:then=`ровно 10`:else=`точно не 10!`:toPlaceholder=`итого`]], если = 10, тогда выводим в плейсхолдер : "ровно 10", если же нет "точно не 10!".
cssToHead Прописывает файл CSS в <link> элемент перед закрывающим тегом </head>, где значение тега модификатора вписывается в аттрибут "href". Используется modX.regClientCSS. [[+cssTV:cssToHead]] перед закрывающим тегом </head>, регистрирует CSS, например: <link rel="stylesheet" href="значение +cssTv" type="text/css" />
htmlToHead Вписывает значение тега перед закрывающим тегом </head>. Используется modX.regClientStartupHTMLBlock. [[+htmlTV:htmlToHead ]] перед закрывающим тегом </head>, регистрирует значение тега в HTML код.
htmlToBottom Вписывает значение тега перед закрывающим тегом </body>. Используется modX.regClientHTMLBlock. [[+htmlTV:htmlToBottom]] перед закрывающим тегом </body>, регистрирует значение тега в HTML код.
jsToHead Прописывает файл JS в <link> элемент перед закрывающим тегом </head>. Используется modX.regClientStartupScript. [[+jsTV:jsToHead]] перед закрывающим тегом </head>, регистрирует JS, например: <script type="text/javascript" src="значение +jsTv"></script>
jsToBottom Прописывает файл JS в <link> элемент перед закрывающим тегом </body>. Используется modX.regClientScript. [[+jsTV:jsToBottom]] перед закрывающим тегом </body>, регистрирует JS, например: <script type="text/javascript" src="значение +jsTv"></script>
urldecode Аналогично функции php urldecode. [[+stringi:urldecode]].

 

Создаем свой модификатор

Модификаторы создаются, в точности как сниппеты. То есть по сути любой сниппет можно использовать в качестве модификатора, другой вопрос, вернет ли он нам то что нужно? Например: [[*id:мой модификатор=`тест`]]

Параметр Значение Пример чо выйдет
input Значение тега В переменной $input выйдет значение тега [[*id]]
options Значение модификатора (после знака =) $options = "тест";
token Тип тега $token = "*"; (символ, определяющий, что данный элемент - поле ресурса)
name Наименование тега $name = "[[*id]]";
tag Вернет запись тега полностью $tag ="[[*id:мой модификатор=`тест`]]"

К примеру, создадим тестовый сниппет "мой модификатор", и почекаем что вылезает:

Создадим самостоятельно тестовый снипет модификатор MODx

<?php
$test = $input .'<hr />';
$test .= $options.'<hr />';
$test .= $token.'<hr />';
$test .= $name.'<hr />';
$modx->log(1,'$tag: '. $tag); # это будет выводится в журнал ошибок
# напрямую в шаблон выводить не советую иначе подвиснет сайт
return $test;

Цепочки модификаторов (множественный фильтр)

Хорошим примером построения цепочки будет отформатировать строку даты в другой формат, например, так:

[[+mydate:strtotime:date=`%Y-%m-%d`]]

Модификатор 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`]] 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]] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [[*createdby]] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.

Обратите внимание, что ID пользователя и его логин уже доступны по умолчанию в MODX, так что вам не нужно использовать модификатор UserInfo:

[[!+modx.user.id]] - Выведет ID пользователя [[!+modx.user.username]] - Выведет логин пользователя

Особое внимание обращаем на восклицательный знак [[!+modx.user.id]]. Он позволяет НЕ кэшировать содержимое вывода. Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.

Почему нужно не кешировать? Представим это так: на сайте 5 пользователей. Первый пользователь зашел на страницу с вызовом:

Добро пожаловать, [[!+modx.user.id:userinfo=`username`]]!

По задумке на этой странице, выводится приветственное сообщение пользователю. Так вот, если результат будет кешироваться, то при первом входе на эту страницу - сохранится имя пользователя который только что зашел - и всем остальным будет показываться не их имя, а имя того пользователя который вошел на эту страницу первым. Чтобы этого избежать - просто не кэшируем этот тэг, с помощью восклицательного знака перед вызовом !+modx...

Также фильтры можно использовать несколькими способами (что уменьшает время их выполнения):

// Используем модификатор: [[+title:lcase]] [[+something:notempty=`Hello[[+name]]`]] // Используем сниппет: [[lcase? &subject=`title`]] [[notempty? &subject=`something` &then=`Hello[[+name]]`]] // Используем общий сниппет фильтра: [[Filter? &subject=`title` &operator=`lcase`]] [[Filter? &subject=`something` &operator=`notempty` &meter=`Hello [[+name]]`]]

P.s.: Не забываем включить кэширование тегов, где нужно! Чтобы это сделать - нужно ИЗБАВЛЯТЬСЯ от восклицательных знаков ( ! ). Результаты большинства сниппетов вплоне себе могут работать из кэша.

Спасибо источникам информации: http://modx.ws и https://gaserge.ru