nastavení v addRule vlastní message podle typu chyby

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

Ahoj,
řeším takovou úlohu, chtěl bych, aby když zavolám v addRule nějaký vlastní validátor, tak aby uvnitř se ještě rozhodlo, jakou zprávu mi to zobrazí, když validator vrátí FALSE.

Jde něco takového?

Příklad v komponentě formuláře:

$form->addPassword('password', 'Heslo: *')
	->addRule($this->validatorPassword, 'Výchozí chybová zpráva');

public function validatorPassword(\Nette\Forms\IControl $control)
{
	// tady něco proběhne a vrátí druh chybové zprávy podle typu chyby
	$message = 'nová zpráva s chybou';

	// a toto nefunguje
	$control->setRequired($message);
	return FALSE;
}

Vůbec nevím zda něco takového možné je. Zkoušel jsem i do validatorPassword dát jako druhý parametr proměnnou s referencí, která by se uvnitř nastavila a do zprávy addRule napsat ‚%s‘. Ale ta proměnná s referencí neprojde.

Poradí někdo zkušenější, prosím? :)

Díky

freely111
Člen | 41
+
0
-

Už to asi mám, musí se zavolat $control->addError(‚nová zpráva s chybou‘). Ale výchozí zpráva musí být na něco nastavena (jinak hodí chybu, že chybí) a bohužel to vypíše v případě chyby obě zprávy, jak novou, tak i tu výchozí.

Jedině tedy jsem nastavil jako výchozí zprávu mezeru:

addRule($this->validatorPassword, ' ');

Celý příklad:

$form->addPassword('password', 'Heslo: *')
    ->addRule($this->validatorPassword, ' '); // tady musí být mezera, jinak se objeví i s novou zprávou

public function validatorPassword(\Nette\Forms\IControl $control)
{
    // tady něco proběhne a vrátí druh chybové zprávy podle typu chyby
    $message = 'nová zpráva s chybou';

    // a toto nefunguje
    $control->addError($message);
    return FALSE;
}

Neexistuje ale nějaké lepší řešení nastavení vlastní zprávy podle rozhodování uvnitř validátoru přes addRule?

igor.pocta
Člen | 100
+
0
-

Ahoj,

když přidáváš vlastní chybové hlášky, musíš je taky, pokud se nepletu, vypisovat ( $form->getOwnErrors() ).

Co tam zkusit vložit např. anonymní funkci, viz níže.

$form->addText('bankAccount', 'Číslo účtu pro zasílání mzdy na účet')
  ->setAttribute("placeholder", "Např. 0123456789/0300 nebo 000123-0123456789/0300")
  ->setRequired('Prosím doplňte Váš bankovní účet vč. kódu banky.')
  ->addRule(function($item) {
    return $this->validateBankAccount($item->value); // Vrací TRUE nebo FALSE
  }, 'Bankovní účet není platný.');

Editoval igor.pocta (19. 10. 2016 15:40)

jiri.pudil
Nette Blogger | 1032
+
+1
-

Takovouhle složitější validaci bych asi

  1. rozdělil na jednotlivá atomická pravidla a navěsil každé zvlášť s vlastní chybovou hláškou, anebo
  2. celou validaci navěsil až na $form->onValidate a volal tam addError dle libosti.

Editoval jiri.pudil (19. 10. 2016 15:47)

CZechBoY
Člen | 3608
+
0
-

@freely111 Můžeš použít událost onValidate, ale většinou se to používá na validaci třeba 2 souvisejících políček.

$form->onValidate[] = function (Form $form) {
	$passwordField = $form['password'];
	$passwordValue = $passwordField->getValue();

	if ($passwordValue !== 'mojetajneheslo') {
		$passwordField->addError('Heslo není "mojetajneheslo"');
	}
};

Pokud nemáš nějaký komplexní validační problém tak by možná stálo za to rozdělit tu validační funkci na několik addRule a každý pravidlo by mělo svojí hlášku.

freely111
Člen | 41
+
0
-

igor.pocta napsal(a):

Ahoj,

když přidáváš vlastní chybové hlášky, musíš je taky, pokud se nepletu, vypisovat ( $form->getOwnErrors() ).

Co tam zkusit vložit např. anonymní funkci, viz níže.

$form->addText('bankAccount', 'Číslo účtu pro zasílání mzdy na účet')
  ->setAttribute("placeholder", "Např. 0123456789/0300 nebo 000123-0123456789/0300")
  ->setRequired('Prosím doplňte Váš bankovní účet vč. kódu banky.')
  ->addRule(function($item) {
    return $this->validateBankAccount($item->value); // Vrací TRUE nebo FALSE
  }, 'Bankovní účet není platný.');

Nejsem si jist, zda jsem tě pochopil.

Jak bys udělal, aby ti $this->validateBankAccount($item->value, $newMessage) vrátilo sice bool, ale v %newMessage novou zprávu, kterou bys přepsal tu výchozí zprávu „Bankovní účet není platný“?

metoda validateBankAccount by vypadala takto:

public function validateBankAccount($value, &$newMessage)
{
	// vrací bool a v případě FALSE a typu chyby nastaví novou zprávu do $newMessage s referencí
}

a teď tu $newMessage nastavit tak, aby se vypsala místo té výchozí hlášky: Bankovní účet není platný

freely111
Člen | 41
+
0
-

CZechBoY napsal(a):

@freely111 Můžeš použít událost onValidate, ale většinou se to používá na validaci třeba 2 souvisejících políček.

$form->onValidate[] = function (Form $form) {
	$passwordField = $form['password'];
	$passwordValue = $passwordField->getValue();

	if ($passwordValue !== 'mojetajneheslo') {
		$passwordField->addError('Heslo není "mojetajneheslo"');
	}
};

Pokud nemáš nějaký komplexní validační problém tak by možná stálo za to rozdělit tu validační funkci na několik addRule a každý pravidlo by mělo svojí hlášku.

Díky za reakci. Přes onValidate jsem to dělat nechtěl, protože bych měl chybovou hlášku nad formulářem jako $form->addError(‚chyba‘).

Ale netrklo mě, že si vlastně mohu zavolat např. uvnitř onValidate události konkrétní input (Control) a do něj poslat chybu jako $passwordField->addError(‚Heslo není „mojetajneheslo“‘);

Takže díky za radu, tohle bude asi cesta jak si psal, pokud to elegantně nejde jak jsem chtěl přímo v addRule.

freely111
Člen | 41
+
0
-

jiri.pudil napsal(a):

Takovouhle složitější validaci bych asi

  1. rozdělil na jednotlivá atomická pravidla a navěsil každé zvlášť s vlastní chybovou hláškou, anebo
  2. celou validaci navěsil až na $form->onValidate a volal tam addError dle libosti.

Díky za návrh jako později uvedl CZechBoY. Bude to tedy asi lepší cesta, když to navrhujete, jestli nějak nejde přepsat ten konkrétní objekt Rule s vlastností message, který je v kolekci rules toho Control, tedy pokud jsem ten mechanismu uvnitř nette pochopil.