Lze překrýt defaultní makra v Nette 2.2?

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

Jde překrýt makra v Nette 2.2. Jde mi konkrétně o macro {form} mám jej poupravené. V Nette 2.1 mi fungovalo v pohodě, přidal jsem nové makro {form} a volalo se to, místo toho původního.

sKopheK
Člen | 207
+
0
-

Mě to funguje v pořádku, jen musím mazat vždycky ručně latte cache, když nějaké makro upravím. Zdá se mi, že si nové latte řeší cache samo.

Jiří Nápravník
Člen | 710
+
0
-

Tak nevím, promazáno vše

public function macroFormBegin(MacroNode $node, PhpWriter $writer)
{
		return $writer->write('$form = $__form = $_form = (is_object(%node.word) ? %node.word : $_control->getComponent(%node.word)); Nette\Latte\Macros\FormMacros::renderFormBegin($__form, %node.array);');
}

public function macroFormEnd(MacroNode $node, PhpWriter $writer)
{

	return $writer->write('Nette\Latte\Macros\FormMacros::renderFormEnd($__form)');
}

a vygenerováno stejně:

Nette\Bridges\FormsLatte\FormMacros::renderFormBegin($form = $_form = $_control["form"], array()) ?>

v 2.1 mi to jelo v pohodě, je to to samé, jen přejmenované ty třídy, resp. namespaces

sKopheK
Člen | 207
+
0
-

A vleze ti to vůbec do toho makra?

David Grudl
Nette Core | 8133
+
0
-

Jak to makro přidáváš?

Jiří Nápravník
Člen | 710
+
0
-

Úplně konkrétně přes flame\modules, nicméně tam je to konkrétně takto:

V CompilerExtension je, když to vypreparuji:

$latte = $builder->getDefinition('nette.latteFactory');
$latte->addSetup($macro . '(?->getCompiler())', array('@self'));

V kontejneru potom je přidáné vše (podle mě) bez problémů:

final class SystemContainer_Nette_Bridges_ApplicationLatte_ILatteFactoryImpl_nette_latteFactory implements Nette\Bridges\ApplicationLatte\ILatteFactory
{

	private $container;


	public function __construct(Nette\DI\Container $container)
	{
		$this->container = $container;
	}


	public function create()
	{
		$service = new Latte\Engine;
		$service->setTempDirectory('../temp/cache/latte');
		$service->setAutoRefresh(TRUE);
		$service->setContentType('html');
		JiriNapravnik\Latte\Macros\CommonMacros::install($service->getCompiler());
		JiriNapravnik\Latte\Macros\FormMacros::install($service->getCompiler());
		JiriNapravnik\Latte\Macros\Bootstrap3InputMacros::install($service->getCompiler());
		$service->addFilter('imageSize', 'JiriNapravnik\\Latte\\Helpers\\Common::imageSize');
		$service->addFilter('dateCzech', 'JiriNapravnik\\Latte\\Helpers\\Common::dateCzech');
		$service->onCompile = $this->container->getService('2.manager')->createEvent(array('Latte\\Engine', 'onCompile'), $service->onCompile);
		return $service;
	}

}

všechny makra fungují v pořádku, jen ty která překrývají ty zabudované (form, input, label) nefungují a používají se ty původní

David Grudl
Nette Core | 8133
+
+1
-

Jasně, tam je totiž potřeba použít:

$latte->addSetup('?->onCompile[] = function($engine) { ' . $macro . '($engine->getCompiler()); }', array('@self'));

aby se vygenerovalo

$service->onCompile[] = function($engine) { JiriNapravnik\Latte\Macros\CommonMacros::install($service->getCompiler()); };

čímž se makro nainstaluje ve správném pořadí.

Navíc se nainstaluje jen ve chvíli, kdy je potřeba, což je pouze první request.

Jiří Nápravník
Člen | 710
+
0
-

Díky, tohle už samozřejmě funguje parádně!