Vlastní filter pro šablony nepoustí latte

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mikulas Dite
Člen | 756
+
0
-

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
+
0
-

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
+
0
-

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)

Mikulas Dite
Člen | 756
+
0
-

Paráda, díky moc.