Dynamická validace souhlasu hesla a kontrolního hesla ve formuláři

m.brecher
Generous Backer | 758
+
0
-

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.

Marek Bartoš
Nette Blogger | 1173
+
+2
-

addConditionOn()

Editoval Marek Bartoš (30. 5. 2023 19:01)

m.brecher
Generous Backer | 758
+
0
-

@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 | 53
+
+3
-

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 | 758
+
-2
-

@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á.