Jak si zavolat funkci, která je v komponentě z template dané komponenty

kalipny
Člen | 19
+
0
-

Ahoj,
mám komponentu a k ní template. Potřeboval bych si zavolat z template public funkci z dané komponenty. Nevíte jak na to?

Když si potřebuji zavolat z template funkci z presenteru, tak je funkční toto: {$presenter->Foo()|noescape} .

Díky

ali
Člen | 342
+
0
-
{$presenter[nazevKomponenty]->nazevFunkce()}
duke
Člen | 650
+
0
-

Toto není zrovna čisté řešení. Není starostí šablony řešit, kde se daná komponenta nachází ve stromu komponent presenteru, a tudíž by to neměla nijak zohledňovat. Lepší je řešit to přes helper, který si do šablony zaregistruješ v komponentě, případně si poslat tu funkci do šablony jako callback.

CZechBoY
Člen | 3608
+
0
-

Co to je za funkci? Nestačilo by vytvořit latte filtr?

kalipny
Člen | 19
+
0
-

Děkuji, za odpověď. Ano, není to standardní řešení a dá se to napsat lépe. Ale nebyl jsem schopen nikde přijít na to, jak získat se dostat k funkci komponenty z template.

duke
Člen | 650
+
0
-

kalipny napsal:

Děkuji, za odpověď. Ano, není to standardní řešení a dá se to napsat lépe. Ale nebyl jsem schopen nikde přijít na to, jak se dostat k funkci komponenty z template.

Jde o to, že z šablony by ses měl dostat pouze k položkám, které byly šabloně explicitně předány jako parametry.

Nejlepší asi bude zaregistrovat si v šabloně filtr (tj. funkci která nějak umí zpracovat parametr a vrátit výsledek), a předat si jen naprosté minimum toho, co potřebuješ. Presenter se do šablon automaticky předává proto, abys mohl používat makro {plink} pro vytváření odkazů (za což je zodpovědný právě presenter). Ne proto, aby sis tahal z presenteru jeho subkomponenty (které mohou být u každého presenteru jiné a jinak zanořené). Komponenta (natož pak její šablona) by neměla být pevně svázána s jediným presenterem a konkrétní strukturou jeho subkomponent.

Jinak samotná komponenta také bude v šabloně nějak přístupná, neboť ji vyžadují makra {link} a {control}, ale to, jakým způsobem je přístupná, je vnitřní implementační detail Nette, který se může verzi od verze měnit. V posledních verzích nette je to nejspíše proměnná {$this->global->uiControl}. Abys na tomto detailu nebyl závislý, bude lepší si ji tam předat jako normální parametr přímo z komponenty, tj. např.:

$this->template->control = $this;

… ale jak jsem již o tom hovořil výše, zvaž zda něco takového vůbec potřebuješ a nevystačíš si s filtrem.