Свои модификаторы
Написание своих модификаторов в Fenom в MODx

Оглавление
В 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.
- Авторизируйтесь в свой аккаунт на search.google.com и выберите нужный сайт.
- Вставьте любой URL в поле проверки, дождитесь пока появится страница управления этим URL и нажмите кнопку «Проверить страницу на сайте» (скриншот).
- Дождитесь окончания проверки и убедитесь что напротив всех пунктов стоя зеленые голочки. Если напротив пункта «Удобство для мобильных» стоит зеленая галочка, значит файлы стилей доступны поисковым робота. (скриншот).
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,1200 s
Количество запросов: 24
Источник: cache