Validace různých částí formuláře různými tlačítky

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

Ahoj lidičky,

vyrábím formulář pro tvorbu faktury – obsahuje nějaké obecné informace + seznam fakturovaných položek. Potřebuji docílit toho, abych mohl v rámci tohoto formuláře jednak přidávat nové položky na fakturu a jednak celý formulář uložit jako hotovou fakturu.

Z pohledu Nette je to jeden hodně velký formulář a v něm jsou de facto dvě submitovací tlačítka, přičemž každé by mělo validovat jiné položky. Jak toho dosáhnout?

Zkoušel jsem nějaký hack, který umožňuje nastavit validaci jen určitého kontejneru. To by asi fungovalo, ale potíž je v tom, že nevím, jak vypisovat kontejnery (resp. jejich obsah) v Latte.

Má vůbec smysl se ubírat cestou kontejnerů a nebo řeším problém úplně špatně?

Díky

Honza

Filip Procházka
Moderator | 4668
+
0
-

Kontejnery jsou v tomhle případě to pravé řešení.

Vytvoříš si svoji strukturu containerů, tlačítkům nastavíš aby nic nevalidovaly a pak si v události po odeslání zvaliduješ jenom ty, které potřebuješ

protected function createComponentForm()
}
	$form = new Nette\Application\UI\Form();
	$jedna = $form->addContainer('jedna');
	// ...
	$dva = $form->addContainer('dva');
	// ...

	$form->addSubmit('prvni')
		->setValidationScope(FALSE)
		->onClick[] = callback($this, 'PrvniClicked');

	$form->addSubmit('druge')
		->setValidationScope(FALSE)
		->onClick[] = callback($this, 'DruheClicked');

	return $form;
}

public function PrvniClicked(Nette\Forms\Controls\SubmitButton $button)
{
	$form = $button->form;
	$form['jedna']->validate();
	if (!$form['jedna']->isValid()) {
		return;
	}

	// zpracování události
}

public function PrvniClicked(Nette\Forms\Controls\SubmitButton $button)
{
	// ...

A toho validování v událostech se vůbec neboj.

klasyc
Člen | 14
+
0
-

Díky moc za odpověď. Ještě se zeptám, jak vypsat prvky z kontejneru v Latte. Když udělám:

$jedna = $form->addContainer('jedna');
$jedna->addText('pokus');

Šalona:

{form mujForm}
   {label pokus}Pokus: {/label}{input pokus}
{/form}

V tomto případě mi Nette ohlásí chybu, protože hledá textové pole přímo ve formuláři, zatímco ono je schované v kontejneru „jedna“. Nevím, jak tohle zapsat v Latte. Někde jsem našel makro formContainer, ale to je asi zatím jen nějaký neoficiální hack Nette.

Díky za pomoc.

Editoval klasyc (5. 11. 2011 10:55)

Filip Procházka
Moderator | 4668
+
0
-

stačí oddělit pomlčkou :)

{form mujForm}
   {label jedna-pokus}Pokus: {/label}{input jedna-pokus}
{/form}
klasyc
Člen | 14
+
0
-

Teda zkoušel jsem kdejakou pitomost, ale pomlčka mě nenapadla :) Díky moc.