Komponenta – plnění defaultních hodnot
- MartinitCZ
- Člen | 580
Mám komponentu, jež se skládá z dvou formulářů (step form).
V prvním formu zadám link, obsah projedu přes parser a do session si
uložim data.
Druhý formulář nimi potřebuji naplnit.
Problém je v tom, že se mi nedaří dostat data do selectBox.
Při vykreslení je selectbox tak, jak má být (obsahuje data), ale při
zpracování formuláře je NULL.
Něco jsem tu o tom hledal, ale přímo řešení jsem nenalezl.
Snad jen to, že formulář se daty plní v action. Jenže ty komponenta nemá,
má pouze handle.
Nevíte, co stím?
- MartinitCZ
- Člen | 580
No, ale ono to funguje nějak divně.
V prním formuláři při zpracování provedu toto:
$sessionId = Strings::random();
$session = $this->getSession($sessionId);
.
.
.
$this->redirect("this", array("sid" => $sessionId));
Druhý form:
protected function createComponentSecondForm($name)
{
$default = $this->getSession($this->getParameter("sid"));
A pak už z proměnné default plnim data.
Při vykreslení je vše ok, ale problém nastane při odeslání.
Problém je v tom, že jakmile odešlu ten druhý formulář, tak chybí
hodnota selectboxu, resp. je rovna NULL. Ostatní data jsou OK.
- MartinitCZ
- Člen | 580
@**ViPErCZ**: Aha, takhle to myslíš.
1. form
?do=movieComponent-linkForm-submit
2. form
?do=movieComponent-movieForm-submit
Jak vidíš, tak tam není. Jak ho tam tedy dodat, když v URL je?
Editoval martinit (14. 3. 2013 21:33)
- pave.kucera
- Člen | 122
Myslím, že narážíš na bezpečnostní opatření Nette, které brání podvržení hodnoty selectboxu (framework proje POST a pokud se hodnota neshoduje s hodnotou nadefinovanou tebou, tak se použije NULL). Pokud mám pravdu, tak po odeslání druhého formuláře, když si jej dumpneš, daný selectbox nebude mít nadefinované žádné hodnoty.
- MartinitCZ
- Člen | 580
@**pave.kucera**: Přesně to zminuji o několik postů výše. Jak to vyřešit? To nikdo nepoužívá stepfrom se selectboxem?
- pave.kucera
- Člen | 122
Musíš ten formulář úplně stejně vytvořit při odeslání a tedy jak máš
$default = $this->getSession($this->getParameter("sid"));
// magic here
tak ten kód musí proběhnout úplně stejně jak při zobrazení, tak při odeslání (hádám tedy, že sid musí zůstat v session)
- MartinitCZ
- Člen | 580
@**pave.kucera**: Ale v tom případě nemusim řešit nějaký random parametr, ale stačí mít session ‚ulozeny-form‘. Jelikož nějakou ‚unikátnost‘ tu nevyřešim :/
Aktuálně to totiž tak mám a míchaj se mi data u toho selectboxu.
- pave.kucera
- Člen | 122
Nestačil by ti „přepínač“ v url? ?step=1, ?step=2 … Podle hodnoty přepínače vytvoříš příslušné formuláře, pokud bude přepínač, ale nebudou k němu existovat potřebná data v session, vrátíš uživatele na první krok.
// Bez ukázky implementace jenom bádám
Editoval pave.kucera (14. 3. 2013 22:18)