Odkaz na presenter, který generuje komponenta
- Jakub Šulák
- Člen | 222
Zdravím, jeden problém:
mám nějakou komponentu A extends Control.
V ní potřebuji do šablony dostat takovýto odkaz
->link(‚:Images:default‘).
Používám k tomu $this->lazyLink(). Když si jej ale vypíšu, tak mi
vrací prázdný řetězec.
Předpokládám, že problém by mohl být v tom, že nemám komponentu
registrovanou k žádnému presenteru – tak aby link mohl zjistit
i relativně zadanou cestu.
Otázky:
- proč lazyLink() vrátí prázdný řetězec (tedy proč nehodí vyjímku)?
- jak mohu v komponentě napsat odkaz?
díky
- romansklenar
- Člen | 655
Proč by to nemělo jít? :) jde to, parametr je nepovinný… sám jsem takovou chybu udělal, když jsem se učil Nette.
@Jakub Šulák: Ať tu neřešíme to co už bylo řešeno jinde, doporučuju pročíst si to vlákno, zaměřit se potom na správné řešení registrace komponenty a tvorbu odkazů v komponentě tam lze taky najít.
- kravčo
- Člen | 721
Jod napsal(a):
Každá komponenta dedená z Control má hneď prvý parameter konštruktoru presenter, neviem ako ti to ide bez toho. Skús si tam pridať aktuálny presenter ($this) a keď tak použiť normálny link.
Presnejšie, trieda Control
(a štandardne i triedy od nej
dedené) majú ako prvý parameter konštruktora rodiča
(IComponentContainer
) v hierarchii komponentov. Môže ním byť
prezenter, ale takisto i iný komponent, či akýkoľvek objekt implementujúci
rozhranie IComponentContainer
. Keď si odmyslíme neštandardné
situácie, vcelku bežná je hierarchia
prezenter → hlavný komponent → podkomponent → …
Keďže Control nevie generovať linky, ale iba signály, potrebujeme Presenter, a ten, ak vytvárame hierarchiu komponentov poriadne, máme k dispozícii z priamo z komponentu (rovnako i zo subkomponentov):
$presenter = $control->getPresenter();
Hierarchia nám vznikne jednoducho tak, že pri vytváraní komponentu uvedieme ako parameter konštruktora jeho rodiča, v tom prípade musíme uviesť tiež jeho meno:
$control = new MyUniqueControl($presenter, 'my_unique_control');
// v kóde prezenteru samozrejme takto:
$control = new MyUniqueControl($this, 'my_unique_control');
Pri nejasnostiach ohľadne pojmov (napr. komponent vs. Control) odporúčam slovník v dokumentácii.
- romansklenar
- Člen | 655
Matěji teď jsi to tak hezky jednoduše a výstižně vysvětlil, že by byla škoda kdyby to nešlo do dokumentace :-)