Změna validačního pravidla

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

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
+
0
-

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
+
0
-

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
+
0
-

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)

Kryšpin
Člen | 27
+
0
-

Tak jsem se nakonec vrátil ke dvěma továrničkám. Sic je to víc řádků, ale je to lépší :)