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

05.05.2018 07:15 2410

Фильтры ввода-вывода

Фильтры в Revolution позволяют манипулировать тем, как будут обрабатываться те или иные теги. Они позволяют вам изменять значения прямо внутри ваших шаблонов.

Фильтры ввода

В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODX.

Фильтры вывода

В MODX Revolution Фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро. Синтаксис модификаторов:

Фильтры могут применяться последовательно. Для этого напишите их подряд (слева направо):

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

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

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

Условные модификаторы вывода

Модификатор Описание Пример использования
if, input
or Объединение нескольких модификаторов связью ИЛИ [ [+numbooks:is=`5`:or:is=`6`:then=`Здесь 5 или 6 книг`:else=`Не уверен, сколько книг`] ]
and Объединение нескольких модификаторов связью И
isequalto, isequal, equalto, equals, is, eq Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет - «else» [ [+numbooks:isequalto=`5`:then=`Здесь 5 книг`:else=`Не уверен, сколько книг`] ]
notequalto, notequals, isnt, isnot, neq, ne Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет - «else» [ [+numbooks:notequalto=`5`:then=`Не уверен, сколько книг`:else=`Здесь 5 книг`] ]
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte То же, только условие «Больше или равно» [ [+numbooks:gte=`5`:then=`Здесь 5 книг или больше`:else=`Здесь меньше пяти книг`] ]
isgreaterthan, greaterthan, isgt, gt То же, только условие «Строго больше» [ [+numbooks:gt=`5`:then=`Здесь больше пяти книг`:else=`Здесь 5 книг или меньше`] ]
equaltoorlessthan, lessthanorequalto, el, le, islte, lte То же, только условие «Меньше или равно» [ [+numbooks:lte=`5`:then=`Здесь 5 книг или меньше`:else=`Здесь больше пяти книг`] ]
islowerthan, islessthan, lowerthan, lessthan, islt, lt То же, только условие «Строго меньше» [ [+numbooks:lte=`5`:then=`Здесь меньше пяти книг`:else=`Здесь 5 книг или больше`] ]
hide Скрывает элемент, если условие выполняется [ [+numbooks:lt=`1`:hide] ]
show Отображает элемент, если условие выполняется [ [+numbooks:gt=`0`:show] ]
then Используется для составления условий [ [+numbooks:gt=`0`:then=`Книги в наличии!`] ]
else Используется для составления условий (совместно с «then») [ [+numbooks:gt=`0`:then=`Книги в наличии!`:else=`Простите, но все продано.`] ]
select
memberof, ismember, mo Проверяет, является ли пользователь членом указанной группы пользователей [ [+modx.user.id:memberof=`Administrator`] ]

Модификаторы для работы со строками

