Ako riešite validáciu v prípade containerov

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

Ako riešite validáciu v prípade containerov?

$container = $form->addContainer('files');
for($i=1; $i<=6; $i++) {
	$container->addFile($i, 'File:')
}
// Musíte vybrať minimálne 1 súbor.

$container = $form->addContainer('categories');
for($i=1; $i<=6; $i++) {
	$container->addSelect($i, 'Category:', $categories);
}
// Musíte vybrať minimálne 3 kategórie.
// Kategórie musia byť rozdielne.

$container = $form->addContainer('countries');
foreach($countries as $country) {
	$container->addCheckbox($country->id, $country->name);
}
// Musíte zaškrtnúť minimálne 3 štáty.
JakubJarabica
Gold Partner | 184
+
0
-

Pozerám sa do API a asi by to chcelo mať metódu addRule na FormContainer, ktorý by bol predaný do validačného callbacku. FormContainer má metódu getControls, takže nad všetkými by si si iterovať vedel a obslužnú logiku by si si už dopísal zrejme bez problémov.

Teraz ako workaround asi dať vlastný callback len na jednu z týchto položiek, ktorá by do addRule bola posielaná ako prvý parameter automaticky a všetky ostatné controls, ktorých sa validácia týka a potrebuješ s nimi pracovať v callbacku predať v $args poli: https://api.nette.org/…extBase.html#…

dakota
Člen | 148
+
0
-

Vďaka za radu. Pridanie addRule na Container a použitie callback by možno mohlo pomôcť, ale neviem či je to dobré riešenie.

Ako jedno riešenie, neskúšal som to:

protected function createComponentSomeForm()
{
	...
	$container = $form->addContainer('files');
	for($i=1; $i<=6; $i++) {
		if($i == 1) {
			$container->addFile($i, 'File:')
				->addRule(callback($this, 'validateFileUpload'), 'Musíte vybrať minimálne 1 súbor.')
				->addRule(...);

		} else {
			$container->addFile($i, 'File:')
				->addRule(...);
		}
	}
	....
}

public function validateFileUpload(IFormControl $control)
{
	$form = $control->getForm();
	$values = $form['files']->getValues();

	// Musíte vybrať minimálne 1 súbor.
	...
	if(...) {
		return FALSE;
	}
	...
	return TRUE;
}

Pravidlo validateFileUpload by sa malo vykonať pred ostatnými pravidlami.

Je správne takto postupovať?

Editoval dakota (31. 1. 2011 11:57)

dakota
Člen | 148
+
0
-

Chcem sa spýtať – existuje nejaké iné riešenie? Bude validáciu kontajnerov riešiť nová verzia formulárov alebo to riešiť použitím vlastných FormControl?