Я хотел бы создать свой собственный фильтр для Латте шаблонизатор. В их документации есть пример, но он не описывает, как его зарегистрировать в докладчике.
<?php
$latte = new Latte\Engine;
$latte->addFilter('myFilter', function ($s) {
return someMagic($s)
});
?>
Бьюсь об заклад, будет простой способ получить экземпляр Latte \ Engine внутри докладчика, но я не уверен, как.
Фильтры могут быть зарегистрированы через config.neon
тоже.
services:
nette.latteFactory:
setup:
- addFilter(abs, @App\Latte\AbsFilter)
- App\Latte\AbsFilter
Класс фильтра может выглядеть так:
namespace App\Latte;
class AbsFilter extends \Nette\Object
{
/**
* @param int $number
* @return int
*/
public function __invoke($number)
{
return abs($number);
}
}
В докладчике есть экземпляр Latte\Engine
доступно в $this->template
так что все, что вам нужно сделать, это зарегистрировать фильтр следующим образом:
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
public function beforeRender()
{
// register filters
$this->template->addFilter('myFilter', function ($s) {
// don't forget to set your own magic
return someMagic($s);
});
}
}
?>
Я привожу пример, используя BasePresenter
который является родителем всех остальных докладчиков, но вы можете зарегистрировать его только в желающем докладчике и ускорить работу приложения.
В дополнение к ответу @Nortys.
Иногда полезно ввести некоторые данные из Presenter в анонимную функцию:
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
public function beforeRender()
{
$locale = 'en';
// register filters
$this->template->addFilter('myFilter', function ($s) use ($locale) {
// don't forget to set your own magic
return someMagic($s, $locale);
});
}
}
?>