PHx
- Дополнения
- PHx
PHx
PHx (Placeholders Xtended) добавляет новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Рекурсивный парсер позволяет использовать вложенные теги. Возможно создавать свои модификаторы, путем создания сниппетов.
PHx поддерживает следующие теги MODx:
[+placeholder+] [*теги содержимого*] ([*content*], [*pagetitle*], например) [*TV параметры*] [(теги настройки)] (например, [(base_url)], [(site_name)] и другие)
Использование
Обычный плейсхолдер вида [+placeholder+]
легко превращается в плейсхолдер PHx: [+placeholder:esc+]
. Тоже самое вы можете сделать с тегом содержимого:
[*createdby*]
Добавляем модификатор:
[*createdby:date=`%a %B %d, %Y at %H:%M`*]
Также можно использовать несколько модификаторов сразу. Они будут обработаны слева направо:
somevar:esc:nl2br:strip
Расширенное применение
Наличие специального плейсхолдера "phx" позволяет использовать синтаксис PHx без наличия реальной переменной.
[+phx:if=`[+this+]`:is=`[+that+]`:then=`do this`:else=`do that`+]
С некоторыми модифиакторами этот плейсхолдер приобретает определенное значение. В случае с модификатором "userinfo" он возвращает соответствующее значение из информации о текущем пользователе:
[+phx:userinfo=`username`+]
Синтаксис
Хотя это и кажется логичным, но на этом стоит заострить внимание. Избегайте использования следующих конструкций в шаблоне, если они не являются частью тега MODx:
[+ [* [( +] *] )] ]]
Парсер попытается их обработать и MODx выдаст ошибку. Обычно такой проблемы не возникает. Но в случае с JavaScript у вас может быть конструкция, похожая на эту:
array[counter++]
которая спровоцирует странное поведени из-за +].
Также закрывающий тег CDATA может создать проблемы.
/* ]]> */
Помните, что вы не сможете потерять данные вашего сайта, используя неправильный синтаксис PHx. Худшее, что может случится - ваш шаблон неправильно отобразится.
Модификаторы
lcase
- Возвращает строку, приведенную к нижнему регистру.
[+string:lcase+]
ucase
- Приведет все символы строки к верхнему регистру.
[+string:ucase+]
ucfirst
- Первая буква в строке станет заглавной.
[+ucfirst:lcase+]
ellipsis
- Обрежет строку.
[+description:ellipsis=`150`]
length | len
- Возвратит длину строки.
[+string:len+]
notags
- Вырежет все HTML теги из строки.
[+string:notags+]
esc
- Удаляет html теги и разрывы строк
[+string:esc+]
htmlent
- Конвертирует исходную переменную в html сущности. Аналог htmlentities() в PHP.
[+string:htmlent+]
nl2br
- Конвертирует символы перевода строки в теги.
[+string:nl2br+]
strip
- Удалит символы новой строки(\n), табуляторы(\t), идущие подряд пробелы.
[+string:strip+]
reverse
- Перевернет задом наоборот буквы.
[+string:reverse+]
wordwrap
- Устанавливает переносы в зависимости от кол-ва символов слова, аналогично функции php (По умолчанию: 70).
[*pagetitle:wordwrap=`10`*]
limit
- Возвратит первые X символов от текущего значения (По умолчанию: 100).
[*pagetitle:limit=`50`*]
date
- Преобразует метку времени unix timestamps в соответствии с заданным форматом.
[*createdon:date=`%d.%m.%Y`*]
md5
- Создает MD5-хэш текущего значения.
[*pagetitle:md5*]
userinfo
- Возвращает запрошенные модификаторов данные о пользователе.
[+phx:userinfo=`username`+]
- cachepwd : Cache password
- comment : Comment
- country : Страна
- dob : Дата рождения в формате времени UNIX
- email : Email
- fax : Факс
- fullname : Полное имя
- gender : Пол
- internalKey : User internal key
- lastlogin : Last login, in UNIX time format
- logincount : Number of logins
- mobilephone : Мобильный телефон
- password : Пароль
- phone : Телефон
- photo : Фотография
- role : Роль
- state : Статус
- thislogin : This login, in UNIX time format
- username : Логин
- zip : Почтовый индекс
math
- Использовать вычисления, такие, как - * + /.
"?" символ заменяется текущим значением расширения, но вы также можете использовать вложенные теги.
[+price:math=`?*[+curs+]`+]
ifempty
- Использовать "другое значение" если значение placeholder или templatevar пустое.
[*longtitle:ifempty=`[*pagetitle*]`*]
select
- Принимает значение, в зависимости от значений placeholder или templatevar.
[+placeholder:select=`0=OFF&1=ON&2=UNKNOWN`+]
Условные выражения
is - равно (==)
- алиасы: eq
ne - не равно (!=)
- алиасы: isnot, isnt
eg - больше или равно (>=)
- алиасы: isgt
el - меньше или равно (<=)
- алиасы: islt
gt - больше (>)
lt - меньше (<)
mo=`Webgroups`
- алиасы: isinrole, ir, memberof
Принимает в качестве параметра разделенный запятыми список веб-групп и возвращает значение true/false в зависимости от того, принадлежит текущий пользователь к какой-либо из этих групп или нет (заменяет собой модификатор "inrole", который необходимо было сочетать с условным оператором).
[+phx:mo=`Администраторы`:then=`Я админ`:else=`Я простой смертный`+]
if=`value`
- Принимает в качестве параметра переменную для сравнения. Также может быть использовано в сочетании с :or
или :and
.
[+phx:if=`[+price+]`:gt=`0`:then=`Цена: [+price+]`+]
or
- Логическое ИЛИ (проверяется, верно ли первое или второе условие).
[+phx:if=`[*id*]`:is=`2`:or:is=`3`:then=`{{Chunk}}`:else=`{{OtherChunk}}`+]
and
- Логическое И (проверяется, верны ли оба условия).
[+phx:if=`[!UltimateParent!]`:is=`1`:and:isnot=`[*id*]`:then=`{{ChildChunk}}`:else=`{{ParentChunk}}`+]
then =`template`
- Значение template отображается, когда все условия верны. Здесь можно указать вызов {{чанка}}
, [[сниппета]]
или же чистый HTML.
else =`template`
- Значение template отображается, когда все условия не верны. Здесь можно указать вызов {{чанка}}
, [[сниппета]]
или же чистый HTML.
show
- Используется подобно then, но в качестве шаблона для вывода используется исходное значение. Выполняется, если условия верны.
[+myplaceholder:len:gt=`3`:show+]
Примеры
[+myplaceholder:is=`myvalue`:then=`Правильно`:else=`Неправильно`+]
[+myplaceholder:isnot=`myvalue`:then=`Правильно`:else=`Неправильно`+] [+myplaceholder:is=`othervalue`:then=`Правильно`:else=`Неправильно`+]
[+myplaceholder:is=`2`:then=``:else=``+]
[+myplaceholder:gt=`1`:then=`Yes`:else=`No`+] [+myplaceholder:lt=`3`:and:gt=`1`:then=`Yes`:else=`No`+] [+myplaceholder:lt=`[+someplaceholder+]`:then=`Yes`:else=`No`+] [+myplaceholder:islt=`2`:then=`Yes`:else=`No`+] [+myplaceholder:isnot=`2`:or:lt=`3`:then=`Yes`:else=`No`+]
[+myplaceholder:isnot=`2`:then=`Yes`:else=`No`+] [+myplaceholder:gt=`[+someplaceholder+]`:then=`Yes`:else=`No`+] [+myplaceholder:lt=`2`:then=`Yes`:else=`No`+] [+myplaceholder:gt=`2`:then=`Yes`:else=`No`+] [+myplaceholder:lt=`1`:then=`Yes`:else=`No`+]