MODX. MODX фильтры (PhX), модификаторы

MODX (Phx) фильтры, что это, с чем, и как использовать?

Phx (Placeholders Xtended) фильтры, или как их еще называют «модификаторы», позволяют выводить на страницах MODX информацию, с применением тех или иных условий. По сути, они являются упрощенной заменой php, которую можно применять в чанках. Можно использовать фильтры предусмотренные системой, или создавать свои, любой фильтр можно применять к любому тегу MODX.

PHP код модификаторов можно найти в файле: core/model/modx/filters/modoutputfilter.class.php

Недостатки 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.

Строки

Модификатор Описание
tvLabel

Выводит текстовое описание TV.

[[+myTV:tvLabel]], выведет текстовое описание TV у которого значения указаны в формате Текст1==text1.
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.

[[*content:strip_tags]]

Теги которые надо разрешить, перечисляются в списке после знака равенства.

[[*content:strip_tags=`<p>`]]

Одно время существовала проблема с безопасностью при использовании этого модификатора, но ее исправили.

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 гг., 7 мес. назад"
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:имя_модификатора=`передаваемый текст`]]