Dvě verze formuláře + tlačítka
- Blizzy
- Člen | 149
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?
- 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).
- 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
$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
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 cancel
má
validationScope
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
To je pravda, klonování formulářů nefunguje dobře. Nejsnažší
řešení je nahradit $form = clone $this['myForm'];
za $form = $this->createComponentMyForm();