Дата публикации
14 Августа 2019
Дата изменения
5 Июля 2020
Уникальных просмотров
684

Оглавление

В 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'} - недель

Благодарность автору

Если по какой-либо причине вы хотите поблагодарить автора данного ресурса, вы можете это сделать одним из удобных для вас способов ниже.

Один из самых популярных способов поблагодарить автора, воспользоваться сервисом Яндекс.Деньги.

Время работы: 0,1238 s
Время запросов: 0,1238 s
Количество запросов: 35
Источник: database