nastavení v addRule vlastní message podle typu chyby

- freely111
- Člen | 41
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
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
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 | 1034
Takovouhle složitější validaci bych asi
- rozdělil na jednotlivá atomická pravidla a navěsil každé zvlášť s vlastní chybovou hláškou, anebo
- celou validaci navěsil až na
$form->onValidatea volal tamaddErrordle libosti.
Editoval jiri.pudil (19. 10. 2016 15:47)

- CZechBoY
- Člen | 3608
@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
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
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
addRulea 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
jiri.pudil napsal(a):
Takovouhle složitější validaci bych asi
- rozdělil na jednotlivá atomická pravidla a navěsil každé zvlášť s vlastní chybovou hláškou, anebo
- celou validaci navěsil až na
$form->onValidatea volal tamaddErrordle 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.