- Входной фильтр
- Выходной фильтр
- Модификаторы вывода
- Условные модификаторы вывода
- Модификаторы вывода строки
- Кэширование
- Использование модификатора вывода со свойствами тега
- Создание пользовательского модификатора вывода
- Цепочка (несколько выходных фильтров)
- Примеры пользовательских фильтров вывода
- Создание пользовательского модификатора вывода
- Примеры
- alternateClass
- parseLinks
- parseTags
- parseTags
- shorten
- substring
- numberformat
Входной фильтр
В настоящее время входной фильтр обрабатывает вызовы тегов при подготовке к выходному фильтру. Обычно он используется только внутри MODX.
Выходной фильтр
В Revolution фильтр вывода применяет один или несколько серий выходных модификаторов, которые ведут себя аналогично вызовам PHx в MODX Evolution — за исключением того, что они встроены в ядро. Синтаксис выглядит так:
[[element:modifier=`value`]]
Они также могут быть прикованы цепью (выполнено слева направо):
[[element:modifier:anothermodifier=`value`:andanothermodifier:yetanother=`value2`]]
Вы также можете использовать их для изменения вывода сниппеты. Обратите внимание, что модификатор идет после имени сниппета и перед знаком вопроса, например:
[[mySnippet:modifier=`value`? &mySnippetParam=`something`]]
Если у вас есть более длинный код :then=:else=
оператор, и вы хотите сделать его более читабельным, поместив его в несколько строк, это должно быть сделано так:
[[+placeholder:is=`0`:then=`
// code
`:else=`
// code
`]]
Модификаторы вывода
В следующей таблице перечислены некоторые из существующих модификаторов и приведены примеры их использования. Хотя приведенные ниже примеры являются тегами-плейсхолдеров, выходные модификаторы можно использовать с любым тегом MODX. Убедитесь, что используемый заполнитель действительно получает данные.
Условные модификаторы вывода
Модификатор | Описание | Пример |
---|---|---|
if, input | if — задает дополнительное условие. input — добавляет в тег обратываемые данные | [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`Да`:else=`Нет`]] — если id-ресурса = 1 и не равно 2, выводим «Да», или же «Нет» |
or | Может использоваться для вывода выходных модификаторов вместе с отношением «OR». | [[+numbooks:is=`5`:or:is=`6`:then=`Есть 5 или 6 книг!`:else=`Не уверен, сколько книг`]] |
and | Может использоваться для вывода выходных модификаторов вместе с отношением «AND». | [[*id:is=`1`:and:if=`[[*id]]`:ne=`2`:then=`Да`:else=`Нет`]] — если id-ресурса = 1 и не равно 2, выводим «Да», или же «Нет» |
isequalto, isequal, equalto, equals, is, eq | Сравнивает с переданным значением и продолжает, если оно такое же. Используется с «then» и «else» | [[+numbooks:isequalto=`5`:then=`Есть 5 или 6 книг!`:else=`Не уверен, сколько книг`]] |
notequalto, notequals, isnt, isnot, neq, ne | Сравнивает с переданным значением и перемещается, если оно не совпадает. Используется с «then» и «else» | [[+numbooks:notequalto=`5`:then=`Не уверен, сколько книг`:else=`Есть 5 книг!`]] |
greaterthanorequalto, equalorgreaterthen, ge, eg, isgte, gte | Сравнивает с переданным значением и продолжает, если оно больше или равно значению. Используется с «then» и «else». | [[+numbooks:gte=`5`:then=`Есть 5 книг или более 5 книг`:else=`Есть менее 5 книг`]] |
isgreaterthan, greaterthan, isgt, gt | Сравнивает с переданным значением и продолжает, если оно больше, чем значение. Используется с «then» и «else». | [[+numbooks:gt=`5`:then=`Есть более 5 книг`:else=`Есть менее 5 книг`]] |
equaltoorlessthan, lessthanorequalto, el, le, islte, lte | Сравнивает с переданным значением и продолжает, если оно меньше или равно значению. Используется с «then» и «else». | [[+numbooks:lte=`5`:then=`Есть 5 или менее 5 книг`:else=`Есть более 5 книг`]] |
islowerthan, islessthan, lowerthan, lessthan, islt, lt | Сравнивает с переданным значением и продолжает, если оно меньше значения. Используется с «then» и «else». | [[+numbooks:lt=`5`:then=`Есть менее 5 книг`:else=`Есть более 5 книг`]] |
contains | Проверяет, содержит ли значение переданную строку. | [[+author:contains=`Samuel Clemens`:then=`Mark Twain`]] |
containsnot | Проверьте, не содержит ли значение переданную строку. | [[+author:containsnot=`Samuel Clemens`:then=`Somebody Else`]] |
in, IN, inarray, inArray | Проверьте, находится ли значение в массиве (через запятую) | [[+id:in=`5,15,22`:then=`Yes in array`]] |
hide | Проверяет более ранние условия и скрывает элемент, если условия были выполнены. | [[+numbooks:lt=`1`:hide]] |
show | Проверит более ранние условия и покажет элемент, если условия были выполнены. | [[+numbooks:gt=`0`:show]] |
then | Условное использование. | [[+numbooks:gt=`0`:then=`Now available!`]] |
else | Условное использование вместе с потом. | [[+numbooks:gt=`0`:then=`Now available!`:else=`Sorry, currently sold out.`]] |
select | Выведите замену, если значение находится в списке значений перед знаком равенства. В противном случае результат будет пустым. | [[+numbooks:select=`0=Value 0&1=Value 1&2=Value 2`]] |
memberof, ismember, mo | Проверяет, является ли пользователь членом указанной группы (групп). | [[+modx.user.id:memberof=`Administrator`]] |
Модификаторы вывода строки
Модификатор | Описание | Пример |
---|---|---|
cat | Добавляет значение параметра (если оно не пустое) к входному значению | [[+numbooks:cat=`books`]] |
after, append | Добавляет значение параметров к входному значению (если оба не пустые). Добавлен в 2.6.0. | [[+totalnumber:after=`total`]] |
before, prepend | Добавляет значение параметров к входному значению (если оба не пустые). Добавлен в 2.6.0. | [[+booknum:before=`book #`]] |
lcase, lowercase, strtolower | Преобразует строки в нижний регистр. Похож на PHP strtolower | [[+title:lcase]] |
ucase, uppercase, strtoupper | Преобразует строки в верхний регистр. Похож на PHP strtoupper | [[+headline:ucase]] |
ucwords | Преобразует первую букву слова в верхний регистр. Похож на PHP ucwords | [[+title:ucwords]] |
ucfirst | Преобразует первую букву строки в верхний регистр. Похож на PHP ucfirst | [[+name:ucfirst]] |
htmlent, htmlentities | Замените любой символ, имеющий HTML-сущность, этой сущностью. Похож на PHP htmlentities. Uses the current value the system setting modx_charset with flag ENT_QUOTES |
[[+email:htmlent]] |
esc,escape | Безопасно экранирует значения символов, используя регулярные выражения и str_replace. | Также убирает [, ] и [[+email:escape]] |
strip | Заменить все разрывы строк, табуляции и несколько пробелов одним пробелом | [[+textdocument:strip]] |
stripString | Удаляет строку указанного значения | [[+name:stripString=`Mr.`]] |
stripmodxtags | Удаляет теги MODX из ввода. (Добавлено в v2.7) | [[+code:stripmodxtags]] |
replace | Заменяет одно значение другим | [[+pagetitle:replace=`Mr.==Mrs.`]] |
striptags, stripTags,notags,strip_tags | Удаляет HTML-теги из ввода. Опционально принимает значение, чтобы указать, какие теги разрешить. Похож на PHP strip_tags | [[+code:strip\_tags=` `]] |
len,length, strlen | Подсчитывает длину пропущенной строки. Похож на PHP strlen | [[+longstring:strlen]] |
reverse, strrev | Обращает ввод, символ за символом. Похож на PHP strrev | [[+mirrortext:reverse]] |
wordwrap | Вставка символа новой строки после установленного количества символов. Похож на PHP wordwrap. Takes optional value to set wordwrap position. | [[+bodytext:wordwrap=`80`]] |
wordwrapcut | Вставляет символ новой строки после заданного количества символов, независимо от границ слова. Похож на PHP wordwrap, с включенным сокращением слова. Принимает необязательное значение для установки положения переноса слов. | [[+bodytext:wordwrapcut=`80`]] |
limit | Ограничивает строку определенным количеством символов. По умолчанию 100. | [[+description:limit=`50`]] |
ellipsis | Добавляет многоточие и усекает строку, если она длиннее определенного количества символов. В качестве контрольных точек используются только пробелы. По умолчанию 100. | [[+description:ellipsis=`50`]] |
tag | Отображает необработанный элемент без :tag. Полезно для документации. | [[+showThis:tag]] |
tvLabel | Отображает метку с TV, полезную при использовании выбора или флажки и т.д., Где вы используете `Label==1 | |
math | Возвращает результат расширенного расчета (Не рекомендуется) Удалено в Revolution 2.2.6. | [[+blackjack:add=`21`]] |
add,increment,incr | Возвращает входные данные, увеличенные на параметр (по умолчанию: +1) | [[+downloads:incr]] |
subtract,decrement,decr | Возвращает входные данные, уменьшенные на параметр (по умолчанию: -1) | [[+countdown:decr]] [[+moneys:subtract=`100`]] |
multiply,mpy | Возвращает входные данные, умноженные на параметр (по умолчанию: *2) | [[+trifecta:mpy=`3`] |
divide,div | Возвращает входные данные, разделенные на опции (по умолчанию: /2) Не принимает 0. | [[+rating:div=`4`]] |
modulus,mod | Возвращает модуль параметра на входе (по умолчанию: %2, возвращает 0 или 1) | [[+number:mod]] или [[+number:mod=`3`]] |
ifempty,default,empty, isempty | Возвращает входное значение, если оно пустое | [[+name:default=`anonymous`]] |
notempty, !empty, ifnotempty, isnotempty | Возвращает входное значение, если оно не пустое | [[+name:notempty=`Hello `[[+name]]`!`]] |
nl2br | Преобразует символ новой строки (\n) в HTML | |
element. | Используйте это, если вы принимаете ввод, вы думаете, что в нем должны быть новые строки, а их нет. Похож на PHP nl2br. | [[+textfile:nl2br]] |
date | Форматирует временную метку Unix в другой формат. Похож на PHP strftime. Значение это формат. Посмотрите Форматы даты. | [[+birthyear:date=`%Y`]] |
strtotime | Преобразует строку даты в метку времени Unix. Полезно сочетать это с выходным фильтром даты. Похож на PHP strtotime. Takes in a date. Посмотрите Форматы даты. | [[+thetime:strtotime]] |
fuzzydate | Возвращает симпатичный формат даты со вчерашним и сегодняшним фильтрованием. Берет в свидание. | [[+createdon:fuzzydate]] |
ago | Возвращает красивый формат даты в секундах, минутах, неделях или месяцах назад. Берет на свидание (strtotime). | [[+createdon:date=`%d-%m-%Y`:ago]] |
md5 | Создает хеш MD5 для входной строки. Похож на PHP md5. | [[+password:md5]] |
cdata | Обтекание текста тегами CDATA | [[+content:cdata]] |
userinfo | Возвращает запрошенные данные пользователя. Элемент должен быть идентификатором modUser. Поле значения — это столбец для захвата, например: fullname, email. Смотрите примеры ниже. | [[+modx.user.id:userinfo=`username`]] |
isloggedin | Возвращает true, если пользователь аутентифицирован в этом контексте. | [[+modx.user.id:isloggedin]] |
isnotloggedin | Возвращает true, если пользователь не аутентифицирован в этом контексте. | [[+modx.user.id:isnotloggedin]] |
toPlaceholder | Помещает введенное значение в переданный плейсхолдер. Не мешает вывод значения TV, поэтому добавьте [[*someTV:toPlaceholder=`placeholder`:notempty=``]] если вы не хотите выводить значение самого TV. |
[[*someTV:toPlaceholder=`placeholder`]] |
cssToHead | Поместите элемент <link> в , где входное значение находится внутри атрибута href. |
|
Uses | modX.regClientCSS. | [[+cssTV:cssToHead]] |
htmlToHead | Вставьте блок HTML-кода в заголовок страницы, прежде чем </head> . |
|
Uses | modX.regClientStartupHTMLBlock | [[+htmlTV:htmlToHead]] |
htmlToBottom | Вставьте HTML-код в конце страницы перед </body> . Использовать modX.regClientHTMLBlock. |
[[+htmlTV:htmlToBottom]] |
jsToHead | Вставьте код JS (или ссылку) в заголовок страницы перед </head> . Использовать modX.regClientStartupScript. |
[[+jsTV:jsToHead]] |
jsToBottom | Вставьте код JS (или ссылку) в конце страницы перед </body> . Использовать modX.regClientScript. |
[[+jsTV:jsToBottom]] |
urlencode | Преобразует ввод в строку, удобную для URL, аналогично тому, как это делает форма HTML. Похож на PHP urlencode | [[+mystring:urlencode]] |
urldecode | Преобразует входные данные из строки, удобной для URL, аналогично PHP urldecode | [[+myparam:urldecode]] |
filterPathSegment | Добавлено в 2.7. Преобразует ввод в удобную для URL строку с тем же механизмом, который превращает заголовок страницы в псевдоним, включая транслитерацию, если она включена. Полезно для пользовательских URL. | [[+pagetitle:filterPathSegment]] |
Кэширование
Как правило, любой контент в заполнителе, который, по вашему мнению, может изменяться динамически, должен быть кэширован. Например:
[[+placeholder:default=`Значение по умолчанию!`]]
Это означает, что может иногда быть пустым, а иногда нет. Почему вы хотите, чтобы это кэшировалось? Это исключило бы точку модификатора вывода.
Иногда выходные модификаторы можно использовать в кешированном заполнителе, но только если вы вызываете сниппет, который также устанавливает их в кеширование. В противном случае вы выполняете нелогичный маневр — пытаетесь статически кешировать что-то, что никогда не было статичным.
В общем правило is: Если вы установите плейсхолдер в некэшированном сниппете, плейсхолдер также необходимо будет кэшировать, если вы ожидаете, что содержимое плейсхолдера будет отличаться.
Использование модификатора вывода со свойствами тега
Если у вас есть свойства для тега, вы можете указать эти после модификатора:
[[!getResources:default=`Извините, ничего не соответствует вашему запросу.`?
&tplFirst=`blogTpl`
&parents=`2,3,4,8`
&tvFilters=`blog_tags==%[[!tag:htmlent]]%`
&includeTVs=`1`
]]
Создание пользовательского модификатора вывода
Также, Сниппеты могут быть использованы в качестве пользовательских модификаторов. Проще говоря Сниппеты имя вместо модификатора. Пример сниппет makeExciting, который добавляет переменное количество восклицательных знаков:
[[*pagetitle:makeExciting=`4`]]
Этот вызов переменной документа с модификатором вывода передаст эти свойства в сниппет:
Параметр | Значение | Пример результата |
---|---|---|
input | Значение элемента. | Значение [[*pagetitle]] |
options | Любое значение, переданное модификатору. | ‘4’ |
token | Тип родительского элемента. | * (токен pagetitle ) |
name | Имя родительского элемента. | pagetitle |
tag | Полный родительский тег. | [[*pagetitle:makeExciting=`4`]] |
Вот пример реализации для нашего сниппета makeExciting:
$defaultExcitementLevel = 1;
$result = $input;
if (isset($options)) {
$numberOfExclamations = $options;
} else {
$numberOfExclamations = $defaultExcitementLevel;
}
for ( $i = $numberOfExclamations; $i > 0; $i-- ) {
$result = $result . '!';
}
return $result;
Возвращаемое значение вызова будет тем, что возвращает сниппет. Для нашего примера результатом будет значение переменной документа pagetitle с четырьмя восклицательными знаками.
Исходное входное значение будет возвращено, если сниппет возвращает пустую строку.
Цепочка (несколько выходных фильтров)
Хорошим примером цепочки может быть форматирование строки даты в другой формат, например так:
[[+mydate:strtotime:date=`%Y-%m-%d`]]
Прямой доступ к таблице modx_user_attributes
в базе данных с использованием модификаторов вывода вместо Сниппета может быть достигнуто просто с помощью модификатора userinfo. Выберите соответствующий столбец из таблицы и укажите его как свойство модификатора вывода, например так:
User Internal Key: [[!+modx.user.id:userinfo=`internalKey`]]
User name: [[!+modx.user.id:userinfo=`username`]]
Full Name: [[!+modx.user.id:userinfo=`fullname`]]
Role: [[!+modx.user.id:userinfo=`role`]]
E-mail: [[!+modx.user.id:userinfo=`email`]]
Phone: [[!+modx.user.id:userinfo=`phone`]]
Mobile Phone: [[!+modx.user.id:userinfo=`mobilephone`]]
Fax: [[!+modx.user.id:userinfo=`fax`]]
Date of birth: [[!+modx.user.id:userinfo=`dob`:date=`%Y-%m-%d`]]
Gender: [[!+modx.user.id:userinfo=`gender`]]
Country: [[+modx.user.id:userinfo=`country`]]
State: [[+modx.user.id:userinfo=`state`]]
Zip Code: [[+modx.user.id:userinfo=`zip`]]
Photo: [[+modx.user.id:userinfo=`photo`]]
Comment: [[+modx.user.id:userinfo=`comment`]]
Password: [[+modx.user.id:userinfo=`password`]]
Cache Password: [[+modx.user.id:userinfo=`cachepwd`]]
Last Login: [[+modx.user.id:userinfo=`lastlogin`:date=`%Y-%m-%d`]]
The Login:[[+modx.user.id:userinfo=`thislogin`:date=`%Y-%m-%d`]]
Number of Logins: [[+modx.user.id:userinfo=`logincount`]]
[[!+modx.user.id]]
по умолчанию используется текущий зарегистрированный идентификатор пользователя. Конечно, вы можете заменить это на [[*madeby]]
или другое поле ресурса или плейсхолдеров, которые возвращают числовой идентификатор, представляющий пользователя.
Обратите внимание, что идентификатор пользователя и имя пользователя уже доступны по умолчанию в MODX, поэтому вам не нужно использовать модификатор userinfo:
[[!+modx.user.id]] - Выводит идентификатор пользователя
[[!+modx.user.username]] - Выводит имя пользователя
Скорее всего, вы захотите вызывать их без кэширования (см. Примечание о кэшировании выше), чтобы предотвратить неожиданные результаты.
Примеры пользовательских фильтров вывода
Пользовательские выходные фильтры — это сниппеты MODX, предназначенные для форматирования вывода плейсхолдера в слое представления (в шаблоне или в блоке). Если необработанный плейсхолдер, например [[*pagetitle]]
.
возвращает строку текста, вы можете изменить ее с помощью пользовательского фильтра вывода, например: [[*pagetitle:myOutputFilter]]
.
просто создав сниппет с именем myOutputFilter
В приведенном выше примере значение pagetitle будет изменено сниппетом с именем myOutputFilter
Создание пользовательского модификатора вывода
При написании вашего собственного Модификатора вывода ваш сниппет может принимать следующие входные данные:
$input; // значение, которое форматируется/фильтруется
$options; // необязательные значения, передаваемые через обратные кавычки
Пользовательский выходной фильтр просто Сниппет это предназначено для изменения контента. Проще говоря Сниппет вместо модификатора.
Синтаксис в том, что имя Сниппета идет после двоеточия. Пример сниппет с именем ‘makeDownloadLink’: [[+file:makeDownloadLink=`notitle`]]
.
Это передаст эти свойства во сниппет:
Параметр | Значение | Пример результата |
---|---|---|
input | Значение элемента. | Значение [[+file]] |
options | Любое значение, переданное модификатору. | ‘notitle’ |
token | Тип родительского элемента. | + (токен на file ) |
name | Имя родительского элемента | file |
tag | Полный родительский тег. | [[+file:makeDownloadLink=`notitle`]] |
Наиболее важным (и, возможно, самым очевидным) из этих параметров является параметр $input. Ваш сниппет может сделать что-то простое, как это: return strtolower($input);
.
Примеры
Поскольку приведенные ниже примеры не включены в ядро, вам нужно будет добавить их самостоятельно. К счастью, MODX делает это до смешного легким. Вы можете просто использовать сниппеты в качестве выходных фильтров, поэтому процесс добавления пользовательского выходного фильтра просто добавляет новый сниппет! Чтобы использовать выходной фильтр, вы ссылаетесь на имя сниппета.
Для авторов документации: пожалуйста, добавьте примеры в алфавитном порядке.
alternateClass
alternateClass просто проверяет, можно ли разделить переданное целое число (например, заполнитель подсчета) на два. Если это возможно, он возвращает класс, который вы указали в качестве свойства выходного фильтра.
<?php
/*
* На основе phx:alternateClass от Smashingred
* Обновлено для Revolution Марком Хамстрой.
*/
if ($input % 2) {
return $options;
} else {
return ''; // Здесь можно установить другой класс
}
?>
Используйте как это: [[+component.idx:alternateClass=`alt`]]
.
parseLinks
Выходной фильтр parseLinks находит ссылки и заменяет их html <a>
атрибутом </a>
<?php
/*
* На основе phx:parseLinks
*/
$t = $input;
$t = ereg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $t);
$t = ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $t);
return $t;
parseTags
Этот parseTags принимает входные данные в виде списка, разделенного запятыми, и делает все отдельные теги ссылкой на ресурс 9 с параметром запроса tag=tagname, добавленным к ссылке.
<?php
/*
* На основе phx:parseLinks
*/
$t = $input;
$t = ereg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $t);
$t = ereg_replace("(^| |\n)(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $t);
return $t;
parseTags
Этот parseTags принимает входные данные в виде списка, разделенного запятыми, и делает все отдельные теги ссылкой на ресурс 9 с параметром запроса tag=tagname, добавленным к ссылке.
<?php
/*
* parseTags output filter
* by Mark Hamstra (http://www.markhamstra.nl)
* free to use / modify / distribute to your will
*/
if ($input == '') { return ''; } // Output filters are also processed when the input is empty, so check for that.
$tags = explode(', ',$input); // Based on a delimiter of comma-space.
foreach ($tags as $key => $value) { // Process them individually
$output[] = '<a href="'.$modx->makeurl(9, '', array('tag' => $value)).'">'.$value.'</a>';
}
return implode(', ',$output); // Delimit again with a comma-space
shorten
Это сокращает ввод, например :ellipsis, но не усекает слова. По умолчанию длина макс. 50 символов. Основано на коде от gOmp.
<?php
$output = '';
$options = !empty($options)?$options:50;
if (!empty($input) && !empty($options)) {
if (strlen($input) > $options) {
$output = substr($input, 0, strrpos(substr($input, 0, $options), ' ')).' …';
}
else{
$output = $input;
}
}
return $output;
?>
substring
Получить подстроку ввода.
<?php
$options=explode(',',$options);
return count($options)>1 ? substr($input,$options[0],$options[1]) : substr($input,$options[0]);
?>
Пример:
<span>[[*introtext:substring=`0,1`]]</span>[[*introtext:substring=`1`]]
numberformat
<?php
$number = floatval($input);
$optionsXpld = @explode('&', $options);
$optionsArray = array();
foreach ($optionsXpld as $xpld) {
$params = @explode('=', $xpld);
array_walk($params, function(&$v) { return $v = trim($v);});
if (isset($params[1])) {
$optionsArray[$params[0]] = $params[1];
} else {
$optionsArray[$params[0]] = '';
}
}
$decimals = isset($optionsArray['decimals']) ? $optionsArray['decimals'] : null;
$dec_point = isset($optionsArray['dec_point']) ? $optionsArray['dec_point'] : null;
$thousands_sep = isset($optionsArray['thousands_sep']) ? $optionsArray['thousands_sep'] : null;
$output = number_format($number, $decimals, $dec_point, $thousands_sep);
return $output;
Пример:
[[+price:numberformat=`&decimals=2&dec_point=,&thousands_sep=.`]]