Záhadné přenášení stavu komponenty?
- Climber007
- Člen | 105
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)
- Climber007
- Člen | 105
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)
- Climber007
- Člen | 105
$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)
- Climber007
- Člen | 105
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
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).