Блог/Собственный модификатор

Собственный модификатор в 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)