Latte: DefaultMacros splitted into Nette\Latte\Macros\MacroSet, CoreMacros, UIMacros and CacheMacro
- Mikulas Dite
- Člen | 756
Registrují se metodou addMacro
nad parserem: https://github.com/…3d2eade01319#…,
kdekoliv před samotným renderem a tam, kde je k parseru přístup. Je
instanční, takže se z něj dá udělat service a předávat dál.
- David Grudl
- Nette Core | 8227
Nejsnadněji asi takto:
$latte = new Nette\Latte\Engine;
$macroSet = new Nette\Latte\Macros\MacroSet($latte->parser);
$macroSet->addMacro(
'input', // makro
'echo $form[%node.word]->getControl()->addAttributes(%node.array)' // kod
);
$macroSet->addMacro('for', 'for (%node.args):', 'endfor');
- Patrik Votoček
- Člen | 2221
A jak pak dostanu Engine do komponenty a presenteru? narážím na https://github.com/…tte/pull/263
- Patrik Votoček
- Člen | 2221
Něco takového jsem pulloval dávno… https://github.com/…tte/pull/199 Nicméně nelíbí se mi že musím upravovat svůj base control i base presenter!
- Filip Procházka
- Moderator | 4668
to je toho… jedna metoda.. Ale je fakt, že by tam TemplateFactory byt mohl
- Yrwein
- Člen | 45
TemplateFactory/service +1. :) Teď vážně: Užitečné by to bylo zvláště tehdy, potřebuje-li člověk jinou defaultní FileTemplate a ještě ji nějak nastavit (což se nyní dá řešit jen přes přepsání metody createTemplate). Případně by createTemplate mohla místo parametru class brát rovnou instanci.
- knyttl
- Člen | 196
Patrik Votoček napsal(a):
Něco takového jsem pulloval dávno… https://github.com/…tte/pull/199 Nicméně nelíbí se mi že musím upravovat svůj base control i base presenter!
Přesně, to se ale týká nejen nejen té modifikace, ale i dvojnásobné registrace maker pro controls i presenters.
- Patrik Votoček
- Člen | 2221
knyttl napsal(a):
Přesně, to se ale týká nejen nejen té modifikace, ale i dvojnásobné registrace maker pro controls i presenters.
Možná jsem to blbě napsal ale ta moje modifikace tím netrpí trpí tím stávající implementace v Nette.
- David Grudl
- Nette Core | 8227
Tahle věc je trošku složitější.
1) šablona ani její Latte není service.
Nepotřebujeme mít v aplikaci jednu instanci šablony. Jako závislost má proto smysl předávat nikoliv šablonu, ale její továrnu. Takže
public static function createServiceTemplateFactory(DI\Container $container)
{
return function() use ($container) {
$template = new Nette\Templating\FileTemplate;
$template->onPrepareFilters[] = function($template) use ($container) {
$template->registerFilter($container->latteFactory->__invoke());
};
$template->registerHelperLoader('Nette\Templating\DefaultHelpers::loader');
$template->setCacheStorage($container->templateCacheStorage);
};
}
2) Controls nemohou být závislé na cizí šabloně
Představte si, že distribuujete komponentu, která se vykresluje – ona ví nejlíp, jaká makra používá, kde má uloženou šablonu atd. Není možné ji učinit závislou na nějaké naší globální továrničce na šablony. Jedinou závislost, kterou ji předáme, je cacheStorage.
- knyttl
- Člen | 196
David Grudl napsal(a):
Nejsnadněji asi takto:
$latte = new Nette\Latte\Engine; $macroSet = new Nette\Latte\Macros\MacroSet($latte->parser); $macroSet->addMacro( 'input', // makro 'echo $form[%node.word]->getControl()->addAttributes(%node.array)' // kod ); $macroSet->addMacro('for', 'for (%node.args):', 'endfor');
A následné předání šabloně je potom nejsnazší jak? Ď.
Editoval knyttl (11. 6. 2011 23:15)