Existuje něco jako MacroLoader?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

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?

Filip Procházka
Moderator | 4668
+
0
-

Jaký by to mělo smysl?

Tomáš Votruba
Moderator | 1114
+
0
-

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

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

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

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

Pravda :) Časem určitě zkusím, díky za nasměrování. Teď potřebuji jen minoritní hotfix.

Patrik Votoček
Člen | 2221
+
0
-
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
+
0
-

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)

Patrik Votoček
Člen | 2221
+
0
-

smazal jsi cache? ;-)

Tomáš Votruba
Moderator | 1114
+
0
-

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)

Jan Suchánek
Člen | 404
+
0
-

Funguje to uplně super! :)

Felix
Nette Core | 1245
+
0
-

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..
        }
}
Caine
Člen | 216
+
0
-

Schmutzka napsal(a):

Chci si vytvářet vlastní makra a **nechci je přidávat v presenteru v *templatePrepareFilters*** jeden po druhém.

PS: Taky bych se přikláněl k nějaký jednodušší možnosti přidávat si vlastní makra..

Editoval Caine (30. 6. 2012 0:29)

Tomáš Votruba
Moderator | 1114
+
0
-

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

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

@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ě.