Оглавление

В 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;
}

Применение модификатора dateformat:

{$_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;
}

Применение модификатора website:

<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;
}

Применение модификатора version:

<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>

Т.к. вывод версии файла происходит через знак вопроса — 'style.css?v=2332323232', очень важно не перекрыть доступ поисковикам индексацию таких файлов. Если вы пропишите эти строчки в файле robots.txt:

Disallow: *?
Disallow: /*?cat=

То поисковые роботы не будут иметь доступ к таким файлам (например к файлам стилей и скриптов). Для них сайт будет не оптимизирован под мобильные устройства, это может плохо сказаться в поисковой выдаче. Самый простой способ проверить, не закрыли ли вы доступ поисковым роботам, воспользоваться инструментом search.google.com.

  1. Авторизируйтесь в свой аккаунт на search.google.com и выберите нужный сайт.
  2. Вставьте любой URL в поле проверки, дождитесь пока появится страница управления этим URL и нажмите кнопку «Проверить страницу на сайте» (скриншот).
  3. Дождитесь окончания проверки и убедитесь что напротив всех пунктов стоя зеленые голочки. Если напротив пункта «Удобство для мобильных» стоит зеленая галочка, значит файлы стилей доступны поисковым робота. (скриншот).

years

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

/** @var modX $modx */
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('years', function ($input) {
            $year = date('Y');
            if ($year == $input || $year < $input) {
                return $year;
            } else {
                return '' . $input . ' – ' . $year . '';
            }
        });
        break;
}

Применение модификатора years:

Первым значением нужно указать начало работы сайта или вашей фирмы.

{2004 | years}

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;
}

Применение модификатора ignore:

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

timeLeftCounter

Модификатор подсчитывает кол-во секунд, минут, часов, дней или недель (в зависимости от выставленного параметра) между двумя датами. Преобразует текстовую версию даты в метку времени UNIX и производит подсчет.

switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
        $fenom->addModifier('timeLeftCounter', function ($input, $opt = 1) {
            $inputDate = strtotime($input);
            $remaining = $inputDate - time();

            $string = array('minutes', 'hours', 'days', 'weeks');
            $int = array(60, 60, 24, 7);
            if ($opt == 'seconds' || !(in_array($opt, $string))) return floor($remaining);

            for ($i = 0; $i < count($string); $i++) {
                $remaining = $remaining / $int[$i];
                if ($opt == $string[$i]) return floor($remaining);
            }
            return $input;
        });
        break;
}

Применение модификатора timeLeftCounter:

До конца публикации ресурса осталось {$_modx->resource.unpub_date | timeLeftCounter: 'days'} - дней
До конца даты что указана в TV осталось {$_modx->resource['some-date-tv'] | timeLeftCounter: 'weeks'} - недель