Vytvorit vlastna makro v Model

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

Ahojte,
neviem vygooglit, ci je mozne vytvorit vlastne makro v Model. Ak ano neviem ako, skusal som postupovat podla dokumentacie, ale stale mi to hadze „unknown xyz macro“
(Unknown macro {try} in …/Shops/default.latte:52)

Vytvoril som si funkciu beforeRender() a tam vlozil

$latte = new Latte\Engine;
// vytvoříme si sadu
$set = new Latte\Macros\MacroSet($latte->compiler);
// do sady přidáme párové makro {try} ... {/try}
$set->addMacro(
    'try', // název makra
    'try {',  // PHP kód nahrazující otevírací značku
    '} catch (\Exception $e) {}' // kód nahrazující uzavírací značku
);

Skusal som to rozne, ale neviem ci ma zmysel to tu rozpisovat. Pointa je v tom, ze nikde neviem najst ako to makro dat dokopy. Vdaka za kazdu pomoc. Urcite to tu je riesene, ale nejak to nemozem vyhladat.

Felix
Nette Core | 1247
+
0
-

Makra musis tvorit jeste pred kompilaci sablon.

Kdyz pominu, ze tvorit makro v Modelu(!!!) [neplest s modelem aplikace] neni spravna cesta, tak ti to stejne nebude fungovat. Jedine co by ti fungovalo v Modelu (!!!) je registrace helperu.

Potom by sis ve svem presenteru v render* nebo beforeRender a zaregistroval helpery pro konkretni view.

public function beforeRender() {
	parent::beforeRender();
	SomeMyClass::registerHelpers($template);
	// or..
	(new SomeMyClass())->registerHelpers($template);
}

Ale jak rikam, neni to spravny postup.

Makra by jsi mel registrovat v configu, viz LatteExtension a helpery idealne ve sve podedene TemplateFactory nebo createTemplate

Editoval Felix (3. 3. 2015 17:21)

greeny
Člen | 405
+
0
-

V modelu nevytvářej novej Latte\Engine, ale použij DI a dostaň tam už existující :)

bokos
Člen | 9
+
0
-

Vdaka, tak dal som na vas a skusil som spravit nejake simple macro a do configu som ho skusil pridat, ale stale to hadze fail.

App/Latte/DatabaseTranslateMacros.php

<?php
namespace App\Latte\DatabaseTranslateMacros
use Latte,
	Latte\MacroNode,
	Latte\PhpWriter;
class DatabaseTranslateMacros extends MacroSet
{
	public static function install(Compiler $compiler)
	{
		$me = new static($compiler);

		/** @var DatabaseTranslateMacros $me */
		$me->addMacro('dbTranslate', array($me, 'macroTranslate'));

		return $me;
	}

	public function macroTranslate(MacroNode $node, PhpWriter $writer)
	{
		return $writer->write('echo %node.word');
	}
}

Config:

nette:
	latte:
		macros:
            - App\Latte\DatabaseTranslateMacros::install

Chyba: Nema byt dbTranslate not found, ale DatabaseTranslateMacros.
Github Asset image …

Editoval bokos (3. 3. 2015 18:00)

Felix
Nette Core | 1247
+
0
-

@bokos:

Mas chybu v namespace.

<?php
namespace App\Latte;

A bude to v pohode.

Editoval Felix (3. 3. 2015 21:03)

bokos
Člen | 9
+
0
-

Vdaka uz to ide. Aj pri extends som zabudol uviest.