MODX. MODX фильтры (PhX), модификаторы
Отредактировано: 16 Марта 2023
MODX (Phx) фильтры, что это, с чем, и как использовать?
Phx (Placeholders Xtended) фильтры, или как их еще называют «модификаторы», позволяют выводить на страницах MODX информацию, с применением тех или иных условий. По сути, они являются упрощенной заменой php, которую можно применять в чанках. Можно использовать фильтры предусмотренные системой, или создавать свои, любой фильтр можно применять к любому тегу MODX.
Недостатки phx фильтров
У этого метода есть значительный недостаток — повышенная в сравнении с php и xpdo нагрузка на сервер, связанная с особенностью кеширования информации системой MODX. Не стоит увлекаться применением phx.
Часто встречаемые конструкции
[[*id:is=`1`:then=`[[$slider]]`]]
Если id страницы не 1 и страница — каталог, то...
[[*id:ne=`1`:and:if=`[[*isfolder]]`:is=`1`:then=``]]
Упрощение слишком длинных конструкций:
<!-- плохо -->
[[*field:is=`0`:then=`[[!SomeScript]]`:else=`[[$SomeChunk]]`]]
<!-- хорошо -->
[[[[*field:is=`0`:then=`!SomeScript`:else=`$SomeChunk`]]]]
Иногда конструкции могут не работать, ломая сайт. В этом случае попробуйте проверить, нет ли конфликта между кавычками. К примеру:
// Не будет работать из-за пересечения кавычек у модификатора ellipsis
[[*description:!empty=`[[*description]]`:default=`[[*content:ellipsis=`300`]]`]]
// Будет работать, т.к. лишние кавычки убраны
[[*description:!empty=`[[*description]]`:default=`[[*content:ellipsis=300]]`]]
Предустановленные фильтры MODX (PhX)
условия
Модификатор | Описание |
---|---|
input |
Добавляет в тег обрабатываемые данные [[+phx:input=`/assets/upload/img.jpg`]] — добавляем в тег phx входное значение, следующим модификатором, например, можно обработать изображение. |
if |
Задает дополнительное условие [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`yes`:else=`no`]] — если id-ресурса равно 1 и не равно 2, выводим «yes», или же «no» |
or |
Условие «ИЛИ» [[*id:is=`1`:or:if=`[[*id]]`:is=`2`:then=`yes`:else=`no`]] — если id-ресурса = 1 или = 2, выводим «yes», или же «no» |
and |
Условие «И» [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`yes`:else=`no`]] — если id-ресурса равно 1 и не равно 2, выводим «yes», или же «no» |
is, isequalto, isequal, equalto, equals, eq |
Если тег равен модификатору, используется с «then» и «else» [[*id:is=`1`:then=`yes`:else=`no`]] — если id-ресурса равно 1, выводим «yes», или же «no» |
notequalto, notequals, isnt, isnot, neq, ne |
Если тег не равен модификатору, используется с «then» и «else» [[*id:ne=`1`:then=`yes`:else=`no`]] — если id-ресурса не равно 1, выводим «yes», или же «no» |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte |
Если тег больше или равен модификатору, используется с «then» и «else» [[*id:ge=`1`:then=`yes`:else=`no`]] — если id-ресурса больше или равен 1, выводим «yes», или же «no» |
isgreaterthan, greaterthan, isgt, gt |
Если тег больше модификатора, используется с «then» и «else» [[*id:gt=`1`:then=`yes`:else=`no`]] — если id-ресурса больше 1, выводим «yes», или же «no» |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte |
Если тег меньше или равен модификатору, используется с «then» и «else» [[*id:el=`10`:then=`yes`:else=`no`]] — если id-ресурса меньше или равно 10, выводим «yes», или же «no» |
islowerthan, islessthan, lowerthan, lessthan, islt, lt |
Если тег меньше модификатора, используется с «then» и «else» [[*id:lt=`10`:then=`yes`:else=`no`]] — если id-ресурса меньше 10, выводим «yes», или же «no» |
hide |
Если предыдущий модификатор возвращает положительное значение (true), то не выводится обработанный тег [[*id:is=`10`:hide]] — если id-ресурса = 10, ничего не выводим |
show |
Если предыдущий модификатор возвращает положительное значение (true), то выводим обработанный тег [[*id:is=`10`:show]] — если id-ресурса = 10, выводим. |
then |
Если тег соответствует модификатору, тогда выводим сообщение [[*id:is=`10`:then=`ID is 10`]] — если id-ресурса = 10, выводим «ID is 10». |
else |
Если тег соответствует модификатору, выводим сообщение, иначе выводим другое. Используется только в связке с «then» [[*id:is=`10`:then=`ID is 10`:else=`[[*id]]`]] — если id-ресурса = 10, выводим «ID is 10» иначе выводим id текущей страницы. |
contains |
Если тег содержит модификатор, используется с «then» и «else» [[+author:contains=`Сэ́мюэл Кле́менс`:then=`Марк Твен`]] — если в теге содержится фраза «Сэ́мюэл Кле́менс» выводим «Марк Твен». |
containsnot |
Если тег не содержит модификатор, используется с «then» и «else» [[+author:containsnot=`Сэ́мюэл Кле́менс`:then=`Кто-нибудь еще`]] — если в теге не содержится фраза «Сэ́мюэл Кле́менс» выводим «Кто-нибудь еще». |
select |
Установить свое значение, в зависимости от модификатора и вывода тега. Так же можно использовать «else», например если значение [[+controls]] — не подходит под шаблон select [[+controls:select=`0=ВЫКЛ&1=ВКЛ&2=ХЗ`:else=`Ошибка`]] — если тег [[+controls]] - выводит «0», значит выводим «ВЫКЛ», если тот же тег равен «1» выводим «ВКЛ», если «2» выводим «ХЗ», если тег не подходит нашей выборке, то выводим «Ошибка». |
in |
Работает аналогично php in_array, если тег совпадет с одним из элементов модификатора (разделяются запятыми), то выводим then, если не совпало — else [[*template:in=`3,4`:then=`[[$myChank]]`:else=`пробел`]] — если тег [[*template]] (текущий шаблон) — равен «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 |
Переведет только первую букву строки в верхний регистр, аналогично функции phpucfirst. [[*pagetitle:ucfirst]] |
htmlent, htmlentities |
Преобразует все символы в соответствующие HTML сущности (для тех символов, для которых HTML сущности существуют), аналогично функции phphtmlentities. Использует текущие настройки системы «modx_charset» с флагом «ENT_QUOTES». [[*pagetitle:htmlentities]] |
esc,escape |
Экранирует разные «плохие символы», так же экранирует [ ] и `. [[*content:esc]] |
strip |
Заменяет все переносы строк, табуляции и множественные пробелы на один пробел. [[*content:strip]] |
stripString |
Вырезает из строки заданную часть. [[*pagetitle:stripString=`modx`]] |
replace |
Обычная замена. [[*pagetitle:replace=`modx==конфетка`]] |
striptags, stripTags, notags, strip_tags |
Вырезает все теги, кроме разрешенных, аналогично функции php 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]] |
date |
Преобразует дату в указаный формат, аналогично функции PHP strftime. [[+birthyear:date=`%Y`]] |
strtotime |
Аналогично функции PHP strtotime. Вернет дату в unix. [[*createdon:strtotime]] , — вернет типа "1505900347" |
fuzzydate |
Вернет дату. Типа вчера, сегодня... [[*createdon:fuzzydate]] , — вернет типа "сен 20" |
ago |
Вернет дату в прошедших секундах, минутах, неделях или месяцах. [[*createdon:ago]] , — вернет типа "6 гг. назад" |
md5 |
Вернет строку с шифрованием. Алгоритм хеширования аналогично функции php md5. [[+password:md5]]. |
cdata |
Вставляет строку в оболочку «CDATA» тегов. Для преобразования в XML [[*pagetitle:cdata]]. |
userinfo |
Возвращает запрошенные модификаторов данные о пользователе. Значение должно быть id-пользователя ( modUser ). [[+modx.user.id:userinfo=`username`]]. |
isloggedin |
Возвращает true, если пользователь авторизирован в этом контексте. [[+modx.user.id:isloggedin]]. |
isnotloggedin |
Возвращает true, если пользователь НЕ авторизирован в этом контексте. [[+modx.user.id:isnotloggedin]]. |
urlencode |
Кодирование url, аналогично функции php urlencode. [[+stringi:urlencode]]. |
urldecode |
Декодирование url, аналогично функции php urldecode. [[+stringi:urldecode]]. |
toPlaceholder |
Помещает результат вывода тега в плейсхолдер, причем там где был помещен — ничего не выводится, а телепортируется в указанный плейсхолдер. До этого модификатора можно использовать любые другие модификаторы. [[+number:toPlaceholder=`итого`]] , помещает содержимое [[+number]] в плейсхолдер [[+итого]]. Можно усложнять запись добавляя в левую часть выражения любые другие модификаторы: [[+number:is=`10`:then=`ровно 10`:else=`точно не 10!`:toPlaceholder=`итого`]] , если [[+number]] = 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> |
Создание своего фильтра
Модификаторы по сути являются сниппетами и создаются соответственно также.
код сниппета с модификатором
<?php
return $input;
вызов модификатора
[[*content:имя_модификатора=`передаваемый текст`]]