Собственные модификаторы Fenom
Продолжаю разработку новой версии modstore.pro и хочу поделиться простым способом подключения своих модификаторов.
Обычный способ все знают: нужно создать сниппет, который будет принимать переменные $input и $options и вызвать его в чанке вот так:
Создаём плагин для события pdoToolsOnFenomInit, и пишем в нём:

Таким образом ссылка на страницу дополнения становится гораздо аккуратнее.
Если вы разрабатываете свой пакет, которому нужны собственные модификаторы, то лучше не захламлять плагин и вызывать метод из основного класса:
Кстати говоря, таким образом можно включить еще много чего — смотрите документацию Fenom. За добавление события pdoToolsOnFenomInit благодарим Володю Володина.
Обычный способ все знают: нужно создать сниппет, который будет принимать переменные $input и $options и вызвать его в чанке вот так:
{$variable | snippet}Но- Сниппеты бывают совсем небольшие и создавать их на каждый чих не хочется
- Вызов сниппета, это всё-таки дополнительная нагрузка
- Лично я уже полностью перешел на файлы, и создавать запись в БД для сниппета, только ради его связи с файлом мне совсем не хочется
Создаём плагин для события pdoToolsOnFenomInit, и пишем в нём:
<?php
/** @var modX $modx */
switch ($modx->event->name) {
case 'pdoToolsOnFenomInit':
/** @var Fenom $fenom
Мы получаем переменную $fenom при его первой инициализации и можем вызывать его методы.
Например, добавим модификатор вывода имени домена сайта из произвольной ссылки.
*/
$fenom->addModifier('website', function ($input) {
if (!$url = parse_url($input)) {
return $input;
}
$output = str_replace('www.', '', $url['host']);
return strtolower($output);
});
break;
}Теперь в любом чанке можно вызывать модификатор website. Так как этот модификатор является внутренним методом Fenom и загружается один раз при его инициализации — работает он быстрее любого сниппета.<div class="site">
<span>Сайт дополнения</span>
<a href="{$package.link}" target="blank">{$package.link | website}</a>
</div>
Таким образом ссылка на страницу дополнения становится гораздо аккуратнее.
Если вы разрабатываете свой пакет, которому нужны собственные модификаторы, то лучше не захламлять плагин и вызывать метод из основного класса:
switch ($modx->event->name) {
case 'pdoToolsOnFenomInit':
$Extras = $modx->getService('Extras', 'Extras', MODX_CORE_PATH . 'components/extras/model/');
if ($Extras) {
/** @var Fenom $fenom */
$Extras->addFenomModifiers($fenom);
}
break;
}Если модификаторов много и вам они нужны в отдельных файлах — можно прописать в своём методе логику загрузки их оттуда. Это в любом случае, гораздо удобнее, чем создавать кучу сниппетов.Кстати говоря, таким образом можно включить еще много чего — смотрите документацию Fenom. За добавление события pdoToolsOnFenomInit благодарим Володю Володина.
Комментарии: 23
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Сниппет — в любом случае запись в таблице modSnippet.
Код сниппета:
В таблице ничего похожего на getRating нет…
Но это не важно. Я просто хотел обратить внимание на неточность о БД и сниппетах. Ведь сниппет не всегда модификатор, поэтому можно спокойно хранить в файлах свои сниппеты… Разве нет?
Сниппет — это объект modSnippet, он хранится в БД, наследуется от modScript и имеет массу особенностей, которых нет у php файла. Например, при запуске его код кэшируется в директорию core/cache/includes/elements/modsnippet/.
То, что pdoTools умеет динамически создавать сниппеты из файлов, не делает эти файлы сниппетами.
Давай ты теорию сначала подучишь, а потом будешь поправлять, окей?
Кстати, сниппеты кэшируются в 2 директории — core/cache/includes/elements/modsnippet/ и core/cache/scripts/elements/modsnippet/.
Почему-то конструкция предлагаемая Василием для вызова плагинов из файловой системы, в случае с модификаторами не работает.
Подозреваю, что дело в событии на которое навешивается плагин, но не уверен. Подскажите пожалуйста, как правильно подтягивать код модификаторов из файлов
В примере ниже модификатор mTest работает.
А использование модификатора ch1Count или ch2Count прерывает парсинг, и оставшаяся часть страницы не выводится.
В логах вебсервера тишина.
В то же время, всё работает, если использовать в качестве модификатора сниппет, например chCount
Может реализация для знающих понятна, но могли бы Вы по полочкам расписать реализацию для самых новичков.
Например, у меня есть снипет «lcfirst»:
Я вызвать его в чанке вот так:
Как переделать, где и какие создавать файлы и тд.? В общем прошу все подробнее расписать на моем примере.
Заранее, благодарю!
2. Отмечаете событие «pdoToolsOnFenomInit» на второй вкладке.
3. Сохраняете.
4. Пользуетесь.
php 7.2 fpm nginx
то и вызов должен быть как {$input | toflat:'key'} иначе если вызвать {$var1 | toflat} то получим ошибку выше.
Как правильно??
а то конструкция