Odkaz na presenter, který generuje komponenta

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

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:

  1. proč lazyLink() vrátí prázdný řetězec (tedy proč nehodí vyjímku)?
  2. jak mohu v komponentě napsat odkaz?

díky

Jod
Člen | 701
+
0
-

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.

romansklenar
Člen | 655
+
0
-

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
+
0
-

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

prezenterhlavný komponentpodkomponent → …

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
+
0
-

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 :-)

Jod
Člen | 701
+
0
-

Mno, ako povedal kravco. Kukám, že to pôjde aj bez toho, ale niektoré veci s tým asi nepôjdu robiť ni?