Jaký je doporučený způsob pro form wizarda?

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

Ahoj,
co mi poradíte na otázku jak nejlépe implementovat vícekrokový formulář – jakéhosi wizárda?

Uvedu příklad registračního formuláře (jednotlivé kroky jsou akce prezenteru):

  1. krok: jméno, příjmení
  2. krok: adresa
  3. krok: heslo potvrzení hesla

Napadlo mě tedy využít například session, do ní ukládat jednotlivé formuláře. Formulář v „sešně“ bude mít nějakou platnost. Prezenter zkontroluje zdali jsou předchozí kroky splněny. Pokud ano zobrazí další krok, pokud ne, vrátí na nejbližší nevalidní – aby se informace doplnili.

Je tato myšlenka efektivní postup pro implementaci vícekrokového formuláře nebo mi unikla nějaka jednoduchá možnost v nette? :)

Díky

_Martin_
Generous Backer | 679
+
0
-

No, pokud ještě pár dnů vydržíš, tak přesně na toto píšu vlastní formulář (dědící od AppForm), který si toto vše řeší sám – a mám v plánu jej zveřejnit. Malá ukázka pro namlsání:

protected function createComponentMainForm($name)
{
	$form = new StepForm($this, $name);

	$form->addStep(); // může být i nemusí - první krok se vytvoří automaticky
	$form->addText('name', 'Jméno:')
		->addRule(Form::FILLED, 'Vyplňte jméno');
	$form->addText('surename', 'Příjmení:')
		->addRule(Form::FILLED, 'Vyplňte příjmení');

	$form->addStep();
	$form->addText('email', 'Email:')
		->setEmptyValue('@')
		->addCondition(Form::FILLED)
			->addRule(Form::EMAIL, 'Špatně zadaný email!');

	$form->addSubmit('test1', 'Uložit')
		->onClick[] = array($this, 'sendClicked'); // libovolný handler pro zpracování dat celého formuláře
	$form->addSubmit('test2', 'Uložit do konceptů')
		->onClick[] = array($this, 'sendClicked'); // libovolný handler pro zpracování dat celého formuláře

	$form->onSubmit[] = array($this, 'formSubmitted'); // libovolný handler pro zpracování dat celého formuláře

	return $form;
}

Z technického hlediska se jednotlivé kroky ukládají do session, jak jsi o tom uvažoval. Ovšem presenter se o nic starat nemusí=)

Honza Marek
Člen | 1664
+
0
-

Dobře Martin. Já jsem nad tím chvíli koumal a pač jsem to vyloženě nepotřeboval, tak jsem to vzdal.

_Martin_
Generous Backer | 679
+
0
-

Honza M. napsal(a):

Dobře Martin. Já jsem nad tím chvíli koumal a pač jsem to vyloženě nepotřeboval, tak jsem to vzdal.

Já už to mám vykoumané celkem hezky (tenhle kód už normálně funguje), problém zatím dělají jen groupy – nejsou to totiž přímo komponenty ve formuláři, tak je s tím trochu problém – ale i to nějak zvládnu=)

Sentinel
Člen | 5
+
0
-

Vypadá to fakt dobře :)
vydržím tedy než to zprovozníš
;-)

timbulko
Člen | 85
+
0
-

_Martin_: Bude tam aj možnosť mať pre každý krok (step) vlastnú šablónu?

_Martin_
Generous Backer | 679
+
0
-

timbulko napsal(a):

_Martin_: Bude tam aj možnosť mať pre každý krok (step) vlastnú šablónu?

To budu muset ještě promyslet – vzhledem k tomu, že ty kroky si bude zpracovávat formulář sám, jde to zcela mimo presenter. Ovšem možná by šlo přidat metodu, která by vracela aktuální krok – a na základě toho by presenter mohl nastavit šablonu.

Trochu problém je v tom, že generování kroků i validace se provádí až při vykreslení (resp. při zpracování signálů v případě odeslání), takže je problém aktuální krok zjistit dřív (respektive se dá vytáhnout ze session, ale bez vygenerování kroků se nedá ověřit případná změna formuláře,…). Samozřejmě by se to generování mohlo spustit spolu s dotazem na krok, ale potom už by nebylo možné formulář jakkoliv měnit – což možná nemusí ničemu vadit, pokud to bude známá feature.