Jak přidat proměnou do template globálně?

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

Ahoj,
potřeboval bych pomoci jak přidat proměnou do objektu Template.

Proměnou chci mít dostupnou všude, v presenterech, komponentách, mailech aj.

Vím že existuje rozhraní ITemplateFactory, ale píšu rozšíření, které definuje makra a pro správný běh vyžaduji mít přítomnost objektu v šabloně. A když si napíšu vlastní TemplateFactory, tak to může kolidovat s tím že někdo bude mít vlastní TemplateFactory a já mu ho přetížím nebo obráceně a bude dohledávat proč to nejde. Takže to taky nechci doplňkem vytvářet továrničku na template když vlastně neznám potřeby projektu.

Psát traitu je taky nedokonalý. Je to jen zmírnění definovat proměnou všude kde ji budu potřebovat (maily, komponenty, presentery). Makra jsou dostupná všude, ale jak nasetovat proměnou jsem nenašel.

Přijde mi hloupý do manuálu psát pokud chceš tehle doplněk použít tak si nezapomeň nasetovat tuhle proměnnou makra s tím počítají a musí to bejt tenhle objekt.

S proměnou kterou bych si definoval pracují jen makra, programátor by ji viděl, ale neměl by s ní pracovat, takže si mohu zvolit nekolidující název.

Líbilo by se mi, aby rozhraní ITemplateFactory definovalo metodu na přidávání proměnných. Stejně jako jsou globální $user, $control aj…

Jak to řešíte vy? Přehlídnul jsem jinou možnost?

EDIT
Po úpravě rozhraní by TemplateFactory mohla vypadat pro představu takto.

Kdyby někdo měl vlastní TemplateFactory, tak by doplněk nepřestal fungovat protože programátor by definoval tuto metodu addVariable($name, $value) kterou jsem přidal.

Editoval h4kuna (2. 6. 2016 11:02)

David Matějka
Moderator | 6445
+
+3
-

Ja to hackuju pres filtr :) nejak takhle:

$builder->getDefinition('latte.latteFactory')
	->addSetup('addFilter', ['getFoo', new Statement('function () { return $this->getService(?);}', ['fooService'])]);

a diky tomu to i bude lazy

h4kuna
Backer | 740
+
0
-

Makro pak v šabloně generuje

<?php
$template->getFoo()->anyMethod(...);
?>

Hack chápu. Děkuji, dělá co potřebuji.

EDIT
Hack je to protože nikdy vlastně nepoužiji

{$variable|getFoo}

Editoval h4kuna (9. 6. 2016 15:34)