Фильтры ввода-вывода (модификаторы) в MODX Revo // Веб-студия Cat-Art
Навигация по статье:
О фильтрах ввода-вывода в MODX Revolution
Фильтры в Revolution позволяют обрабатывать и изменять значения тегов внутри ваших шаблонов, чанков, сниппетов.
Фильтры ввода
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри ядра MODX.
Фильтры вывода
В MODX Revolution фильтры вывода используются как один или нескольких модификаторов вывода, они схожи с PHx вызовами в MODx Evolution, но отличаются тем, что уже изначально встроены в ядро.
Синтаксис модификаторов:
[[+element:modifier=`value`]]
Фильтры могут применяться последовательно (пишутся слева направо):
[[+element:modifier=`value`:anothermodifier=`value2`:andanothermodifier:yetanother=`value3`]]
Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
[[snippet:modifier=`value`? &snippetParam=`something`]]
Модификаторы вывода
В таблице представлены некоторые модификаторы и примеры их использования. В примерах они применяются к плейсхолдерам, но вы должны помнить, что модификаторы могут применяться к любым тегам MODX Revolution.
Модификатор | Описание | Пример использования |
if, input | if — задает дополнительное условие, input — добавляет в тег обрабатываемые данные | [[+num:is=`10`:and:if=`[[+num]]`:ne=`15`:then=`Да, равно 10 и не 15`]] |
or, and | Объединение нескольких модификаторов связью ИЛИ, и связью И | [[+numProducts:is=`10`:or:is=`11`:then=`Здесь 10 или 11 товаров`:else=`Не уверен, сколько товаров`]] |
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=`Простите, но все продано.`]] |
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]] |
Использование модификаторов вывода совместно с параметрами
Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:
[[pdoResources:default=`К сожалению, ничего не найдено`? &parents=`5` &includeTVs=`image` &tpl=`news_tpl` ]]
Создание пользовательского модификатора
Любой сниппет может использоваться и как модификатор вывода. Для его использования просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет 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`]] |
[[!+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:
// Выведет ID пользователя
[[!+modx.user.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]]`
]]
Кэширование
В общем случае, содержимое плейсхолдера, которое изменяется динамически, не должно кэшироваться.
Например:
[[+placeholder:default=`К сожалению, ничего не найдено`]]
Результат работы примера может быть пустым, а может и нет. Как мы можем кэшировать это? Пример, приведенный выше, отражает природу модификатора вывода.
Возможно применение модификаторов вывода в кэшируемом плейсхолдере — но только если сниппет может быть кэширован. Иначе, мы совершаем нелогичное действие — пытаемся кэшировать то, что не является статическим содержимым.
Получаем правило: нельзя устанавливать кэширование плейсхолдера в некэшируемом сниппете, если результат работы сниппета может изменяться.
Материал взят отсюда — Фильтры ввода-вывода
На поддержку блога
Модификатор | Описание | Пример |
---|---|---|
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=`хуй`]] |
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`:tag]] |
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]][[*pagetitle:nl2br]] |
date | Аналогично функции PHP strftime. | [[+birthyear:date=`%Y`]] |
strtotime | Аналогично функции PHP strtotime. Вернет дату. | [[*createdon:strtotime]], — вернет типа «[[*createdon:strtotime]]» |
fuzzydate | Вернет дату. Типа вчера, сегодня…. | [[*createdon:fuzzydate]], — вернет типа «[[*createdon:fuzzydate]]» |
ago | Вернет дату в прошедших секундах, минутах, неделях или месяцах. | [[*createdon:ago]], — вернет типа «[[*createdon:ago]]» |
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]]. |
urlencode | Аналогично функции php urlencode. | [[+stringi:urlencode]]. |
urldecode | Аналогично функции php urldecode. | [[+stringi:urldecode]]. |
Фильтры ввода и вывода / Основы / Система / docs.modx.pro
Фильтры в Revolution позволяют манипулировать тем, как будут обрабатываться те или иные теги. Они позволяют вам изменять значения прямо внутри ваших шаблонов.
Фильтры ввода
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODX.
Фильтры вывода
В Revolution фильтры вывода ведут себя так же, как и PHx в Evolution, только фильтры теперь встроены прямо в движок MODX. Синтаксис выглядит так:
[[element:modifier=`value`]]
Фильтры могут применяться последовательно. Для этого напишите их подряд (слева направо):
[[element:modifier:anothermodifier=`value`:andanothermodifier:yetanother=`value2`]]
Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса):
[[mySnippet:modifier=`value`? &mySnippetParam=`something`]]
Модификаторы вывода
В таблице представлены некоторые модификаторы и примеры их использования. В примерах модификаторы применяются к плейсхолдерам, но вы должны помнить, что они могут применяться к любым тегам MODX. Убедитесь, что используемый тег выводит хоть что-то, что модификатор будет обрабатывать.
Условные модификаторы вывода
Модификатор | Описание | Пример использования |
---|---|---|
if, input | Передаёт произвольный текст на ввод, для следующего модификатора | [[*id:input=`[[+placeholder]]`:is=`1`:then=`Да`:else=`Нет`]] |
or | Объединение нескольких модификаторов связью ИЛИ | [[+numbooks:is=`5`:or:is=`6`:then=`Здесь 5 или 6 книг`:else=`Не уверен, сколько книг`]] |
and | Объединение нескольких модификаторов связью И | [[+numbooks:gt=`5`:and:lt=`10`:then=`Здесь от 5 до 10 книг`:else=`Книг или меньше 5, или больше 10`]] |
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=`Простите, но все продано.`]] |
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()`. Также экранирует теги MODX. | [[+email:escape]] |
strip | Заменяет все переносы, табуляции и любое количество пробелов только одним пробелом | [[+textdocument:strip]] |
stripString | Вырезает из строки указанную подстроку | [[+name:stripString=`Mr.`]] |
replace | Производит замену подстрок | [[+pagetitle:replace=`Mr.==Mrs.`]] |
striptags, stripTags,notags,strip_tags | Вырезает все теги (можно указать разрешенные теги). Не используйте для обеспечения безопасности. | [[+code:strip_tags]] |
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]] |
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 | Принимает таймстамп и возвращает дату в виде «Сегодня в 16:20 PM» | [[+createdon:fuzzydate]] |
ago | Возвращает число секунд, минут, недель или месяцев, прошедших с даты, указанной в теге. | [[+createdon:ago]] |
md5 | Создает MD5-хеш значения | [[+password:md5]] |
cdata | Оборачивает вывод тегами CDATA | [[+content:cdata]] |
userinfo | Возвращает запрашиваемое значение из профиля пользователя. Необходимо указывать ID пользователя | [[!+modx.user.id:userinfo=`username`]] |
isloggedin | Возвращает 1, если пользователь авторизован в текущем контексте | [[!+modx.user.id:isloggedin:is=`1`:then=`Yes`:else=`No`]] |
isnotloggedin | Возвращает 1, если пользователь неавторизован в текущем контексте | [[!+modx.user.id:isnotloggedin:is=`1`:then=`No`:else=`Yes`]] |
urlencode | Конвертирует значение как URL, то есть применяет PHP фнукцию `urlencode()` | [[+mystring:urlencode]] |
urldecode | Конвертирует значение как из URL, то есть применяет PHP фнукцию `urldecode()` | [[+myparam:urldecode]] |
Модификаторы для работы с пользователями нужно вызывать некэшированными, чтобы каждый юзер видел актуальные данные.
Использование модификаторов вывода совместно с параметрами
Если у тега есть параметры, то их необходимо прописывать сразу после модификатора:
[[!getResources:default=`К сожалению, ничего не найдено`?
&tplFirst=`blogTpl`
&parents=`2,3,4,8`
&tvFilters=`blog_tags==%[[!tag:htmlent]]%`
&includeTVs=`1`
]]
Создание пользовательского модификатора
Любой сниппет может использоваться как модификатор вывода. Для этого просто укажите имя сниппета вместо модификатора. К примеру, создадим сниппет [[makeExciting]]
, добавляющий к выводу определенное количество восклицательных знаков:
[[*pagetitle:makeExciting=`4`]]
Такой вызов тега передаст в сниппет makeExciting следующие параметры для обработки:
Параметр | Значение | Значение в примере | Комментарий |
---|---|---|---|
input | Значение элемента | $input = `[[*pagetitle]]`; | Значение элемента, к которому применяется модификатор. |
options | Значение модификатора | $options = 4 ; | Дополнительные параметры (после знака = ) |
token | Тип элемента | $token = * ; | Cимвол, определяющий тип тега. |
name | Имя элемента | $name = `pagetitle`; | Имя плейсхолдера, к которому применяется модификатор. |
tag | Весь тег полностью | $tag = `[[*pagetitle:makeExciting=`4`]]`; | Весь тег, полностью. |
Приведем пример кода нашего сниппета makeExciting:
<?php
$defaultExcitementLevel = 1;
$result = $input;
if (isset($options)) {
$numberOfExclamations = $options;
}
else {
$numberOfExclamations = $defaultExcitementLevel;
}
for ($i = $numberOfExclamations; $i > 0; $i--) {
$result = $result . '!';
}
return $result;
Тег выводит всё, что возвращает сниппет. В нашем случае он вернет значение тега [[*pagetitle]]
с четырьмя восклицательными знаками.
Если сниппет вернет пустую строку, то на страницу будет выведено изначальное значение тега.
Цепочки фильтров (Множественные модификаторы)
Хорошим примером цепочки фильтров будет форматирование даты, например, так:
[[*publishedon:strtotime:date=`%d.%m.%Y`]]
Модификатор 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`]] |
[[!+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 пользователя.
Обратите внимание, что профиль текущего пользователя уже доступен в MODX по умолчанию, так что вам не нужно использовать модификатор UserInfo для него:
[[!+modx.user.id]]
— Выведет идентификатор пользователя[[!+modx.user.username]]
— Выведет логин пользователя[[!+modx.user.fullname]]
— Полное имя пользователя[[!+modx.user.dob]]
— Дата рождения
Фильтр userinfo нужно вызывать некэшированным, иначе пользователи будут видеть чужие закэшированные данные.
Как правильно использовать чанки с параметрами и новый IF ? / Вопросы / MODX.im
Здравствуйте.Пользуюсь такой вещью, как чанки в параметрами. Удобно. Так как к примеру можно делать удобные записи в шаблоне вида
{{TOP_PART? &body_class=`mainpage` &leftcolumn=``}}
В самом чанке TOP_PART, соответственно, выводим body_class и все хорошо.
Проблемы начинаются, когда хочется проверить значение, переданное в чанк, а еще хуже — проверить вообще факт передачи значения.
Например, делаем вот такой тест и запихиваем в чанк TOP_PART:
leftcolumn без условий: [+leftcolumn+]
[+leftcolumn:isnotempty:then=`не пусто из inline`:else=`пусто из inline`+]
<@IF: [+leftcolumn:isnotempty+] >
Не пусто из IF
<@ELSE>
Пусто из IF
<@ENDIF>
[[if?
&is=`[+leftcolumn+]:!empty`
&then=`не пусто из сниппета if
`
&else=`пусто из сниппета if
`
]]
<hr/>
[+leftcolumn:is(`submenu`):then=`совпало из inline`:else=`не совпало из inline`+]
<@IF: [+leftcolumn:is(`submenu`)+] >
Совпало из IF
<@ELSE>
Не совпало из IF
<@ENDIF>
[[if?
&is=`[+leftcolumn+]:eq:submenu`
&then=`совпало из сниппета if
`
&else=`не совпало из сниппета if
`
]]
И проверяем, что будет выведено.
Делаем три шаблона с разным вызовом чанка.
Шаблон 1:
{{TOP_PART? &leftcolumn=`submenu`}}
Шаблон 2:
{{TOP_PART? &leftcolumn=``}}
Шаблон 3:
{{TOP_PART}}
Шаблон 4:
{{TOP_PART? &leftcolumn=`newmenu`}}
В шаблоне 1 получаем все хорошо:
leftcolumn без условий: submenu
не пусто из inline
Не пусто из IF
не пусто из сниппета if
совпало из inline
Совпало из IF
совпало из сниппета if
Хуже получается в шаблоне 2:
leftcolumn без условий:Видим, что вообще проигнорировался вызов сниппета if, и неправильно прошла проверка «пустоты» в IF.
пусто из inline
Не пусто из IF
не совпало из inline
Совпало из IF
В шаблоне 3 вообще все плохо:
leftcolumn без условий:(хотя, скорее всего объясняется тем, что значение передается в конструкции в виде строки с плюсиками и скобочками, которая соответственно не пустая и не ноль, но при этом не понятно, почему тогда не вызвалась inline-проверка модификаторами).Не пусто из IF
не пусто из сниппета ifСовпало из IF
Ну и вариант 4:
leftcolumn без условий: newmenu
не пусто из inline
Не пусто из IF
не пусто из сниппета if
не совпало из inline
Совпало из IF
Опять игнорирование второго вызова сниппета if, и ложное совпадение в IF.
Как вообще с этим механизмом работать?
Я конечно понимаю что можно все загнать в сниппет, там разобрать при помощи php и распихать далее с помощью parseChunk по чанкам, но раз сделана такая вроде бы красивая конструкция, то хочется добиться от нее красивой работы.
(Версия modx EVO последняя на сегодняшний день, девелоперская. )
Сниппет getPage MODx Revo: параметры и применение.
Что такое getPage и для чего он нужен?
getPage это сниппет MODx Revo, который позволяет организовать постраничный просмотр некоторых элементов сайта. К этим элементам могут применяться ограничительные меры, в виде отбора по свойствам или параметрам.
Особенности getPage.
Основной особенностью сниппета getPage является то, что сам по себе он ничего не делает. Иными славами, он является лишь оберткой, для других сниппетов. Они должны передать некий набор информации, который уже getPage разобьет на страницы для удобного для нас и упорядоченного просмотра.
Еще одной особенностью, которая может ввести программиста, который не сталкивался ранее со сниппетом getPage заключается в том, что он не должен вызываться некэшируемым в кэшируемом ресурсе.
Параметры сниппета getPage.
- &elementClass=« — указывает, какой тип мы обертываем, по умолчанию modSnippet;
- &element=« — указывает, что именно мы обертываем, например getResource;
- &limit=« — количество выводимых элементов на странице, по умолчанию 10;
- &offset=« — задает отступ или смещение, относительно начального значения в результирующем массивы выходных данных;
- &page=« — текущая отображаемая страница;
- &pageCount=« — количество страниц;
- &pageVarKey=« текущая отображаемая страница;
- &totalVar=« — задает наименование плейсхолдера, содержащего общее количество записей в рамках массива;
- &total=« — общее количество записей, разбиваемых на страницы;
- &firstItem=« — индекс первого отображаемого элемента списка на странице;
- &lastItem=« — индекс последнего отображаемого элемента списка на странице;
- &pageOneLimit=« — дополнительный лимит отображаемых элементов на первой странице, может отличаться от основного;
- &pageLimit=« — количество отображаемых элементов на странице;
- &pageNavVar=« — маркер плейсхолдера, устанавливающегося вместе с меню навигации.
Параметры шаблонизации сниппета getPage.
- &pageNavOuterTpl=« — задает шаблон контейнера постраничной навигации и ее вывод;
- &pageNavTpl=« — задает шаблон отображения одну страницу элементов навигации;
- &pageActiveTpl=« — задает шаблон отображения текущей страницы (активной) элементов навигации;
- &pageFirstTpl=« — задает шаблон отображения первой страницы элементов навигации;
- &pageLastTpl=« — задает шаблон отображения последней страницы элементов навигации;
- &pagePrevTpl=« — задает шаблон предыдущей страницы элементов навигации;
- &pageNextTpl=« — задает шаблон последующей страницы элементов навигации.
Примеры использования сниппета getPage.
Выводит список ресурсов, в том числе тех, которые не показываются в меню текущего родительского элемента, включая tv-параметры, используя шаблон в чанке post_tpl с разбиением на постраничную навигацию по 5 на одну страницу.
[ [[getPage? &elementClass=`modSnippet` &element=`getResources` &parents=« &showHidden=`1` &tpl=`post_tpl` &includeContent=`1` &includeTVs=`1` &processTVs=`1` &hideContainers=`1` &pageLimit=`5` &pageNavVar=`page.nav` &limit=`5`] ]
Как видите, сниппет getPage в нашем случае используется в связке со сниппетом getResource.
[(allow_duplicate_alias)] | разрешены или нет повторяющиеся псевдонимы при использовании дружественных URL |
[(automatic_alias)] | генерируются ли псевдонимы документов на основе заголовков страниц автоматически |
[(base_url)] или [(site_url)] | адрес сайта |
[(cache_default)] | документ ‘кэшируемый’ по умолчанию |
[(captcha_words)] | слова, используемые для настройки Captcha |
[(custom_contenttype)] | разделенный запятыми список типов содержимого, обслуживаемых MODx |
[(default_template)] | идентификатор шаблона используемого по умолчанию для новых документов |
[(editor_css_path)] | путь к CSS-файлу используемого визуальным редактором |
[(emailsender)] | основной адрес электронной почты на сайте |
[(emailsubject)] | тема письма подтверждения регистрации веб-пользователей |
[(error_page)] | идентификатор страницы ошибки ‘404’ |
[(etomite_charset)] или [(modx_charset)] | кодировка сайта |
[(fck_editor_autolang)] | указывает, установлен ли FCKeditor для автоматического определения языка |
[(fck_editor_style)] | указывает стиль используемый в FCKeditor |
[(fck_editor_toolbar)] | указывает на пользовательскую панель инструментов, добавленную в FCKeditor |
[(filemanager_path)] | корневая папка для доступа файлового менеджера MODx |
[(friendly_alias_urls)] | используются ли псевдонимы в дружественных URL |
[(friendly_urls)] | используются ли дружественные URL |
[(friendly_url_prefix)] | префикс для дружественных URL |
[(friendly_url_suffix)] | суффикс для дружественных URL |
[(manager_language)] | язык системы управления |
[(manager_layout)] | layout for the MODx Content Manager. |
[(manager_theme)] | шаблон системы управления |
[(number_of_logs)] | количество записей протокола на одной странице |
[(number_of_messages)] | количество сообщений на одной странице |
[(number_of_results)] | количество элементов, отображаемых в списках и результатах поиска |
[(publish_default)] | публикация новых ресурсов после создания по умолчанию |
[(rb_base_dir)] | физический путь к папке файлов |
[(rb_base_url)] | адрес (URL) папки файлов |
[(reset_template)] | indicates if all templates or just documents assigned the current default_template are reset when the default template is changed in the manager. |
[(resolve_hostnames)] | indicates if MODx will try to resolve visitors’ hostnames when they visit the site (applies to MODx internal logs). |
[(search_default)] | новые ресурсы после создания доступны для поиска по умолчанию |
[(server_offset_time)] | поправка (количество часов) между временем на месте вашего пребывания и на месте нахождения сервера |
[(server_protocol)] | HTTP или HTTPS (SSL) соединение |
[(settings_version)] | версия MODx |
[(show_preview)] | determines if preview is shown when viewing documents in MODx Content Manager. |
[(signupemail_message)] | сообщение, которое будет отсылаться менеджерам, когда создается учетная запись нового менеджера |
[(site_id)] | (replaceThisText) |
[(site_name)] | название сайта |
[(site_start)] | идентификатор стартовой страницы |
[(site_status)] | статус сайта online (1) или offline (0) |
[(site_unavailable_message)] | сообщение, выводимое в случае недоступности сайта (когда выбран статус ‘Оффлайн’) или в случае возникновения ошибки. Это сообщение выводится только в том случае, когда не выбрана страница ‘Сайт недоступен’ |
[(site_unavailable_page)] | идентификатор ресурса, который должны будут увидеть посетители, если попытаются зайти на сайт, когда он недоступен |
[(strip_image_paths)] | используются абсолютные или относительные ссылки для изображений, файлов, анимации и т.д. |
[(top_howmany)] | количество лучших показателей в отчетах статистики |
[(track_visitors)] | регистрировать посещения |
[(udperms_allowroot)] | разрешено ли пользователям создавать ресурсы в корневой папке |
[(unauthorized_page)] | ID ресурса, который должны будут увидеть посетители, если попытаются зайти на закрытую страницу (403 – доступ запрещен) |
[(upload_files)] | разделенный запятыми список расширений файлов, которые могут быть загружены через файловый менеджер |
[(upload_maxsize)] | максимальный размер загружаемых файлов в байтах |
[(use_alias_path)] | используются вложенные URL |
[(use_captcha)] | использовать код CAPTCHA при авторизации |
[(use_editor)] | использовать HTML-редактор |
[(use_udperms)] | indicates if user permissions are enabled for the site. |
[(webpwdreminder_message)] | сообщение, которое будет отсылаться веб-пользователям, когда они запрашивают напоминание пароля |
[(websignupemail_message)] | сообщение, которое будет отсылаться веб-пользователям, когда создается учетная запись нового веб-пользователя |
[(which_editor)] | используемый HTML-редактор |
Синтаксис тегов в MODX Revolution MODX
Для упрощения логики парсинга, ускорения и избежания путаницы, все таги в MODX Revolution сделаны в едином формате, отличаются лишь токеном или набором токенов перед строкой, которая идентифицирует Элемент контента или Контент тег для его обработки; например [[tokenIdenticator]].
Формат тегов в MODX Revolution
Элементы контента | Evolution (Старый) | Revolution (Новый) | Примеры для Revolution | |
---|---|---|---|---|
Шаблоны | нет представления тегом | нет представления тегом | ||
Поля ресурса | [*field*] | [[*field]] | [[*pagetitle]] | |
Переменные шаблона | [*templatevar*] | [[*templatevar]] | [[*tags]] | |
Чанки | {{chunk }} | [[$chunk]] | [[$header]] | |
Сниппеты | [[snippet]] | [[snippet]] | [[getResources]] | |
Плагины | нет представления тегом | нет представления тегом | ||
Модули | нет представления тегом | не существует в Revolution, используйте ПСМ | ||
Контент теги | ||||
Заполнители | [+placeholder+] | [[+placeholder]] | [[+modx.user.id]] | |
Ссылки | [~link~] | [[~link]] | [[~[[*id]]? &scheme=`full`]] | |
Системные настройки | [(system_setting)] | [[++system_setting]] | [[++site_start]] | |
Языки | нет представления тегом | [[%language_string_key]] | ||
Комментарий (см. ниже)) | [[-это комментарий]] |
Принятие нового формата в Revolution позволило новому парсеру быть полностью рекурсивным, использующем механизм, который не зависит от регулярных выражений.
Ранее какждый таг парсился независимо в особом порядке, один уровень за раз, встроенные теги ожидали своего прохода. Теперь теги парсятся так как они идут по очереди не зависимо от типа элемента, что они представляют и встроенные теги парсятся перед внешними для возможности создания более сложных конструкций из тего. Вместе с возможностью использования предварительно зарезервированного ? & и = символов в теговых строках, MODX контент теги являют мощный набор возможностей для управления контентом.
Теги комментарии
Эта дискуссия на форуме показывает, что некоторые люди испытывают потребность в тегах-комментариях. Поведение по-умолчанию, когда тег представляет несуществующий элемент, то он тихо игнорируется полностью. Используя это свойство вы можете добавлять комментарии в ваших шаблонах, чанках и содержимом и ничего из этого не будет видно во фронт-энде.
Так начиная с версии MODX Revolution 2.2, любой тег, что начинается с тире (-) игнорируется парсером и любые теги, которые он включает будут игнорироваться. До этой версии можно было использовать аналогичный приём, но теги в них парсились и оказывали влияние на производительность.
[[- этот комментарий может быть удалён]]
Структура Тега
Тег содержит много частей:
[[ (отрывающие теги)
! (опционально — некешируеммый флаг)
elementToken (опционально — токен идентифицирующий тип элемента, если он не сниппет, $=чанк, *=поле ресурса/ТВ, +=заполнитель/плейсхолдер и др.)
elementName
@propertyset (опционально — идентификатор Набора параметров)
:filterName=`modifier`:… (опционально — один или несколько фильтров вывода)
? (опционально; показывает начало строки параметров)
&propertyName=`propertyValue` &… (опционально; любые дополнительные параметры разделённые &)
]] (закрывающие теги)
Теги можно располагать на одной линии или в несколько. Любой вариант является приемлемым:
[[!getResources? &parents=`123` &limit=`5`]] [[!getResources? &parents=`123` &limit=`5` ]]
Параметры
Все теги — а не только сниппеты, в MODX принимают параметры и могут их использовать. Например, давайте возьмём чанк ‘Hello’ с содержимым:
Привет [[+name]]!
Теперь можно передать параметр этому чанку:
[[$Hello?name=`Виктор`]]
Это выведет
Привет Виктор!
Синтакс для параметров такой же как и в Эволюшн.
Кеширование
В Evolution сниппеты, которые должны были быть обработаны с каждым запросом должны быть на некешированной странице или Сниппет сам по себе должен был вызываться некешированно: [!snippet!]
В Revolution любой тег может быть вызван некешированно сразу же после двойных скобок: [[!snippet]], [[!$chunk]], [[!+placeholder]], [[!*template_var]], и др
Если у вас продвинутая установка, в которой настройка site_url — устанавливается по запросу, но ваши ссылки [[~[[*id]]]] не генерируются правильно, помните, что любой тег может вызываться некешированно включая ссылку или анкор-тег:[[!~[[*id]]]]
В то же время, это вам нужно будет лишь тогда, когда site_url устанавливается динамически и отличается при запросах. Обычно используется кешированная запись.
Порядок парсинга
Если вы можете вызвать сниппет некешированно, то он будет выполнен в последнюю очередь парсинга.
Если у вас ещё ниже есть закешированные заполнители, то они будут определены перед выполнением Сниппета — это значит, что они получат последнее значение хранимое в кеше этого Сниппета ранее (или пустое, если ещё не было установлено).
Если вы хотите вызвать Сниппет некешированно, который установит заполнители, то вам нужно убедится, что заполнители некешированные тоже:
[[!Profile]] Привет [[!+username]]
Оригинал статьи Tag Syntax