Diskuze: Problém s validáciou formulára

PHP Nette Framework Nette framework Problém s validáciou formulára

Avatar
Dominik Gavrecký:

Ahojte,

natrafil som na celkom zaujímavý problém. Vytvoril som si formulár a následne validáciu a success. Problém je v tom že ak sa password != passwordVerify chybu vyhodí ale príkaz sa vykoná teda zapíše uživateľa do DB.

/**
 * @return Form
 * Vytvára a vracia komponentu formulára pre registráciu
 */
protected function createComponentRegistrationForm()
{
    $form = new Form;

    $form->addText('username')
        ->setAttribute('placeholder', 'Použivateľské meno')
        ->setRequired();

    $form->addPassword('password')
        ->setAttribute('placeholder', 'Heslo')
        ->addRule(Form::MIN_LENGTH, 'Heslo musí obsahovať minimálne 6 znakov.', 6)
        ->setRequired();

    $form->addPassword('passwordVerify')
        ->setAttribute('placeholder', 'Heslo znovu')
        ->addRule(Form::EQUAL, 'Hesla sa nezhodujú.', $form['password']);

    $form->addText('email')
        ->setAttribute('placeholder', 'E-mail')
        ->setType('email')
        ->setRequired();

    $form->addSubmit('submit', 'Registrovať sa');

    $form->onValidate[] = [$this, 'registrationFormValidate'];
    $form->onSuccess[] = [$this, 'registrationFormSuccess'];

    return $form;
}

/**
 * @param Form $form Formulár pre registráciu
 * @param ArrayHash $values Hodnoty z formulára
 * Callback pre validáciu formulára pre registráciu
 */
public function registrationFormValidate($form, $values)
{
    try {
        $this->userManager->register($values);
    } catch (DuplicateNameException $e) {
        $form->addError($e->getMessage());
    }
}

/**
 * @param Form $form Formulár pre registráciu
 * @param ArrayHash $values Hodnoty z formulára
 * Callback po odoslaní formulára pre registráciu
 */
public function registrationFormSuccess(Form $form, $values)
{
    $this->flashMessage('Pre úspešne dokončenie registrácie potvrďte potvrdzovací email.');
    $this->redirect('this');

}

{form registrationForm}
<ul class="errors" n:if="$form->hasErrors()">
    <li n:foreach="$form->errors as $error">{$error}</li>
</ul>
<div class="row">
    <div class="col-lg-12 m-sm">
        <span><i class="fa fa-user" aria-hidden="true"></i></span>
        {input username}
    </div>
</div>
<div class="row">
    <div class="col-lg-12 m-sm">
        <span><i class="fa fa-key" aria-hidden="true"></i></span>
        {input password}
    </div>
</div>
<div class="row">
    <div class="col-lg-12 m-sm">
        <span><i class="fa fa-key" aria-hidden="true"></i></span>
        {input passwordVerify}
    </div>
</div>
<div class="row">
    <div class="col-lg-12 m-sm">
        <span><i class="fa fa-envelope-o" aria-hidden="true"></i></span>
        {input email}
    </div>
</div>
<div class="row">
    <div class="col-lg-12 m-sm">
        {input submit}
    </div>
</div>
{/form}

/**
 * Registruje nového uživateľa do systému.
 * @param ArrayHash $values Hodnoty z formu
 * @throws DuplicateNameException Ak uživateľ s uvedením menom už existuje
 */
public function register($values)
{
    try {
        $this->database->table(self::USERS_TABLE)->insert(array(
            self::COLUMN_NAME => $values->username,
            self::COLUMN_PASSWORD_HASH => Passwords::hash($values->password),
            self::COLUMN_ROLE => 'user',
            self::COLUMN_EMAIL => $values->email
        ));
    } catch (UniqueConstraintViolationException $e) {
        throw new DuplicateNameException;
    }
}
Editováno 22. června 17:34
Odpovědět 22. června 17:34
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na Dominik Gavrecký
Martin Konečný (pavelco1998):

Událost onValidate nepoužívám, ale neni problém náhodou v tom, že se ta metoda volá ještě dřív, než se zvalidují všechny inputy?
Resp. během procesu validace už vkládáš uživatele do DB. To řeš až v metodě registrationFor­mSuccess.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 22. června 17:59
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Dominik Gavrecký:

Taká hlúposť a nenapadlo ma to ... Ďakujem ti za pomoc

Nahoru Odpovědět 22. června 18:08
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.