Vlastní validace nestaticky a chyba z validatoru

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

Potřebuji validaci, kdy zkontroluji, zda v textu není některé ze zákazaných slov v databázi. Jde to přes onValidate samozřejmě. Ale vzhledem k tomu, že to použiji na dvou místehc, bylo by vhodnější vlastní validační pravidlo. Jde to nějak? Co jsem koukal, tak všechny ukázky jsou jedině přes statiku, což se mi moc nechce, vzhledem k tomu, že potřebuji injektnout databázi apod.

A druhá věc potřebuji také dostat z té validace zpět, která ta slova jsou závádná. Jde to vůbec, aby se to pak vypsalo z toho validátoru do chybové hlášky? Třeba i v případě closure v addRule?

Pavel Kravčík
Člen | 1196
+
0
-

Do add rule se dá vložit callback, to nestačí?

Zpětné posílání by se možná dalo vyřešit manuálním vykreslením té části, něco jako tohle:

	$form->addRule(function($control){
		$array = $this->Model->checkWords($control->value);

		if($array)
		{
			foreach($array as $error) //error je například "zend" nebo "symfony"
			{
				$form['component']->addError($error);
			}
		}
	});

	// A v manuálním vykreslení si jednoduše zkontroluješ, co má komponenta za chyby.

	{foreach $form['component']->errors as $error}
		<span class="form-error">Slovo $error nelze použít</span>
	{/foreach}
CZechBoY
Člen | 3608
+
0
-

Tak mělo by jít přidat klasický pravidlo. Já to používám třeba pro validaci hesla.

protected function createComponentForm()
{
	$form = new Form;
	$form->addIp('abc')
		->addRule([$this, 'validatePassword'], 'špatný heslo', $this->userIdentity->username);
}

public function validatePassword(TextInput $pwdInput, $username = null)
{
	if ($pwdInput->getValue() === 'tajneheslo' && $username === 'tajneheslo') {
		return true;
	}

	$pwdInput->addError('Heslo "' . $pwdInput->getValue() . '" je špatné pro uživatele "' . $username . '".');

	return false;
}