Jak makru předat proměnné?

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

Objevil jsem na planatte článek Jak helperu předat proměnné. Za něj autorovi patří můj dík. :-)

Potřeboval bych však totéž i pro makra a bohužel se mi moc nedaří s tím pohnout. Věděl by někdo jak na to? Problém je v tom, že makro musí být buď statická fce nebo musí používat nějakou proměnnou kterou má šablona k dispozici (např. $_presenter). Teď to dělám přes statickou třídu které v BasePresenteru předám potřebné parametry. Jde to lépe?

Tomáš Votruba
Moderator | 1114
+
0
-

Nevím, jestli rozumím tvému problému, protože mi to přijde běžně možné. Já na to jdu takto.

{menuItem Homepage:default, Test lists}

Pokud myslíš přímo proměnnou

{menuItem $address, $name}

tak na tom jsem to nezkoušel, ale nevidím důvod, proč by to nešlo.

jtousek
Člen | 951
+
0
-

To si nerozumíme. :-) V podstatě jde o to, že v kódu toho makra potřebuji proměnnou $wwwDir, ale nechci používat přímo konstantu WWW_DIR, protože to není úplně čisté. Nevím ale kudy tam tu proměnnou kloudně dostat.

Tomáš Votruba
Moderator | 1114
+
0
-

Nešlo by v createTemplate() proměnnou předat konstruktorem?

public function createTemplate($class = NULL)
{
	parent::createTemplate($class);

	$wwwDir = "specify";

	$myMacros = new MyMacros($wwwDir);
	$myMacros::install($latte->compiler);

	// ...
}
class MyMacros extends \Nette\Latte\Macros\MacroSet
{
	/** @var string */
	private $wwwDir;

	public function __construct($wwwDir)
	{
		$this->wwwDir = $wwwDir;
	}

	public function macroFolder(MacroNode $node, PhpWriter $writer)
	{
		return $writer->write(" echo 'my code:'" . $this->wwwDir);
	}
}

(Kdyby ti náhodou postačilo $basePath, je možné jej použít.)