Dvě verze formuláře + tlačítka

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

Mám formulář pro editaci dat a chci mít téměř stejný pro přidání dat, jediný rozdíl bude ten, že formulář pro přidání dat bude mít dvě submit tlačítka navíc (které udělají to samé, akorát konečný redirect bude jinam). Jak to udělat?

  1. Zkoušel jsem je přidat v renderAdd funkci následovně:
	$this['myForm']->addSubmit('saveAndAddNext', 'Uložit a přidat další');
	$this['myForm']->addSubmit('saveAndAddImages', 'Uložit a přidat obrázky');

Ale to se potom funkce myFormSubmitted tvářila, že tlačítka saveAndAddNext a saveAndAddImages neexistují (isset vracelo false a při isSubmittedBy vyhazovala výjimky).

  1. Zkoušel jsem vytvořit novou komponentu, která má základ v té staré:
	protected function createComponentMyAddForm() {
		$form = $this['myForm'];

		$form->addSubmit('saveAndAddNext', 'Uložit a přidat další');
		$form->addSubmit('saveAndAddImages', 'Uložit a přidat obrázky');

		return $form;
	}

Ale v tomto případě pokud se z šablony nebo presenteru pokouším dostat k $this[‚myAddForm‘] dostanu InvalidArgumentException Component with name ‚addOfferForm‘ does not exist.

Jak to udělat správně?

David Grudl
Nette Core | 8227
+
0
-

$form = $this['myForm']; nezíská klon původního formuláře, ale původní formulář, který poté modifikuje. Zkus $form = clone $this['myForm'];

Blizzy
Člen | 149
+
0
-

Kód je následující:

protected function createComponentMyAddForm() {
	$form = clone $this['myForm'];

	$form->addSubmit('saveAndAddNext', 'Uložit a přidat další');
	$form->addSubmit('saveAndAddImages', 'Uložit a přidat obrázky');

	return $form;
}

protected function createComponentMyForm() {
	$form = new AppForm;

	/* nějaké inputy s validačními pravidly */

	$form->addSubmit('save', 'Uložit')->controlPrototype->class('default');
	$form->addSubmit('cancel', 'Storno')->setValidationScope(NULL);
	$form->onSubmit[] = array($this, 'myFormSubmitted');

	return $form;
}

public function myFormSubmitted(Appform $form) {
	if (!$form['cancel']->isSubmittedBy()) {
		...
	}
	if (isset($form['saveAndAddNext']) &&
		$form['saveAndAddNext']->isSubmittedBy()) {
		...
	} else if (isset($form['saveAndAddImages']) &&
		$form['saveAndAddImages']->isSubmittedBy()) {
		...
	} else {
		$this->redirect('default');
	}
}

Problém: pokud použiji komponentu myAddForm nenastává validace (ani JS, ani PHP validace), nebo spíše validační pravidla definovaná v myForm jsou ignorována. Proto ani jedním ze tří tlačítek (save, saveAndAddNext, saveAndAddImages) se tento formulář nikdy úspěšně nesubmituje. Jedině pokud kliknu na cancel, je zavolána metoda myFormSubmitted, protože cancelvalidationScope nastavenou na NULL, a tak se neprovádí validace.

Předem díky za jakoukoliv odpověď, klidně jiné řešení tohoto problému s dvěma téměř stejnými formuláři.

Není to bug, že u naklonovaných formulářů přestane fungovat validace?

Editoval Blizzy (14. 8. 2009 16:14)

David Grudl
Nette Core | 8227
+
0
-

To je pravda, klonování formulářů nefunguje dobře. Nejsnažší řešení je nahradit $form = clone $this['myForm']; za $form = $this->createComponentMyForm();