Komponenta – plnění defaultních hodnot

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

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?

vvoody
Člen | 910
+
0
-

V formulár naplň už v jeho továrničke (pri inštancovaní)

MartinitCZ
Člen | 580
+
0
-

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.

ViPEr*CZ*
Člen | 817
+
0
-

Je možné poslat celý form jak se tvoří? Je správně vygenerovaná action u toho formu? Tj. předává se v action druhého formu parametr sid?

MartinitCZ
Člen | 580
+
0
-

@**ViPErCZ**: Ale já žádné action nemám. Tyto dva formy jsou v komponentě.

ViPEr*CZ*
Člen | 817
+
0
-

martinit napsal(a):

@**ViPErCZ**: Ale já žádné action nemám. Tyto dva formy jsou v komponentě.

Formuláře mají html atribut action ;-)

MartinitCZ
Člen | 580
+
0
-

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

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

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

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

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

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)

MartinitCZ
Člen | 580
+
0
-

@**pave.kucera**: Nakonec jsem to tak udělal.

Všem děkuji.