Latte: DefaultMacros splitted into Nette\Latte\Macros\MacroSet, CoreMacros, UIMacros and CacheMacro

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

Jak a kde se tedy teď mají správně registrovat vlastní makra?

jtousek
Člen | 951
+
0
-

Počkej na dokumentaci 1. 6. 2011. V ní to snad bude.

Mikulas Dite
Člen | 756
+
0
-

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.

knyttl
Člen | 196
+
0
-

Mikulas Dite napsal(a):

Je instanční, takže se z něj dá udělat service a předávat dál.

Metodu addMacro jsem sice našel, ale spíš bojuju s tím, jak získat přístup k tomu objektu, nad kterým ji volat.

David Grudl
Nette Core | 8227
+
0
-

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

A jak pak dostanu Engine do komponenty a presenteru? narážím na https://github.com/…tte/pull/263

Filip Procházka
Moderator | 4668
+
0
-

Patriku, já to vyřešil takto: https://github.com/…6ce1c2695f5c

Patrik Votoček
Člen | 2221
+
0
-

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

to je toho… jedna metoda.. Ale je fakt, že by tam TemplateFactory byt mohl

Yrwein
Člen | 45
+
0
-

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

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.

Filip Procházka
Moderator | 4668
+
0
-

Yrwein: něco takového? https://github.com/…b16a381f308c :)

Patrik Votoček
Člen | 2221
+
0
-

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

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

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)

voda
Člen | 561
+
0
-

knyttl napsal(a):

A následné předání šabloně je potom nejsnazší jak? Ď.

$template->registerFilter($latte);
uestla
Backer | 799
+
0
-

S tím, že pokud bych chtěl filtr s vlastními makry zaregistrovat v BasePresenteru, přepíši si metodu templatePrepareFilters() a nezavolám předka, není-liž pravda?