Модификатор Описание Пример использования
cat Добавляет значение после тега [ [+numbooks:cat=` книг`] ]
lcase, lowercase, strtolower Переводит все буквы в нижний регистр [ [+title:lcase] ]
ucase, uppercase, strtoupper Переводит все буквы в верхний регистр [ [+headline:ucase] ]
ucwords Делает первую букву в словах заглавной [ [+title:ucwords] ]
ucfirst Делает первую букву в строке заглавной [ [+name:ucfirst] ]
htmlent, htmlentities Преобразует все символы в HTML-сущности [ [+email:htmlent] ]
esc,escape Безопасно экранирует символы, используя регулярные выражения и str_replace. Также экранирует символы [, ] и ` [ [+email:escape] ]
strip Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом [ [+textdocument:strip] ]
stripString Вырезает из строки указанную подстроку [ [+name:stripString=`Mr.`] ]
replace Производит замену подстрок [ [+pagetitle:replace=`Mr.==Mrs.`] ]
striptags, stripTags,notags,strip_tags Вырезает все теги (можно указать разрешенные теги).
Не используйте для обеспечения безопасности.
[ [+code:strip_tags=`<p>`] ]
len,length, strlen Выводит длину строки [ [+longstring:strlen] ]
reverse, strrev Переворачивает строку символ за символом [ [+mirrortext:reverse] ]
wordwrap Вставляет перенос строки после каждого n-ого символа (слова не разбиваются) [ [+bodytext:wordwrap=`80`] ]
wordwrapcut Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова [ [+bodytext:wordwrapcut=`80`] ]
limit Выводит определенное количество символов с начала строки (значение по умолчанию - 100) [ [+description:limit=`50`] ]
ellipsis Добавляет многоточие и обрезает строку, если она длиннее, чем определенное количество символов (значение по умолчанию - 100) [ [+description:ellipsis=`50`] ]
tag Экранирование. Отображает элемент так как он есть, без :tag. Для использования в документации [ [+showThis:tag] ]
math Возвращает результат продвинутых вычислений (нагружает на процессор. Не рекомендуется)
add,increment,incr Прибавляет указанное число (значение по умолчанию +1) [ [+downloads:incr] ]
[ [+blackjack:add=`21`] ]
subtract,decrement,decr Вычитает указанное число (значение по умолчанию -1) [ [+countdown:decr] ]
[ [+moneys:subtract=`100`] ]
multiply,mpy Умножает на указанное число (значение по умолчанию *2) [ [+trifecta:mpy=`3`] ]
divide,div Делит на указанное число (значение по умолчанию /2) [ [+rating:div=`4`] ]
modulus,mod Возвращает модуль числа
(по-умолчанию: %2, возвращает 0 или 1) )
[ [+number:mod] ]
ifempty,default,empty, isempty Возращает значение модификатора, если значение тега пусто [ [+name:default=`anonymous`] ]
notempty, !empty, ifnotempty, isnotempty Возращает значение модификатора, если значение тега НЕпусто [ [+name:notempty=`Hello [ [+name] ]!`] ]
nl2br Заменяет символы новой строки (\n) на HTML-тег <br /> [ [+textfile:nl2br] ]
date Переводит таймстамп в текст, в соответствии с указанным форматом (Формат даты) [ [+birthyear:date=`%Y`] ]
strtotime Переводит дату в виде текста в UNIX таймстамп [ [+thetime:strtotime] ]
fuzzydate Возвращает дату в формате "вчера, сегодня...". Принимает значение даты. [ [+createdon:fuzzydate] ]
ago Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. [ [+createdon:ago] ]
md5 Создает MD5-хеш значения [ [+password:md5] ]
cdata Оборачивает вывод тегами CDATA [ [+content:cdata] ]
userinfo Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя [ [+modx.user.id:userinfo=`username`] ]
isloggedin Возвращает true, если пользователь аутентифицирован в текущем контексте [ [+modx.user.id:isloggedin] ]
isnotloggedin Возвращает true, если пользователь НЕаутентифицирован в текущем контексте [ [+modx.user.id:isnotloggedin] ]
urlencode Конвертирует значение в URL [ [+mystring:urlencode] ]
urldecode Конвертирует значение из URL [ [+myparam:urldecode] ]

Кеширование

В общем случае, содержимое плейсхолдера, которое изменяется динамически, не должно кешироваться. Например:

Результат работы примера может быть пустым, а может и нет. Как мы можем кешировать это? Пример, приведенный выше, отражает природу модификатора вывода.
Возможно применение модификаторов вывода в кешируемом плейсхолдере - но только если Сниппет может быть кеширован. Иначе, мы совершаем алогичное действие - пытаемся кешировать то, что не является статическим содержимым.
Получаем правило: нельзя устанавливать кеширование плейсхолдера в некешируемом сниппете, если результат работы сниппета может изменяться.

Использование модификаторов вывода совместно с параметрами

Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:

Создание пользовательского модификатора

Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет makeExciting, добавляющий к выводу определенное количество восклицательных знаков:

Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:

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

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

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

Модификатор UserInfo

Прямой доступ к данным из таблицы modx_user_attributes в базе данных, с помощью модификаторов вывода вместо сниппетов, может быть достигнуто просто за счет использования модификатора UserInfo. Выберите нужный столбец из таблицы и укажите его в качестве свойства модификатора, например, так:

[ [ ! + modx . user . id] ] возвращает ID вошедшего в систему пользователя. Вы, конечно, можете заменить, его на [ [*createdby] ] или другое поле ресурса или любой плейсхолдер, который возвращает числовое представление ID пользователя.

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

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

Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.

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

Открыть еще

Фильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков, сниппетах.

Фильтры ввода

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

Фильтры вывода

В MODX Revolution фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро.
Синтаксис модификаторов:

[[element:modifier=`value`]]

Фильтры могут применяться последовательно (пишутся слева направо):

[[element:modifier=`value`:anothermodifier=`value2`:andanothermodifier:yetanother=`value3`]]

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

[[Snippet:modifier=`value`? &SnippetParam=`something`]]

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

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

Модификатор Описание Пример использования
if, input
or Объединение нескольких модификаторов связью ИЛИ [[+numProducts:is=`10`:or:is=`11`:then=`Здесь 10 или 11 товаров`:else=`Не уверен, сколько товаров`]]
and Объединение нескольких модификаторов связью И
isequalto, isequal, equalto, equals, is, eq Сравнивает передаваемое значение с установленным. Если значения совпадают, выводится значение «then», если нет — «else» [[+numProducts:isequalto=`10`:then=`Здесь 10 товаров`:else=`Не уверен, сколько товаров`]]
notequalto, notequals, isnt, isnot, neq, ne Сравнивает передаваемое значение с установленным. Если значения НЕ совпадают, выводится значение «then», если нет — «else» [[+numProducts:notequalto=`10`:then=`Не уверен, сколько товаров`:else=`Здесь 10 товаров`]]
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte То же, только условие «Больше или равно» [[+numProducts:gte=`10`:then=`Здесь 10 товаров или больше`:else=`Здесь меньше 10 товаров`]]
isgreaterthan, greaterthan, isgt, gt То же, только условие «Строго больше» [[+numProducts:gt=`10`:then=`Здесь больше 10 товаров`:else=`Здесь 10 товаров или меньше`]]
equaltoorlessthan, lessthanorequalto, el, le, islte, lte То же, только условие «Меньше или равно» [[+numProducts:lte=`10`:then=`Здесь 10 товаров или меньше`:else=`Здесь больше 10 товаров`]]
islowerthan, islessthan, lowerthan, lessthan, islt, lt То же, только условие «Строго меньше» [[+numProducts:lte=`10`:then=`Здесь меньше 10 товаров`:else=`Здесь 10 товаров или больше`]]
hide Скрывает элемент, если условие выполняется [[+numProducts:lt=`1`:hide]]
show Отображает элемент, если условие выполняется [[+numProducts:gt=`0`:show]]
then Используется для составления условий [[+numProducts:gt=`0`:then=`Товары в наличии!`]]
else Используется для составления условий (совместно с «then») [[+numProducts:gt=`0`:then=`Товары в наличии!`:else=`Простите, но все продано.`]]
select
memberof, ismember, mo Проверяет, является ли пользователь членом указанной группы пользователей [[+modx.user.id:memberof=`Administrator`]]

Модификаторы для работы со строками

Модификатор Описание Пример использования
cat Добавляет значение после тега [[+numProducts:cat=` товаров`]]
lcase, lowercase, strtolower Переводит все буквы в нижний регистр [[+title:lcase]]
ucase, uppercase, strtoupper Переводит все буквы в верхний регистр [[+longtitle:ucase]]
ucwords Делает первую букву в словах заглавной [[+title:ucwords]]
ucfirst Делает первую букву в строке заглавной [[+name:ucfirst]]
htmlent, htmlentities Преобразует все символы в HTML-сущности [[+email:htmlent]]
esc,escape Безопасно экранирует символы, используя регулярные выражения и str_replace. Также экранирует символы [, ] и ` [[+email:escape]]
strip Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом [[+textdocument:strip]]
stripString Вырезает из строки указанную подстроку [[+name:stripString=`Mr.`]]
replace Производит замену подстрок [[+pagetitle:replace=`Mr.==Mrs.`]]
striptags, stripTags,notags,strip_tags Вырезает все теги (можно указать разрешенные теги). [[+code:strip_tags=`<p>`]]
len,length, strlen Выводит длину строки [[+longstring:strlen]]
reverse, strrev Переворачивает строку символ за символом [[+mirrortext:reverse]]
wordwrap Вставляет перенос строки после каждого n-ого символа (слова не разбиваются) [[+bodytext:wordwrap=`80`]]
wordwrapcut Вставляет перенос строки после каждого n-ого символа, даже если этот символ будет внутри слова [[+bodytext:wordwrapcut=`80`]]
limit Выводит определенное количество символов с начала строки (значение по умолчанию — 100) [[+description:limit=`50`]]
ellipsis Добавляет многоточие и обрезает строку, если она длиннее, чем определенное количество символов (значение по умолчанию — 100) [[+description:ellipsis=`50`]]
tag Экранирование. Отображает элемент так как он есть, без:tag. Для использования в документации [[+showThis:tag]]
math Возвращает результат продвинутых вычислений (нагружает на процессор. Не рекомендуется)
add,increment,incr Прибавляет указанное число (значение по умолчанию +1) [[+downloads:incr]]
[[+blackjack:add=`21`]]
subtract,decrement,decr Вычитает указанное число (значение по умолчанию -1) [[+countdown:decr]]
[[+moneys:subtract=`100`]]
multiply,mpy Умножает на указанное число (значение по умолчанию *2) [[+trifecta:mpy=`3`]]
divide,div Делит на указанное число (значение по умолчанию /2) [[+rating:div=`4`]]
modulus,mod Возвращает модуль числа
(по-умолчанию: %2, возвращает 0 или 1))
[[+number:mod]]
ifempty,default,empty, isempty Возвращает значение модификатора, если значение тега пусто [[+name:default=`anonymous`]]
notempty, !empty, ifnotempty, isnotempty Возвращает значение модификатора, если значение тега НЕ пусто [[+name:notempty=`Привет, [[+name]]!`]]
nl2br Заменяет символы новой строки (\n) на HTML-тег <br /> [[+textfile:nl2br]]
date Переводит таймстамп в текст, в соответствии с указанным форматом (Формат даты) [[+birthyear:date=`%Y`]]
strtotime Переводит дату в виде текста в UNIX таймстамп [[+thetime:strtotime]]
fuzzydate Возвращает дату в формате «вчера, сегодня, …». Принимает значение даты. [[+createdon:fuzzydate]]
ago Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. [[+createdon:ago]]
md5 Создает MD5-хеш значения [[+password:md5]]
cdata Оборачивает вывод тегами CDATA [[+content:cdata]]
userinfo Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя [[+modx.user.id:userinfo=`username`]]
isloggedin Возвращает true, если пользователь аутентифицирован в текущем контексте [[+modx.user.id:isloggedin]]
isnotloggedin Возвращает true, если пользователь НЕаутентифицирован в текущем контексте [[+modx.user.id:isnotloggedin]]
urlencode Конвертирует значение в URL [[+mystring:urlencode]]
urldecode Конвертирует значение из URL [[+myparam:urldecode]]

