PHx
GitHub
Перейти

PHx (Placeholders Xtended) добавляет новые возможности для отображения плейсхолдеров, тегов MODx (включая TV параметры) и теги настроек сайта. Рекурсивный парсер позволяет использовать вложенные теги. Возможно создавать свои модификаторы, путем создания сниппетов.

Скачать последнюю версию PHx из репозитория MODX можно по этой ссылке.

Установка

Новая установка

  1. Скачайте и распакуйте архив.
  2. Создайте директорию "phx" в папке /assets/plugins.
  3. Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
  4. Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
  5. Отметьте событие "OnParseDocument" на вкладке "Системные события"

Обновление

  1. Скачайте и распакуйте архив.
  2. Переименуйте директорию /assets/plugins/phx в /assets/plugins/phx-old
  3. Создайте директорию "phx" в папке /assets/plugins.
  4. Закачайте через FTP или просто скопируйте содержимое архива в /assets/plugins/phx
  5. Создайте новый плагин "PHx" в Панели управления MODx (Элементы-Управление элементами-Плагины) и скопируйте в него содержимое файла phx.plugin.txt
  6. Отметьте событие "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

Breaks words in the current value longer than the given length of characters by putting a space in between.
По умолчанию: 70 символов.
wordwrap(=`length`)
length - символы

limit

Возвратит первые X символов от текущего значения.
По умолчанию: 100 символов.
limit(=`length`)

Специальные

date

Преобразует метку времени unix timestamps в соответствии с заданным форматом.

date(=`dateformat`)
dateformat: В соответствии с форматом PHP-функции strftime

Пример:

[*createdon:date=`%d.%m.%Y`*]

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

setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');

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

alias: eq
равно (==)

ne

alias: isnot, isnt
не равно (!=)

eg

alias: isgt
больше или равно (>=)

el

alias: islt
меньше или равно (<=)

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 имеет значение 2  
someplaceholder имеет значение 3  
otherplaceholder имеет значение 1
[+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.

Поделитесь ссылкой

Статистика

Яндекс цитирования
© 2011 - 2023 Школа MODX
Напишите нам в Telegram