Samostatné použití nette/forms – vyplnění formuláře při chybě
- Aishak
- Člen | 30
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
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
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
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
<?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;
}
}
?>