- 44457
- Август 2014
PHx (Placeholders Xtended) добавляет новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Рекурсивный парсер позволяет использовать вложенные теги. Возможно создавать свои модификаторы, путем создания сниппетов.
Скачать последнюю версию PHx из репозитория MODX можно по этой ссылке.
Новая установка
- Скачайте и распакуйте архив.
- Создайте директорию "phx" в папке /assets/plugins.
- Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
- Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
- Отметьте событие "OnParseDocument" на вкладке "Системные события"
Обновление
- Скачайте и распакуйте архив.
- Переименуйте директорию /assets/plugins/phx в /assets/plugins/phx-old
- Создайте директорию "phx" в папке /assets/plugins.
- Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
- Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
- Отметьте событие "OnParseDocument" на вкладке "Системные события"
Конфигурация
На вкладке конфигурация, во время редактирования плагина скопируйте в поле "Конфигурация плагина":
&phxdebug=Лог событий;int;0 &phxmaxpass=Макс. число проходов;int;50
Для опытных пользователей
Вы можете изменить настройки по умолчанию для плагина PHx:
Лог событий
0 = Отключен
1 = Включено логирование событий PHx
Если включено PHx создает подробный лог на каждое событие, записанное в протоколе событий ( Отчеты->Просмотр событий)
Макс. число проходов
Определяет максимально обрабатываемую глубину вложенных тегов. Рекомендуется оставить значение 50.
PHx (Placeholders Xtended) расширяет возможности использования плейсхолдеров, тегов содержимого (включая TV параметры) и тегов настройки сайта. Благодаря этому вы можете с легкостью определять формат вывода конечного результата. PHx встраивается в парсер MODX, расширяя его функционал модификаторами, условиями и в качестве бонуса делает его по-настоящему рекурсивным.
Поддерживаемые теги
PHx поддерживает следующие теги MODx:
[+placeholder+]
[*теги содержимого*]
(например: [*content*], [*pagetitle*] и другие)[*TV параметры*]
[(теги настройки)]
(например: [(base_url)], [(site_name)] и другие)
Сниппеты, поддерживающие PHx
- Ditto
- Jot
- MaxiGallery
Вы можете использовать PHx синтаксис в чанках, используемых сниппетами не из этого списка, но для этого требуется другой метод (см. раздел Tips & Tricks)
Обычный плейсхолдер вида
[+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+]
На входе:
This is a string
Вернет:
THIS IS A STRING
ucfirst
Первая буква в строке станет заглавной.
Пример:
[+string:ucfirst+]
На входе:
иванов
Вернет:
Иванов
length | len
Возвратит длину строки.
Пример:
[+string:len+]
На входе:
this is a string
Вернет:
16
notags
Вырежет все HTML теги из строки.
Пример:
[+string:notags+]
На входе:
this <b>is</b> a <i>string</i>
Вернет:
this is a string
esc
Удаляет html теги и разрывы строк
htmlent
Конвертирует исходную переменную в html сущности. Аналог htmlentities() в PHP.
nl2br
Конвертирует символы перевода строки в теги.
Пример:
[+string:nl2br+]
На входе:
this is
a string
Вернет:
this is <br />a string
strip
Удалит символы новой строки(\n), табуляторы(\t), идущие подряд пробелы.
Пример:
[+string:strip+]
На входе:
this is
a
string
Вернет:
this is a string
Другие модификаторы
reverse
Перевернет задом наоборот буквы.
wordwrap
wordwrap(=`length`)
limit
Специальные
date
Преобразует метку времени unix timestamps в соответствии с заданным форматом.
Пример:
Для того, чтобы дата выводилась в соответствии с текущим языком сайта, необходимо установить локаль в начале кода плагина PHx. Пример ниже для немецкого языка :
md5
Создает MD5-хэш текущего значения.
userinfo
Поля, используемые в базе данных MODx из таблицы user_attributes (например: username, useremail).
userinfo=`field`
- 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
Использовать вычисления, такие, как - * + /.
math=`calculation`
"?" символ заменяется текущим значением расширения, но вы также можете использовать вложенные теги.
Пример расчета: ?+1+(2+3)+4/5*6
ifempty
Использовать "other value" если значение placeholder/templatevar пустое.
ifempty=`other value`
select
Принимает значение, в зависимости от значений placeholder/templatevar.
select=`options`
параметры: value1=output1&value2=output2
Пример:
На входе: 1
[+placeholder:select=`0=OFF&1=ON&2=UNKNOWN`+]
Вернет: ON
Условные выражения
is
ne
eg
el
gt
больше (>)
lt
меньше (<)
mo=`Webgroups`
синонимы(алиасы): isinrole, ir, memberof
Принимает в качестве параметра разделенный запятыми список веб-групп и возвращает значение true/false в зависимости от того, принадлежит текущий пользователь к какой-либо из этих групп или нет (заменяет собой модификатор "inrole", который необходимо было сочетать с условным оператором).
Пример:
[+phx:mo=`myWebgroup`:then=`I'm a member`:else=`I'm NOT a member`+]
if =`value`
Принимает в качестве параметра переменную для сравнения. Также может быть использовано в сочетании с :or или :and.
Пример:
[+phx:if=`[+price+]`:gt=`0`:then=`Цена: [+price+]`+]
or
Логическое ИЛИ (проверяется, верно ли первое или второе условие).
[+phx:if=`[*id*]`:is=`2`:or:is=`3`:then=`{{Chunk}}`:else=`{{OtherChunk}}`+]
В данном примере если текущий ID равен 2 или 3, то выводится чанк {{Chunk}}, иначе выводится чанк {{OtherChunk}}.
and
Логическое И (проверяется, верны ли оба условия).
[+phx:if=`[!UltimateParent!]`:is=`1`:and:isnot=`[*id*]`:then=`{{ChildChunk}}`:else=`{{ParentChunk}}`+]
В данном примере если UltimateParent равен 1 и при этом не равен текущему ID, то выводится чанк {{ChildChunk}}, иначе выводится чанк { {ParentChunk}}.
then =`template`
Значение template отображается, когда все условия верны. Здесь можно указать вызов {{чанка}}, [[сниппета]] или же чистый HTML.
else =`template`
Значение template отображается, когда условия не верны. Здесь можно указать вызов {{чанка}}, [[сниппета]] или же чистый HTML.
show
Используется подобно then, но в качестве шаблона для вывода используется исходное значение. Выполняется, если условия верны.
[+myplaceholder:len:gt=`3`:show+]
В данном примере значение плейсхолдера будет выведено, если его длина составляет более 3 символов.
Пользовательские модификаторы
Модификатор представляет собой простой сниппет, который обрабатывает заданное значение. Существует возможность создавать свои собственные модификаторы/мини-сниппеты, добавив новый сниппет в менеджере ресурсов MODx или же создав файл в папке модификаторов плагина PHx.
Поскольку код модификатора несложен, то ему не нужны никакие параметры, за исключением тех, которые он получает от парсера.
Существуют две основные переменные:
$output - содержит текущее значение переменной, которую необходимо модифицировать.
$options - необязательный параметр, значение которого передается в модификатор.
Пример.
Приведем пару примеров использования модификаторов. Допустим, что плейсхолдер myplaceholder имеет значение "test":
[+myplaceholder:mymodifier+]
Переменная $output содержит значение "test".
Переменная $options не содержит ничего, т.к. модификатору не был передан параметр.
[+myplaceholder:mymodifier=`my options`+]
Переменная $output все еще содержит значение "test".
Переменная $options теперь содержит значение "my options"
Прочие переменные (для продвинутых пользователей)
$input - содержит исходное немодифицированное значение.
$condition - массив, содержащий элементы, образующие условное выражение (0, 1, || и &&).
Создание собственного модификатора
Пример 1: I love MODx
Используя полученные знания, создадим новый пользовательский модификатор. Это будет модификатор без параметра, который просто добавит текст " because I love MODx" к переменной. Для этого необходимо проделать следующие шаги:
1. В Менеджере ресурсов надо зайти в Ресурсы(Элементы) -> Управление ресурсами (элементами) -> Сниппеты
2. Нажать "Новый сниппет"
3. В качестве имени сниппета задать "phx:love"
Для того, чтобы сниппет воспринимался как модификатор для PHx, его название должно иметь префикс "phx:" без пробелов между ним и собственно именем сниппета. Тогда можно будет его использовать как модификатор, добавив :love к любому плейсхолдеру, например: [+myplaceholder:love+].
4. Теперь добавим код модификатора в поле для кода. Допустим, это будет код следующего вида:
<?php $newvalue = $output. " because I love MODx"; return $newvalue; ?>
5. Сохраним изменения и наш новый модификатор (:love) готов к использованию!
Пример 2: I love MODx even more
Создадим модификатор, подобный модификатору :love из предыдущего примера, но дополнительно дадим ему возможность добавлять к исходной строке значение переданного параметра, если оно было указано.
1. В Менеджере ресурсов надо зайти в Ресурсы(Элементы) -> Управление ресурсами (элементами) -> Сниппеты
2. Нажать "Новый сниппет"
3. В качестве имени сниппета задать "phx:love2"
Для того, чтобы сниппет воспринимался как модификатор для PHx, его название должно иметь префикс "phx:" без пробелов между ним и собственно именем сниппета. Тогда можно будет его использовать как модификатор, добавив :love к любому плейсхолдеру, например:
[+myplaceholder:love2+]
.
4. Теперь добавим код модификатора в поле для кода. Допустим, это будет код следующего вида:
<?php return $output . (strlen($options)>0 ? $options : ' because I do love MODx'); ?>
5. Сохраним изменения и наш новый модификатор (:love2) готов к использованию!
Пример 1
Допустим. что myplaceholder имеет значение myvalue.
[+myplaceholder:is=`myvalue`:then=`Правильно`:else=`Неправильно`+]
Вызов вернет: Правильно
[+myplaceholder:isnot=`myvalue`:then=`Правильно`:else=`Неправильно`+]
[+myplaceholder:is=`othervalue`:then=`Правильно`:else=`Неправильно`+]
Оба примера вернут: Неправильно
Пример 2
Исходные данные:
[+myplaceholder:is=`2`:then=`{{ChunkGood}}`:else=`{{ChunkBad}}`+]
Результатом выполнения примера станет вызов чанка с именем ChunkGood.
Прочие примеры
[+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`+]
Все примеры вернут Yes.
[+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`+]
Все примеры вернут No.