Existuje něco jako MacroLoader?
- Tomáš Votruba
- Moderator | 1114
Pokud mám více helperů, mohu je načítat v oddělené třídě díky
HelperLoaderu.
Existuje něco podobně jednoduchého i pro makra?
- Tomáš Votruba
- Moderator | 1114
Chci si vytvářet vlastní makra a nechci je přidávat v presenteru
v templatePrepareFilters jeden po druhém.
Něco jako máš https://github.com/…reMacros.php,
ale abych je mohl snadno zaregistrovat v createTemplate.
public function createTemplate($class = NULL)
{
$template = parent::createTemplate($class);
$template->registerFilter(new \Nette\Latte\Engine);
$helpers = new MyHelpers;
$template->registerHelperLoader(array($helpers, 'loader'));
// tady ještě načíst má makra
return $template;
}
- Filip Procházka
- Moderator | 4668
Udělej si vlastní compiler
ve kterém posbíráš továrničky podle
tagu a pak je zavolej nad nette.latte
.
- Tomáš Votruba
- Moderator | 1114
To vypadá na mě příliš náročně (znám jen továrničku). Jednodušší cesta není?
EDIT: Možná je, zkusím Jak napsat n:macro
Editoval Schmutzka (10. 3. 2012 15:47)
- Filip Procházka
- Moderator | 4668
Aspoň se naučíš něco nového :) Můžeš je ale i rovnou registrovat na tu službu. Pokud ti to tak stačí.
- Tomáš Votruba
- Moderator | 1114
Pravda :) Časem určitě zkusím, díky za nasměrování. Teď potřebuji jen minoritní hotfix.
- Patrik Votoček
- Člen | 2221
class MyMacros extends \Nette\Latte\Macros\MacroSet
{
public static function setup(\Nette\Latte\Engine $engine)
{
self::install($engine->getCompiler());
}
public static function install(\Nette\Latte\Compiler $compiler)
{
$me = parent::install($compiler);
$me->addMacro('phref', NULL, NULL, function(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer) use ($me) {
return ' ?> href="<?php ' . $me->macroPLink($node, $writer) . ' ?>"<?php ';
});
}
/**
* {plink destination [,] [params]}
* n:phref="destination [,] [params]"
*/
public function macroPlink(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer)
{
return $writer->write('echo %escape($_presenter->link(%node.word, %node.array?))');
}
}
class LatteMacrosExtension extends \Nette\Config\CompilerExtension
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
if ($builder->hasDefinition('nette.latte')) {
$builder->getDefinition('nette.latte')
->addSetup('MyMacros::setup', array('@self'));
}
}
}
$configurator->onCompile[] = function($configurator, \Nette\Config\Compiler $compiler) {
$compiler->addExtension('macros', new \LatteMacrosExtension);
};
- Tomáš Votruba
- Moderator | 1114
Patrik Votoček napsal(a):
Wow, vřele díky. To bych nevymyslel.
EDIT: onCompile
ok.
Vypadá to, že k MyMacros::setup
se už nedostane, jelikož
die
uvnitř nic nezastaví. Makro stále not found.
Editoval Schmutzka (10. 3. 2012 23:29)
- Tomáš Votruba
- Moderator | 1114
Jj, raději už několikrát. Divné, vypadá to, že cesty sedí. No fakt netušim :(
Mé aktuálně funkční řešení vypadá takto:
MyMacros.php
class MyMacros extends \Nette\Latte\Macros\MacroSet
{
public static function install(\Nette\Latte\Compiler $compiler)
{
$me = new static($compiler);
$me->addMacro("menuItem", array($me, "macroMenuItem"));
// add some other macros
}
/**
* My uber macro
*/
public function macroMenuItem(MacroNode $node, PhpWriter $writer)
{
// ...
}
}
Presenter.php
class Presenter extends \Nette\Application\UI\Presenter
{
public function templatePrepareFilters($template)
{
$latte = new \Nette\Latte\Engine;
MyMacros::install($latte->compiler);
}
}
Pokud na něm není nic hrozného, zůstal bych u něj.
Editoval Schmutzka (2. 4. 2012 21:36)
- Felix
- Nette Core | 1245
Ne ze bych do toho chtle rejpat. Ale nemelo by to byt
class Presenter extends \Nette\Application\UI\Presenter
{
public function templatePrepareFilters($template)
{
$latte = new \Nette\Latte\Engine;
MyMacros::install($latte->compiler);
$template->registerFilter($latte); // bez toho mi to nejde..
}
}
- Tomáš Votruba
- Moderator | 1114
@Felix: Pravda, v záchvatu radosti jsem zřejmě zapomněl doplnit.
Upravil jsem k dnešnímu dni aktuální návod na makra
- duke
- Člen | 650
Ze zmíněného návodu cituji:
Jazyk maker je specifický tím, že jde o kód kešovaných šablon – k mání ve složce temp/cache/_Nette.FileTemplate, které je velmi úsporné a používá alternativní výrazy. Např. v šabloně napsané {$!var}, v makru zapíšeme jako %escape($_template->var).
První věta mi není příliš jasná. Konkrétně k čemu se vztahuje slůvko „které“. A úsporné v jakém smyslu?
Dále mám za to, že to, že se překlad (nejen) Latte kódu u Nette šablon cachuje, není specifikem Latte jazyka jako takového, nýbrž specifikem šablonovacího systému Nette, tj. specifikem třídy Template.
Ve druhé větě je pak dle mého názoru chyba, kdy tam má být {$var} nikoli {!$var}. (ve wiki jsem toto opravil)
- Tomáš Votruba
- Moderator | 1114
@duke: Myslel jsem to tak, že se liší od veškerého psaní v Nette, které je v php či latte. Klidně uprav text dle obrazu svého. Budu jen rád, když to bude jasné a bez chyb a nechci to upravit špatně.