Оглавление

В MODx, свои модификаторы можно создавать двумя способами. С помощью сниппетов и плагина.

Создание модификаторов через сниппет

Сниппет-фильтр должен принимать 2 параметра: обязательны $input и необязательный $options. Возвращать он может только строки.

<?php
if (empty($options)) {
    $options = 10;
}
$rand = md5(rand());

return $input . ' ' . substr($rand, 0, $options);

В качестве примера давайте создадим сниппет randomize, который будет брать полученную строку и прибавлять к ней случайный набор символов. В параметре мы можем передать количество добавляемых символов:

Теперь можно смело использовать новый модификатор как в Fenom, так и в MODx парсере:

/* modParser */
[[!*pagetitle:randomize=`5`]]

/* pdoParser */
{'any text' | randomize : 5}

Создание модификаторов через плагин

Куда более приятным и удобным способом создания модификаторов, является система событий в MODx. Начиная с версии 2.6.0, для добавления модификаторов можно использовать системное событие pdoToolsOnFenomInit. Такие модификаторы являются внутренними методами Fenom и загружаются один раз при его инициализации — посему, работают они быстрее любого сниппета.

К тому же, если вам необходимо написать 10 своих модификаторов, вам не придется создавать 10 плагинов (как в случае со сниппетами), все модификаторы можно описать в одном плагине.

dateformat

dateformat — модификатор вывода месяца на русском языке, с правильным склонением.

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':

        /** @var Fenom $fenom **/
        $fenom->addModifier('dateformat', function ($date, $format) {
            if (!is_numeric($date)) {
                $date = strtotime($date);
            }
            if (!$date) {
                $date = time();
            }
            $month_arr = array(
                '01' => 'Января',
                '02' => 'Февраля',
                '03' => 'Марта',
                '04' => 'Апреля',
                '05' => 'Мая',
                '06' => 'Июня',
                '07' => 'Июля',
                '08' => 'Августа',
                '09' => 'Сентября',
                '10' => 'Октября',
                '11' => 'Ноября',
                '12' => 'Декабря'
            );
            $month = strftime("%m", $date);
            $month = $month_arr[$month];
            $output = str_replace("%month", $month, strftime($format, $date));
            return $output;
        });
        break;
}

Применение:

{$_modx->resource.publishedon | dateformat : '%d %%month %Y'}        = 1 Января 2019
{$_modx->resource.publishedon | dateformat : '%A, %e %%month %Y'}    = Пятница, 1 Января 2018
{$_modx->resource.publishedon | dateformat : '%e %%month %Y, в %R'}  = 1 Января 2018, в 08:00

website

website — модификатор написал Василий Наумкин. Вывод доменного имени сайта из произвольной ссылки.

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        /** @var Fenom $fenom
        Мы получаем переменную $fenom при его первой инициализации, так что можем добавить
        модификатор "website" для вывода имени домена из произвольной ссылки.
        */
        $fenom->addModifier('website', function ($input) {
            if (!$url = parse_url($input)) {
                return $input;
            }
            $output = str_replace('www.', '', $url['host']);

            return strtolower($output);
        });
        break;
}

Применение:

<a href="{$link}" target="blank">{$link | website}</a>

version

version — модификатор смены версии стилей при изменении отслеживаемых файлов.

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('version', function ($input) use ($modx) {
            $output = $input;
            $file = MODX_BASE_PATH . $input;
            // Если есть файл и время последнего изменения больше чем время изменение текущего файла
            if (file_exists($file) && filemtime($file) > $output) {
                $output = filemtime($file);
                $output = date('dmYHi', $output);
                $output = $input . '?v=' . $output;
            }
            return $output;
        });
        break;
}

Применение:

<link rel="stylesheet" href="{'assets/template/css/styles.css' | version}" type="text/css"/>
<script src="{'assets/template/js/scripts.min.js' | version}" type="text/javascript"></script>

ignore

ignore — модификатор обрамления входящей строки с {} в тэг {ignore}{/ignore}.

<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('ignore', function ($input) {
            $output = '{ignore}' . $input . '{/ignore}';
            return $output;
        });
        break;
}

Применение:

<div class="some class" data-attr='{'{"0":{"items":1,"nav":"false"},"100":{"items":2},"200":{"items":3}}' | ignore}'>