Фильтры ввода и вывода
Фильтры ввода и вывода в MODx.
Оглавление
Фильтры ввода и вывода в MODx позволяют манипулировать тем, как будут обрабатываться те или иные теги. Они позволяют вам изменять значения прямо внутри ваших шаблонов.
Фильтры ввода
В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODx.
Фильтры вывода
В 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 = *; |
Символ, определяющий тип тега. |
| 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 нужно вызывать некэшированным, иначе пользователи будут видеть чужие закэшированные данные.
Различные условия
Набор различных условий, которые часто используются при создании условий:
Проверка авторизации
Если id пользователя больше 0, значит пользователь авторизован, если равен 0, то это гость:
[[!+modx.user.id:gt=`0`:then=`Пользователь авторизован`:else=`Пользователь не авторизован`]] Время запросов: 0,2057 s
Количество запросов: 24
Источник: cache