Кеширование

В общем случае, содержимое плейсхолдера, которое изменяется динамически, не должно кешироваться.
Например:

[[+placeholder:default=`К сожалению, ничего не найдено`]]

Результат работы примера может быть пустым, а может и нет. Как мы можем кешировать это? Пример, приведенный выше, отражает природу модификатора вывода.
Возможно применение модификаторов вывода в кешируемом плейсхолдере — но только если Сниппет может быть кеширован. Иначе, мы совершаем алогичное действие — пытаемся кешировать то, что не является статическим содержимым.
Получаем правило: нельзя устанавливать кеширование плейсхолдера в некешируемом сниппете, если результат работы сниппета может изменяться.

Использование модификаторов вывода совместно с параметрами

Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:

[[!pdoResources:default=`К сожалению, ничего не найдено`?
&parents=`5`
&depth=`5`
&tpl=`news_tpl`
&includeTVs=`image`
]]

Создание пользовательского модификатора

Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет makeExciting, добавляющий к выводу определенное количество восклицательных знаков:

[[*pagetitle:makeExciting=`4`]]

Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:

Параметр Значение Значение в примере
input Значение элемента В переменной $input будет значение заголовка страницы ([[*pagetitle]])
options Значение модификатора (после знака =) $options = 4;
token Тип элемента $token = «*«; (символ, определяющий, что данный элемент — поле ресурса
name Имя элемента $name = «pagetitle»;
tag Весь тег полностью $tag = «[[*pagetitle:makeExciting=`4`]]«;

Модификатор 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`]]
Почтовый индекс [[+modx.user.id:userinfo=`zip`]]
Фото [[+modx.user.id:userinfo=`photo`]]
Комментарий [[+modx.user.id:userinfo=`comment`]]
Пароль [[+modx.user.id:userinfo=`password`]]
Кеш пароля [[+modx.user.id:userinfo=`cachepwd`]]
Последняя авторизация [[+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]]
Дата текущей авторизации [[+modx.user.id:userinfo=`thislogin`: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]] — Выведет логин пользователя

Лучше всего эти плейсхолдеры вызывать некешируемыми, чтобы избежать неожиданных результатов.

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

// Используем модификатор:
[[+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]]`]]

Материал взят отсюда — Фильтры ввода-вывода


Zimbra Cent OS

26.05.2017 07:15 4223

CentOS установка Ajenti

26.08.2016 00:00 2951

VPN Softether

26.05.2017 07:15 2268

Nginx

26.02.2017 00:00 1475

Регистрация Private Shell

12.01.2015 08:00 1197

SYSPREP

12.10.2014 15:58 1141

Автовход в виндовс

12.10.2014 15:58 1072

Перенос prestashop 1.6

03.04.2015 00:00 2155

RDP Windows Server 2012 R2

09.06.2017 00:00 2355

modx revo ошибки

09.12.2014 15:00 2167

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

05.05.2018 07:15 2410

Прошивка роутеров

12.10.2014 15:58 1426

Забыли пароль WIFI

02.09.2015 15:54 2433

Поднять Cisco srw224g4

01.11.2016 09:23 2538