Modx revo if параметры: (Modx Revo)Условие if для определенного id ресурса и всех его дочерних документов? – [Revo] ModX IF создание условий от Василисы Белозеровой

Содержание

Фильтры ввода-вывода (модификаторы) в 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, inputif — задает дополнительное условие, 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`]]
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:

// Выведет 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=`К сожалению, ничего не найдено`]]

Результат работы примера может быть пустым, а может и нет. Как мы можем кэшировать это? Пример, приведенный выше, отражает природу модификатора вывода.

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

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

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


На поддержку блога

Фильтры phx ( модификаторы ) в MODx REVOLUTION

МодификаторОписаниеПример
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`]]
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 пользователя.

Обратите внимание, что профиль текущего пользователя уже доступен в 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 без условий:
пусто из inline
Не пусто из IF
не совпало из inline
Совпало из IF
Видим, что вообще проигнорировался вызов сниппета if, и неправильно прошла проверка «пустоты» в IF.

В шаблоне 3 вообще все плохо:

leftcolumn без условий:

Не пусто из IF
не пусто из сниппета if

Совпало из IF

(хотя, скорее всего объясняется тем, что значение передается в конструкции в виде строки с плюсиками и скобочками, которая соответственно не пустая и не ноль, но при этом не понятно, почему тогда не вызвалась inline-проверка модификаторами).

Ну и вариант 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.


Tags — Школа MODX

[(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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *