Registrace vlastného makra

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

Dá se nějakým jednoduchým a lazy způsobem zaregistrovat vlastní makro?
Narazil jsem pouze na několik slepých uliček:

Zkoušel jsem akci navázat na createTemplate() v presenteru, ale to ještě není vytvořen CB na Latte filtr.

Pokud podědím metodu createTemplateFilters, tak to taky nejde, protože Latte filtr sice už je v události onPrepareFilters třídy Template, ale jen jako callback, takže ho nemůžu vytvořenému makru předat.

Jediný způsob by asi byl podědit metodu getTemplate(), ale to zas není příliš čísté.
Navíc je k parseru krkolomný přístup přes $template->filters[0]->parser (navíc by mohl být jiný index pole).

Jan Tvrdík
Nette guru | 2595
+
0
-
semtex.989
Člen | 75
+
0
-

Tak tu kuchařku jsem nenašel.
Stejně je to ale docela blbě, když ta třída nevolá rodiče (aby se Latte neregistrovalo 2x).
Ale jiný způsob jak se dostat k instanci Latte parseru mě nenapadá.

Když v basePresenteru budu chtít registrovat jedno makro a v jeho potomkovi zase další jiné makro, tak budu muset kopírovat i kód všech rodičů a DRY je v háji..

Jan Tvrdík
Nette guru | 2595
+
0
-

Tak si nad tím napiš nějakou abstrakci, ne?

public function templatePrepareFilters(Nette\Templating\Template $tpl)
{
	$latte = new Nette\Latte\Engine;
	$this->setupLatte($latte);
	$tpl->registerFilter($latte)
}

protected function setupLatte(Nette\Latte\Engine $latte)
{
	$set = Nette\Latte\Macros\MacroSet::install($latte->parser);
	$set->addMacro('@src', 'echo \'src="\' . $template->dataStream(%node.word) . \'"\' ');
}
semtex.989
Člen | 75
+
0
-

Leda tak. Sice to bez náhrady přepisuje rodiče, ale není to tak krkolomné.
Na příští Sobotě máš u mně kofolu :)