Фильтры phx
модификаторы в modx revo
Что такое фильтры phx?
Фильтры phx, позволяют манипулировать значением тега, прямо внутри шаблона. Оригинальная документация.
Ну зачем они нужны?
грязное танго с 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 или как там его?
[[*slider:!empty=`[[$slider]]`]]
Нагрузка
Одно НО, нужно тщательно следить за обработкой модификаторов. Выше приведенную запись при выводе на сайт, modx считывает слева направо и выполняет все вложенные условия, не зависимо от того, верное условие или нет; будет ли выводиться на экран текущей страницы содержимое [[$slider]] — в любом случае содержимое этого чанка обработается, и даже гугл не поймет как. Поэтому, поменяем запись так:
[[$sli[[*id:is=`1`:then=`der`]]]]
В этом случае, содержимое чанка $slider, будет обработано только когда выполняется условие *id:is=`1`. Т.к. выполняется [[*id:is=`1`:then=`der`]] и если id текущей страницы равно 1, последнее что обрабатывается - [[$slider]], если id не равно 1, тогда - [[$sli]]. А если чанка $sli - нет в элементах, то и нагрузки не будет.
[[$слай[[*id:is=`1`:then=`дер`]]]] [[$[[*id:is=`1`:then=`слайдер`]]]] #идеален
Подробнее о том, как правильно установить верстку на modx revo в этой статье. Азы, рекомендую ознакомиться.
Какую запись использовать?
..за-пись, пись, псиу...
...протосы рядом...
Вариантов масса, здесь пример обработки условно-нафантазированнного слайдера. Просто комбинируй разные модификаторы под логику своей программы, и главное помни, юный падаван, их суть только в том чтобы сделать разработку проще, а не усложнять без того сложные сложности. Как правило, самый эффективный способ - самый простой, чем проще и понятней конструкция - тем легче с ней будет работать в дальнейшем. А что зерги ожидают от phx?
[[$sli[[*id:is=`1`:then=`der`]]?-вывод слайдера]] [[$[[*id:is=`1`:then=`слайдер`]]?- вывод слайдера #идеален]]
Эта запись лучше, если в чанке $слайдер - идет дополнительная обработка сниппетом, например обрезается изображение, или генерируется какой-то контент.
Если содержимое $slider - например обычный html-код, без использования сниппетов, то вполне подойдет:
[[*id:is=`1`:then=`[[$slider]]`]] [[*id:is=`1`:then=`[[$слайдер]]`?- слайдер все еще тут]]
В следующих таблицах перечислены некоторые модификаторы, которые могут быть использованы для любого тега MODx Revolution.
Модификаторы условия
Модификатор | Описание | Пример |
---|---|---|
if,input | if - задает дополнительное условие input - добавляет в тег обратываемые данные |
Или |
or,and | or - условие "ИЛИ" and - условие "И" |
|
isequalto, isequal, equalto, equals, is, eq | Если тег равен модификатору, используется с "then" и "else." | |
notequalto, notequals, isnt, isnot, neq, ne | Если тег не равен модификатору, используется с "then" и "else". | |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | Если тег больше или равен модификатору, используется с "then" и "else". | |
isgreaterthan, greaterthan, isgt, gt | Если тег больше модификатора, используется с "then" и "else". | |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | Если тег меньше или равен модификатору, используется с "then" и "else". | |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | Если тег меньше модификатора, используется с "then" и "else". | |
contains | Если тег содержит модификатор, используется с "then" и "else". | |
containsnot | Если тег не содержит модификатор, используется с "then" и "else". | |
hide | Если предыдущий модификатор возвращает положительное значение ("then"), то не выводим обработанный тег. | |
show | Если предыдущий модификатор возвращает положительное значение ("then"), то выводим обработанный тег. | |
then | Условие, если тег соответствует модификатору, выводим сообщение, иначе ничего не выводим | |
else | Условие, если тег не соответствует модификатору, выводим сообщение. Используется только в связке с "then" | |
select | Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать "else", например если значение [[+controls]] - не подходит под шаблон select | |
in, IN, inarray, inArray | Работает аналогично php in_array, если тег совпадет с одним из элементов модификатора (разделяются они запятыми), то выводим then, если не совпало else | |
memberof, ismember, mo | Чекает состоит ли юзер, в конкретной группе пользователей. |
Модификаторы строки
Модификатор | Описание | Пример |
---|---|---|
cat | Добавляет к тегу строку. | |
lcase, lowercase, strtolower | Переведет значение тега в нижний регистр, аналогично функции php strtolower. | |
ucase, uppercase, strtoupper | Переведет текст в верхний регистр, аналогично функции php strtoupper. | |
ucwords | Переведет каждую первую букву, каждого слова в верхний регистр, аналогично функции php ucwords. | |
ucfirst | Переведет только первую букву строки в верхний регистр, аналогично функции php ucfirst. | |
htmlent, htmlentities | Преобразует все символы в соответствющие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции php htmlentities. Использует текущие настройки системы "modx_charset" с флагом "ENT_QUOTES". | |
esc,escape | Экранирует разные "плохие символы", так же экранирует [, ] и `. | |
strip | Заменяет все переносы строк, табуляции и множественные пробелы с на один пробел. | |
stripString | Вырезает из строки заданную строку. | |
replace | Обычная замена. | |
striptags, stripTags,notags,strip_tags | Вырезает все теги, кроме разрешенных, аналогично функции php strip_tags | `]] |
len,length, strlen | Возвращает длину строки, аналогично функции php strlen | |
reverse, strrev | Переворачивает строку, аналогично функции php strrev | |
wordwrap | Устанавливает переносы в зависимости от кол-ва символов слова, аналогично функции php wordwrap | |
limit | Устанавливает лимит на длинну строки и обрезает ее. | |
ellipsis | Устанавливает лимит на длинну строки и обрезает ее, добавляя три точки в конце | |
tag | Вернет, запись тега. | |
add, increment, incr | Вернет, значение + модификатор ( по умолчанию +1 ). | |
subtract, decrement, decr | Вернет, значение - модификатор ( по умолчанию -1 ). | |
multiply, mpy | Вернет, значение * модификатор ( по умолчанию *2 ). | |
divide, div | Вернет, значение / модификатор ( по умолчанию /2 ). | |
modulus, mod | Вернет, целочисленный остаток от деления значения на модификатор ( по умолчанию % 2. Вернет 1 или 0. ) | |
ifempty, default, empty, isempty | Вернет, указанный модификатор, если значение пусто. | |
notempty, !empty, ifnotempty, isnotempty | Вернет, указанный модификатор, если значение не пусто. | |
nl2br | Вернет строку с "<br />" или "<br>" вставленные перед всеми (\r\n, \n\r, \n и \r)..., аналогично функции php nl2br | |
date | Аналогично функции PHP strftime. Значение - отформатировано. См. форматы дат. | |
strtotime | Аналогично функции PHP strtotime. Вернет дату. См. форматы дат. | |
fuzzydate | Вернет дату. Типа вчера, сегодня.... | |
ago | Вернет дату в прошедших секундах, минутах, неделях или месяцах. | |
md5 | Аналогично функции php md5. | |
cdata | Вставляет строку в оболочку "CDATA" тегов. | |
userinfo | Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя ( modUser ). | |
isloggedin | Возвращает true, если пользователь авторизирован в этом контексте. | |
isnotloggedin | Возвращает true, если пользователь не авторизирован в этом контексте. | |
toPlaceholder | Помещает результат вывода тега в плейсхолдер, причем там где был помещен - ничего не выводится, а телепортируется в указанный плейсхолдер. До этого модификатора можно использовать любые другие модификаторы. | |
cssToHead | Прописывает файл CSS в <link> элемент перед закрывающим тегом </head>, где значение тега модификатора вписывается в аттрибут "href". Используется modX.regClientCSS. | |
htmlToHead | Вписывает значение тега перед закрывающим тегом </head>. Используется modX.regClientStartupHTMLBlock. | |
htmlToBottom | Вписывает значение тега перед закрывающим тегом </body>. Используется modX.regClientHTMLBlock. | |
jsToHead | Прописывает файл JS в <link> элемент перед закрывающим тегом </head>. Используется modX.regClientStartupScript. | |
jsToBottom | Прописывает файл JS в <link> элемент перед закрывающим тегом </body>. Используется modX.regClientScript. | |
urlencode | Аналогично функции php urlencode. | |
urldecode | Аналогично функции php urldecode. | |
filterPathSegment | Аналогично механизму транслитезации заголовка (pagetitle) в урл (alias), конвертирует строку в формат ЧПУ. | |
tvLabel | Возвращает подпись к полю из возможных значений TV. | Например есть TV настроенное селектом с параметрами ввода: Черный==0||Белый==1||Красный==3. Если значение myTv = 3, модификатор вернет слово Красный |
Создаем свой модификатор
Модификаторы создаются, в точности как сниппеты. Тоесть по сути любой сниппет можно использовать в качестве модификатора, другой вопрос, вернет ли он то что нужно?)) например:
Параметр | Значение | Пример чо выйдет |
---|---|---|
input | Значение тега | выйдет значение тега |
options | Значение модификатора | "тест" |
token | Тип тега | * |
name | Наименование тега | id |
tag | Вернет запись тега | [[*id:мой модификатор=`тест`]] |
К примеру, создадим тестовый сниппет "мой модификатор", и почекаем что вылезает:
<?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`]]
Прямой доступ к таблице "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...
P.s.: Не забываем отключать кэширование тегов, повсеместно! Чтобы это сделать - нужно ОСВОБОЖДАТЬСЯ от восклицательных знаков ( ! ). Результаты большинства сниппетов вплоне себе могут отрабатывать из кэша.
Альтернатива — Fenom
более привычный шаблонизатр
Для истинных ценителей шаблонизаторов с элементами php кода, в modx revo с помощью набора пакета PdoTools, интегрируется шаблонизатор Fenom. Содержимое документации.