Změna validačního pravidla
- Kryšpin
- Člen | 27
Zdravím.
Chtěl bych se optat, zda lze změnit validační pravidlo dodané formuláři, který používám jak pro vkládání i editaci. V editaci už ale nechci mít podmínku FORM::FILLED.
Procházel jsem API a zdejší fórum a nějak jsem nic neobjevil – pokud to vůbec jde.
Díky za rady a nakopnutí.
- bojovyletoun
- Člen | 667
Třeba 2 továrničky, v té druhé si k prvku přidáš ruleZ na Form:FILED..
Nebo 1 továrnou a dáš tam nějakou podmínku ve
stylu if(!$editing)$form['text']->addRule(Filled,...)
- Kryšpin
- Člen | 27
Tak to udělám jako jednu továrničku.
Chci se ještě optat:
Doteď jsem měl továrničku (obecnou – využívanou pro Add)
<?php
protected function createComponentUzivatelForm($name)
{
$form = new AppForm($this, $name);
$form->addText('name', 'Jméno a příjmení:',30)
->addRule(Form::FILLED, 'Prosím zadejte jméno a příjmení uživatele.');
$form->addText('email', 'E-mail:',30)
->addRule(Form::FILLED, 'Prosím zadejte e-mail uživatele, který slouží zároveň jako přihlašovací jméno.')
->addRule(FORM::EMAIL, 'Nesprávný formát emailové adresy.')
->addRule(callback('Model::emailExists'), ('Tato emailová adresa už je používaná.'));
$form->addText('osobni_cislo', 'Osobní číslo:',30)
->addRule(Form::FILLED, 'Prosím zadejte osobní číslo.')
->addRule(FORM::INTEGER, 'Osobní číslo musí být číslo.')
->addRule(callback('Model::osobniCisloExists'), ('Toto osobní číslo je již používané.'));
$form->addSelect('role', 'Role:',array('user' => 'user'))
->addRule(Form::FILLED, 'Prosím vyberte roli uživatele.');
$form->addCheckbox('active', 'Aktivní');
$form->addPassword('password', 'Nové heslo:',30)
->addRule(Form::FILLED, 'Prosím zadejte nové heslo.')
->addRule(Form::MIN_LENGTH, 'Minimální délka hesla je %d znaků.', 6);
$form->addPassword('passworda', 'Znovu nové heslo:',30)
->addRule(Form::FILLED, 'Prosím zadejte znovu nové heslo.')
->addRule(Form::EQUAL, 'Hesla musí být stejné', $form['password']);
$form->addSubmit('add', 'Založit')->setAttribute('class', 'default');
$form->onSubmit[] = callback($this, 'uzivatelFormSubmitted');
$form->addProtection('Prosím pošlete tento formulář znovu (vypršel bezpečnostní token).');
return $form;
}
?>
a druhou pro editaci:
<?php
protected function createComponentUzivatelEditForm($name)
{
$editace = new EditUser;
$values = (array) $editace->Load($this->getParam('ida'));
$form = $this->createComponentUzivatelForm($name);
$form->onSubmit = NULL;
unset($form['add']);
//Zde zda by šlo unset na rules :o)
$form->addSubmit('save', 'Uložit')->setAttribute('class', 'default');
$form->onSubmit[] = callback($this, 'uzivatelFormSubmitted');
$form->addSubmit('del', 'Smazat už.')->setAttribute('class', 'default');
$form->onSubmit[] = callback($this, 'uzivatelFormSubmitted');
$presenter = $this;
$form->addSubmit('cancel', 'Zpět')->setAttribute('class', 'default')
->setValidationScope(FALSE)
->onClick[] = function () use ($presenter) {
$presenter->redirect('Admin:Uzivatele');
};
$form->setDefaults($values[0]);
$form['role']->setItems(Model::$s_role);
return $form;
}
?>
Ptám se proto, zda lze udělat unsetem zrušení validačních pravidel přiřazených první továrničkou. Pokud ne předělám to na jednu továrničku.
Editoval Kryšpin (6. 2. 2011 21:13)
- JakubJarabica
- Gold Partner | 184
V takýchto prípadoch v továrničke FILLED nepridám, ale až v konkrétnej akcii. Nepáčia sa mi všetky možné unsety, nie je to prehľadné. To isté napríklad s custom callbackami ako napr. test unikátnosti mailu, pri pridávaní sa berie voči celej DB a pri editácii treba exclude-núť aktuálne editovaný prvok. Podľa akcie teda viažem tieto custom callbacky v akciách.
<?php
public function actionAdd() {
$this['uzivatelEditForm']['meno_prvku']->addRule(Form::FILLED); /* len v akcii add sa bude požadovať filled */
}
?>
Edit: takto isto pridávam na formuláre, ktoré chcem mať ako add/edit submit callbacky. V každej akcii zvlášť(a radšej mám dve menšie funkcie userFormAdd a userFormEdit ako jednu veľkú s IFom na test akú akciu robím).
Editoval JAM3SoN (6. 2. 2011 21:26)