Vlastní filter pro šablony nepoustí latte
- Mikulas Dite
- Člen | 756
Ahoj,
když ve startupu pouštím
$this->template->registerFilter(callback($filter, 'parse'));
tak se potom nepustí Latte. Čekal bych, že bude v Template::getFilters()
,
ale to je defaultně prázdné.
Mam latte zaregistrovat manuálně, když chci vlastní filtery?
Edit: Chtěl bych dát Latte první, ale v dalšim
zpracování Latte výstupu mi brání to, že všechno důležité se nahradí
za \x01@php:p0@\x02
. Co s tím? Získá filter někdy to, co latte
normálně ukládá do cache? To nakombinované html a php na „eval“?
To by asi úplně dobře nešlo, v tom případě bych ale potřeboval
zaregistrovat filter globálně. Register filter statická není a nevidim
žádnou možnost zaregistrovat si filtr třeba pro includeTemplate
, šablony komponenty, atd.
Editoval Mikulas Dite (30. 4. 2011 15:38)
- Mikulas Dite
- Člen | 756
Ok, vyřešil jsem to tak, že Latte registruju manuálně:
public function templatePrepareFilters($template)
{
$template->registerFilter(new CustomFilter);
$template->registerFilter(new Nette\Latte\Engine);
}
Ale pořád mi není jasné, proč po zavolání registerFilter
latte nenaskočilo samo…
- Martin
- Člen | 171
Nette\Templates\Template
public function compile($content)
{
if (!$this->filters) {//To bude ono, ne?
$this->onPrepareFilters($this);
}
...
}
Nette\Application\Control
protected function createTemplate()
{
...
$template->onPrepareFilters[] = callback($this, 'templatePrepareFilters');
...
}
Latte filter se tedy registruje v templatePrepareFilters() třídy Control pouze v případě, že není v tu chvíli zaregistrován jiný filtr (a pokud je smazaná cache, jinak se createTemplate() nevolá, ale to tu samozřejmě neřešíš). Pokud bys to volal později než v startupu, Latte filtr by tam byl.
Takže správně je:
abstract class BasePresenter extends Nette\Application\Presenter
{
public function templatePrepareFilters($template) {
parent::templatePrepareFilters($template);
$template->registerFilter(new CustomFilter);
}
}
Ovšem chceš-li opačné pořadí, tak samozřejmě tak, jak to máš Ty, pouhé prohození pořadí by nefungovalo z výše uvedených důvodů.
Editoval Martin (1. 5. 2011 21:24)