Úprava validačních pravidel v době renderování
- toka
- Člen | 253
Zdravím, a mám dotaz. Pro vkládání a editaci používám jeden formulář – komponentu. Myšlenka je asi takováto:
Komponenta
// ---------------------------------------------------------------------------
protected function createComponentFormCountry() {
$form = new AppForm;
$form->addHidden('id_country', 0);
$form->addText('name', 'Country name:')
->addRule(Form::FILLED, 'Please, enter country name');
$form->addSubmit('submitted', 'Add');
$form->onSubmit[] = array($this, 'formCountrySubmitted');
return $form;
}
Obsluha onSubmit
// ---------------------------------------------------------------------------
public function formCountrySubmitted($form) {
...
$formValues = $form->getValues();
if(!is_numeric($formValues['id_country'])) {
// Vlozeni
} else {
// Editace
}
...
}
Render edit
// ---------------------------------------------------------------------------
public function renderEditCountry($id_country) {
$this->template->title = Environment::getVariable("title") . "Edit country";
$this['formCountry']['submitted']->caption = 'Update';
$country = $this->model->getCountry($id_country);
$this['formCountry']->setDefaults($country);
}
Tím jsem ukázal myšlenku, jak situaci řeším. Ale, mne zajímá, jestli
bych mohl, v renderEdit
nějakým způsobem ovlivnit validační
pravidla. Dejme tomu, že chci jednou formulářovou komponentou vkládat
uživatele a zároveň ho editovat. Při vkládání potřebuji položku
password
povinnou, stejně jako ověření hesla. Při editaci ale
chci, aby validační pravidlo fungovalo skrz
addCondition(Form::FILLED)
. Jak toho mám elegantně docílit?
Následující pokus v renderEdit
nefunguje, resp. Nette nehlásí
chybu, ale výsledek není dle očekávání – následující kód
„logicky“ původní pravidla nepřepíše.
...
$this['formCountry']['password']->addCondition(...)->addRule(...);
...
- Ondřej Mirtes
- Člen | 1536
Rozděl si to do dvou továrniček, přičemž druhá využije první.
protected function createComponentAddForm() {
$form = new AppForm;
//....
return $form;
}
protected function createComponentEditForm() {
$form = $this->createComponentAddForm();
// donastavení pro editaci
return $form;
}
- Ondřej Mirtes
- Člen | 1536
No tak si udělám obecnou metodu, která jen vytvoří základ formuláře, vytáhnu si jí v createComponentAddForm(), přidám jaká pravidla chci, to samé v createComponentEditForm() a je vyřešeno.
Strkat do továrničky nějaké podmínky podle action není čisté, nehledě na to, že tenhle postup nejde použít např. v komponentě.