Registrace/ověření uživatele v db
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- mysak9
- Člen | 18
Zdravím,
prosím Vás o radu.
Mám reg. formulář a potřebuji ověřit zda již neexistuje v db. Přidal jsem ověření do presenteru, ale nyní mi pořád vyhazuje, že uživatel již existuje.
Prosím o radu, díky.
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\Passwords;
class RegPresenter extends Nette\Application\UI\Presenter
{
/**@var Nette\Database\context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
protected function createComponentRegistrationForm()
{
$form = new Form;
$form->addEmail('email', 'E-mail')
->setRequired('Prosím vyplňte e-mail');
$form->addText('username', 'Uživatelské jméno:')
->setRequired('Prosím vyplňte své uživatelské jméno.');
$form->addPassword('password', 'Heslo:')
->setRequired('Prosím vyplňte své heslo.')
->addRule(Form::MIN_LENGTH, 'Minimální délka hesla je %d znaků', 5);
$form->onSuccess[] = [$this, 'registrationFormSucceeded'];
$form->addSubmit('send', 'Přihlásit');
return $form;
}
Public function registrationFormSucceeded($form, $values)
{
$mail = $this->getParameter('email');
$existuje = $this->database->table('users')->get($mail);
if(!$existuje){
$this->flashMessage('Uživatel již existuje', 'warning');
$this->redirect('this');
}
else {
$values["password"] = Nette\Security\Passwords::hash('password');
$values["role"] = 'registred';
$this->database->table('users')->insert($values);
}
$this->flashMessage('Byl jste zaregistrován', 'success');
$this->redirect('Homepage:');
}
}
- JZechy
- Člen | 161
@mysak9 MEtoda get() vrací IRow nebo FALSE, pokud odpovídající záznam nebyl nalezen. Navíc to hledá podle primary key, což asi email nebude.
Jinak, proč nepoužiješ $form->getValues()? Mám dojem, že v tomhle případě getParameter() snad ani nic vrátit nemůže, protože formulář se odesílá postem né getem.
- mysak9
- Člen | 18
Tak jsem si hodil validaci přímo fo ->addRule a funguje v pohodě.
Pro začáteční učení stačí, následně asi bude lepší jí přepsat do modelu. Myslím, že asi nebude moc hodnotné psát dotaz přímo k formu, nebo né?
$form->addEmail('email', 'E-mail')
->setRequired('Prosím vyplňte e-mail')
->addRule(function ($control) {
return !$this->database->query('SELECT email FROM users WHERE email = ? LIMIT 1', $control->value)->fetch();
}, 'Uživatel existuje');