Validace pro registeační formulář
- Raziner
- Člen | 5
Dobrý den, mám udělaný registrační formulář, který už je napojený na databázi, ale potřeboval bych udělat validaci pro email, aby nedocházelo k duplikování dat, ale sám nevím, jak to mám udělat. Sám s Nette ještě začínám a i s PHP, tak jestli by mi mohl někdo poradit. Byl bych za to velice vděčný! :)
HomepagePresenter:
namespace App\Presenters;
use Nette;
use Nette\Application\UI;
use Tomaj\Form\Renderer\BootstrapRenderer;
class HomepagePresenter extends Nette\Application\UI\Presenter
{
/** @var ArticleManager */
private $database;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
}
public function renderDefault()
{
$this->template->t_user = $this->database->table('t_user')
->order('created_at DESC')
->limit(5);
}
public function renderShow($postId)
{
$this->template->post = $this->database->table('t_user')->get($postId);
}
protected function createComponentLoginForm()
{
$form = new UI\Form;
$form->setRenderer(new BootstrapRenderer);
$form->addText('email', 'Email')
->setRequired('Prosím vyplňte email.');
$form->addPassword('password', 'Password')
->setRequired('Prosím vyplňte své heslo.');
$form->addSubmit('login', 'Login');
$form->onSuccess[] = [$this, 'loginFormSucceeded'];
return $form;
}
public function loginFormSucceeded(UI\Form $form, Nette\Utils\ArrayHash $values)
{
try {
$this->getUser()->login($values->email, $values->password);
$this->redirect('Logged:');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('Nesprávné přihlašovací jméno nebo heslo.');
}
}
protected function createComponentRegisterForm()
{
$form = new UI\Form;
$form->setRenderer(new BootstrapRenderer);
$form->addText('firstname', 'First Name')
->setRequired('Zadejte své jméno');
$form->addText('lastname', 'Last Name')
->setRequired('Zadejte své příjmení');
$form->addText('company', 'Company');
$form->addText('phone', 'Phone');
$form->addText('email', 'Email')
->setAttribute('class', 'form-control')
->setAttribute('placeholder', '@')
->addRule(UI\Form::EMAIL, 'Není platný e-mail!')
->setRequired('Email musí být vyplněn!')
->addRule(function($control){
return $this->database->email->getByName($control->value) ? TRUE : FALSE;
}, 'Zadaný email je již obsazený');
$form->addPassword('password', 'Password')
->setRequired('Zadejte své jméno')
->addRule(UI\Form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaky', 3);
$form->addSubmit('sign', 'Sign up');
$form->onSuccess[] = array($this, 'registerFormSucceeded');
return $form;
}
public function registerFormSucceeded($form, $values){
$this->database->table('t_user')->insert(array(
'auth_provider' => 'password',
'email' => $values['email'],
'firstname' => $values['firstname'],
'lastname' => $values['lastname'],
'company' => $values['company'],
'session' => $values['password'],
));
$this->flashMessage('confirmed', 'Confirmed');
$this->redirect('Register:');
}
}
- CZechBoY
- Člen | 3608
Vypadá to ± dobře, jen podmínka v té validaci je obráceně :-)
btw. doporučuju ještě přidat unikátní index nad sloupec
email
a v registerFormSucceeded
chytat výjimku
Nette\Database\UniqueConstraintViolationException
a podle toho
upravit flash message.
Dám ještě příklad
public function registerFormSucceeded($form, $values){
try {
$this->database->table('t_user')->insert(array(
'auth_provider' => 'password',
'email' => $values['email'],
'firstname' => $values['firstname'],
'lastname' => $values['lastname'],
'company' => $values['company'],
'session' => $values['password'],
));
} catch (\Nette\Database\UniqueConstraintViolationException $e) {
$this->flashMessage('Email exists', 'error');
return;
}
$this->flashMessage('confirmed', 'Confirmed');
$this->redirect('Register:');
}
Editoval CZechBoY (29. 5. 2018 11:55)
- Raziner
- Člen | 5
Ted mi to začalo hlásit tuhle chybu: Cannot read an undeclared property Nette\Database\Context::$email
a jedná se o tento řádek: return
$this->database->email->getByName($control->value) ? TRUE :
FALSE;
}, ‚Zadaný email je již obsazený‘);
EDIT: už jsem na to přišel, děkuju moc! :)
Editoval Raziner (29. 5. 2018 9:57)