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 | 1032
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->onValidate
a volal tamaddError
dle 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
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
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->onValidate
a volal tamaddError
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.