Собственный модификатор в PHx
Как обещал раньше, сегодня коснемся такой интересной темы ModX Evolution, как собственные модификаторы PHX. Модификатор PHx это PHP код, который применяется к входным данным плейсхолдеров, тегам документа или TV, а так же системным тегам, и совершает какие-то действия с этими данными.
В пакет PHx входит большой набор стандартных модификаторов, воспользоваться которыми можно подставив к любому из вышеперечисленных тегов название модификатора через двоеточие. Если модификатор способен принимать опции, то они указываются после названия модификатора:
[+placeholder:modifier=`options`+]
Так же в связи с рекурсивной обработкой кода модификаторы можно указывать последовательно, один за другим.
[+placeholder:modifier1:modifier2+]
Следует обратить внимание, что PHx обладает интересным свойством, на которое многие не обращают внимание, хотя оно крайне полезно. Большинство сниппетов поддерживают обработку PHx модификаторов, но некоторые не поддерживают. В таком случае мы можем указать парсеру ModX, что какой-то кусок кода надо обрабатывать именно как PHx. Делается это так:
[+phx:input=`[+placeholder+]`:modifier1:modifier2+]
или так:
[*phx:input=`[+placeholder+]`:modifier1:modifier2*]
Обратите внимание на эту особенность, несколько раз она меня серьезно выручала.
Стандартные модификаторы, код которых можно подсмотреть в файле assets/plugins/phx/phx.parser.class.inc.php после комментария ##### Conditional Modifiers, здесь перечислять не буду, все есть в документации. Если стандартных модификаторов не хватает, то можно обратиться с CustomModifiers, сборнику готовых рецептов, собранных сообществом. Но иногда бывает так, что ни один из предложенных модификторов не подходит под наши задачи и тогда нам приходится писать собственные модификаторы.
Написание собственного модификатора для PHx не такая сложная задача, как может показаться изначально. Важно знать следующие моменты:
- модификатор создается в виде сниппета, название которого должно начинаться с phx:
- внутри сниппета можно обращаться к следующим переменным:
- $input – содержит исходные вводные данные
- $output - данные над которыми проводятся операции
- $options – необязательный параметр, через который можно передать опции
- $condition – необязательный параметр, массив, содержащий условные выражения
- сниппет должен вернуть значение, обычно это return $output;
Вооружившись всей этой информацией мы можем перейти к практике. Возьмем несколько используемых мною примеров.
Вырезание фрагментов текста
Иногда есть необходимость вырезать какой-то фрагмент текста. Для этого создаем сниппет phx:datcut, в который вставляем следующий код:
<?php
$rep = array('public','local');
return str_replace($rep,'',$output);
?>
Вывод количества потомков
Для вывода количества потомков, можно воспользоваться сниппетом под названием phx:hascnt, который вставляем код, после чего применяем его к [*id:hascnt*]:
<?php
return count($modx->getChildIds($input));
?>
Проверка наличия слова
Еще один пример, проверка наличия какого-то слова или нескольких символов, при наличии которого можно совершить определенное действие. Для этого создадим сниппет phx:has со следующим кодом:
<?php
$condition[] = intval(mb_strpos($output,$options)!==false);
?>
При использовании данного модификатора обязательным условием передача входных данных:
[*pagetitle:has=`овос`:then=`Новости`*]
При определенной практике и понимании процессов создания модификаторов можно делать поистине невероятные дополнения для PHx.
Комментарии (0)