Jak si zavolat funkci, která je v komponentě z template dané komponenty
- duke
- Člen | 650
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.
- duke
- Člen | 650
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.