Záhadné přenášení stavu komponenty?

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

V minulém projektu jsem měl editační formuláře postavené podle starého známého návodu. V novém projektu jsem formulář zabalil do komponenty a řeším pro mne záhadnou situaci.
Po potvrzení formuláře se přenesou hodnoty proměnných komponenty nastavené presenterem v předchozím requestu.

$item = $this->loadItem($id); // Načtu entitu z databáze
$this['record']->entity = $item; // Pošlu ji setterem do proměnné komponenty

Nemusím tedy přenášet nic pomocí persistentních parametrů nebo hidden polí. Navíc se mi persistuje celá Doctrine entita.
Čím je prosím toto (sic žádoucí) chování způsobeno?
PS: Jsou dvě ráno a přijde mi to jako kouzlo!
Díky

Editoval Climber007 (23. 3. 2014 2:22)

mkoubik
Člen | 728
+
0
-

Nejspíš to nastavuješ při každém requestu (v továrničce, action/render/startup metodě), takže po odeslání se v následujícím requestu ta komponenta vytvoří znovu a opět se jí nastaví ty hodnoty.

Climber007
Člen | 105
+
0
-

mkoubik napsal(a):

Nejspíš to nastavuješ při každém requestu (v továrničce, action/render/startup metodě), takže po odeslání se v následujícím requestu ta komponenta vytvoří znovu a opět se jí nastaví ty hodnoty.

Přesně tak, nastavuju to v renderEdit(). Teď mi ale nejde do hlavy, proč je to v návodu řešené přes persistentní parametr? Když by stačilo zavolat

$this['record']->id = $this->id;

V dokumentaci je popsán rozdíl mezi subrequestem a requestem takto:

  • subrequest přenáší všechny komponenty
  • request přenáší pouze perzistentní komponenty

Není to právě ten rozdíl? Momentálně je všechna logika schovaná v komponentě, které jen předám data, která je potřeba upravit (id, entita, whatever), kdežto dřív to bylo všechno na jedné hromadě v presenteru.

Ještě upřesnění. Dřív se volal signál formuláře v presenteru, teď je to naprosto stejné, ale zabalené do komponenty, tzn. jde o signál komponenty.

$form->onSuccess[] = $this->coolMethod;

Editoval Climber007 (23. 3. 2014 11:33)

Šaman
Člen | 2666
+
0
-

Kde ale bereš to ‚$this->id‘? Z query?

Climber007
Člen | 105
+
0
-

$this->id se samo vkládá z URL (to by mělo být výchozí chování pokud jde o persistentní proměnnou). Původně jsem měl všechno podle odkazovaného návodu. Co všechno se přenáší do signálu? Když nastavím v presenteru třeba $this->something = ‚quelque mot‘; budu to mít k dispozici při zpracování signálu?

Sorry, ale začínám se v tom trochu zamotávat. Nicméně jde stále jen o to, proč je potřeba použít persistentní parametr nebo hidden pole pro přenos nějaké hodnoty, když stačí v presenteru načíst data a vložit je do nějakého atributu presenteru a z něj si je potom načíst?

PS: Pokud id není persistent, v signálu ho nemám jak vydolovat. Naopak entitu nijak nepersistuji a mám ji tam, přestože jsem ji nastavil v předchozím requestu.

Otázka: Když v action nastavím atribut komponenty na nějakou hodnotu, bude ta hodnota nastavená i v signálu komponenty, která je vykreslená v této action?

Editoval Climber007 (23. 3. 2014 22:25)

Šaman
Člen | 2666
+
0
-

Odpověď: ano, protože signál zpracovává až ta komponenta, takže se předtím vytvoří.

Pokud nepoužíváš persistentní parametry, tak se casto $idpředává v hidden poli a získává se z $form->values. Persistence je druhá možnost.

Climber007
Člen | 105
+
0
-

Díky moc! To bude ono. Pokaždé když pracuju s tou komponentou se provede celá action, kde ty hodnoty komponentě nastavuju.

Nějak mě to zmátlo, protože jsem s těmi persistentními parametry bojoval, aby někdy byly NULL a někde ne a teď mi to fungovalo naprosto samo a správně.

Editoval Climber007 (24. 3. 2014 13:45)

Šaman
Člen | 2666
+
0
-

Persistentní parametry používám jen pro přenášení vnitřních a nastavitelných(!) stavů. Což bývá málokdy.
Jako příklad mohu uvést nastavení jazyka (každá jazyková mutace má pak vlastní url, což se hodí když někomu posíláš odkaz, uvidí přesně co vidíš ty).
Pro přenášení stavů, které nemají být nastavitelné přímo z adresy jsou lepší session (třeba na příklad s automatem na kávu) a pro formuláře dopoučuji odeslat si pomocné hidden pole (i když i POST se dá upravovat, takže s tím počítej, až budeš řešit bezpečnost).