Dynamická validace souhlasu hesla a kontrolního hesla ve formuláři
- m.brecher
- Generous Backer | 871
Ahoj,
Napsal jsem validaci souhlasu hesla a kontrolního hesla ve formuláři v serverové události onAnchor formuláře nějak takto (formulář je uvnitř UI\Control):
protected function createComponentForm(): BaseForm
{
$form = $this->formFactory->create();
$form->addPassword('password', 'Nové heslo', 15, 10)
->setRequired('Vyplňte nové heslo')
->addRule($form::MinLength, 'Heslo musí mít minimálně %d znaků', 6);
$form->addPassword('password_check', 'Nové heslo - kontrolní', 15, 10)
->setRequired('Vyplňte nové heslo - kontrolní');
$form->addSubmit(FormFactory::SubmitButton,'Odeslat!');
$form->onAnchor[] = function(BaseForm $form){
if($form->isValid() && $form['password']->getValue() !== $form['password_check']->getValue()){
$form->addError(''); // invalidate form
$this->flashMessage('Kontrolní heslo nesouhlasí', 'error');
}
};
$form->onSuccess[] = $this->handleSuccess(...);
return $form;
}
Sice to funguje, ale když je chyba v kontrolním hesle tak dojde k submitu formuláře a Google Chrome nabízí uložení neplatného hesla do prohlížeče – což není ideální. Lepší by tedy bylo validovat javascriptem.
Ale nepodařilo se mě v dokumentaci Nette Forms najít odpovídající validační prostředky. Existuje vůbec taková možnost? Nebo jde nějakým způsobem doplnit takovéto custom javascriptové validační pravidlo do netteForms.js?
Díky za jakýkoliv nápad.
- m.brecher
- Generous Backer | 871
@MarekBartoš
addConditionOn()
Díky za tip. Metodu addConditionOn() jsem zkoušel hned na začátku a neúspěšně. Zkusil jsem tedy předat do addRule() jako argument input:
$form->addPassword('password', 'Nové heslo', 15, 10)
->setRequired('Vyplňte nové heslo')
->addRule($form::MinLength, 'Heslo musí mít minimálně %d znaků', 6);
$form->addPassword('password_check', 'Nové heslo - kontrolní', 15, 10)
->setRequired('Vyplňte nové heslo - kontrolní')
->addRule($form::Equal, 'Kontrolní heslo nesouhlasí', $form['password']);
a pravidlo funguje dynamicky javascriptem i serverově, taky mě to mohlo napadnout dřív.
V dokumentaci jsem tento specifický případ použití addRule() nenašel, což by se mělo napravit. Napíšu PR.
- mskocik
- Člen | 62
m.brecher napsal(a):
V dokumentaci jsem tento specifický případ použití addRule() nenašel, což by se mělo napravit. Napíšu PR.
V časti Reference mezi prvky je presne to, čo popisuješ.
- m.brecher
- Generous Backer | 871
@mskocik
V časti Reference mezi prvky je presne to, čo popisuješ.
Díky za info. Je to tam koukal jsem do toho, protože „reference mezi prvky“ přitáhla moji pozornost ale nedošlo mě to.
Nicméně by neškodilo vyměnit ten čistě teoretický kód sample za příklad ověření hesla, který se často používá.