Lze překrýt defaultní makra v Nette 2.2?
- Jiří Nápravník
- Člen | 710
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.
- Jiří Nápravník
- Člen | 710
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
- Jiří Nápravník
- Člen | 710
Ú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 | 8218
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.