Samostatné použití nette/forms – vyplnění formuláře při chybě

Aishak
Člen | 30
+
0
-

Zdravím, nyní používám v samostatném projektu bez Nette frameworku (sandbox) formuláře nette/forms. Vše funguje správně dle dokumentace, ale po „vyplivnutí“ chybové zprávy do formuláře se stránka překreslí a vyplněná data ve formuláři nejsou, chybové hlášky ano. Nevěděl by někdo co s tím? Děkuji

<?php
$form['password']->addError('Heslo není správné!');
?>
Phalanx
Člen | 310
+
0
-

https://doc.nette.org/…s/validation#…

<?php
public function validateSignInForm(Form $form): void
{
    $values = $form->getValues();

    if (...) { // validační podmínka
        $form->addError('...');
    }
}
?>

Myslím si, že máš v následném kódu redirect. Pokud ošetřuješ až v onSuccess, tak přidej hned za validační podmínku return (ať se nepokračuje na ty následné redirecty).

<?php
    if (...) { // validační podmínka
        $form->addError('...');
    	return;
	}

?>
Aishak
Člen | 30
+
0
-

Bohužel to samé se děje v případě, kdy používám:

<?php
$form->onValidate[] = [$this, 'validatePassword'];
?>

Tam by k redirectu nemělo docházet i bez použití

<?php
return;
?>

nebo se pletu?
Pokud použiji return; tak se mi již nevykreslí znovu formulář. Ale to už bude chyba u mě, protože mám vytvoření formuláře i render v jedné metodě.

Phalanx
Člen | 310
+
0
-

Doporučuju oddělit do komponenty:
https://doc.nette.org/…s/form-reuse

Případně sem dej celý kód, jestli můžeš

Aishak
Člen | 30
+
0
-
<?php
declare(strict_types=1);

use Nette\Forms\Form;

/**
 * Class LoginForm
 */
class LoginForm
{
    /**
     * @var wpdb
     */
    private $db;

    /**
     * @var WP_Error
     */
    private $errors;


    /**
     * NetvorLogin constructor.
     *
     * @param wpdb $wpdb
     */
    public function __construct(wpdb $wpdb)
    {
        $this->db = $wpdb;
        $this->errors = new WP_Error();
    }


    /**
     * Generate login form
     */
    public function createLoginForm()
    {
        $form = new Form();
        $form->addText('email', 'E-mail')
            ->setRequired('Toto pole je povinné');
        $form->addPassword('password', 'Heslo:')
            ->setRequired('Toto pole je povinné');
        $form->addSubmit('loginSubmit', 'Přihlásit se');
        $form->addProtection('Vypršel časový limit, odešlete formulář znovu');

        if ($form->isSuccess()) {
            $values = $form->getValues();
            try {
                $login = $this->procceedLogin($values);
            } catch (InvalidUserException $invalidUserException) {
                $form->addError($invalidUserException->getMessage());
            } catch (InactiveUserException $inactiveUserException) {
                $form->addError($inactiveUserException->getMessage());
            }
            if ($login) {
                wp_safe_redirect(home_url());
            }
        }

        $form->render('begin'); ?>
        <?php $form->render('ownErrors') ?>
        <div class="textfield">
            <label for="email" class="textfield__label is-required">E-mail:</label>
            <input type="text" name="email" id="email" class="textfield__input" required/>
            <?php if ($form['email']->getError()) { ?>
                <div class="textfield__error"><?php echo $form['email']->getError(); ?></div>
            <?php } ?>
        </div>

        <div class="textfield">
            <label for="password" class="textfield__label is-required">Heslo:</label>
            <input type="password" name="password" class="textfield__input" id="password" required/>
            <?php if ($form['password']->getError()) { ?>
                <div class="textfield__error"><?php echo $form['password']->getError(); ?></div>
            <?php } ?>
        </div>

        <div class="login-btns">
            <button name="loginSubmit" class="login-btns__item btn">Přihlásit se</button>
            <a href="#" class="login-btns__item btn btn--inverse">Zapomenuté heslo</a>
        </div>
        <?php
        $form->render('end');

        return $form;
    }


    /**
     * @param $username
     *
     * @return bool
     */
    public function isUserActive($username)
    {
        $active = $this->db->get_var("SELECT user_status FROM {$this->db->prefix}users WHERE user_login = '$username'");
        if ($active == '1') {
            return true;
        } else {
            return false;
        }
    }


    /**
     * @param $values
     *
     * @return bool
     * @throws InactiveUserException
     * @throws InvalidUserException
     */
    private function procceedLogin($values)
    {
        if (count($this->errors->get_error_messages()) < 1) {
            $active = $this->isUserActive($values->email);
            if (!$active) {
                throw new InactiveUserException('Uživatel není aktivní. Prosíme, zkontrolujte si e-mailovou schránku, kde naleznete aktivační e-mail.');
            }
            $creds = [
                'user_login' => $values->email,
                'user_password' => $values->password,
                'remember' => true
            ];
            $user = wp_signon($creds, is_ssl());
            if (is_wp_error($user)) {
                throw new InvalidUserException('Uživatelské jméno nebo heslo je špatné');
            }
            return true;
        }
        return false;
    }
}
?>