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
+
0
-

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
+
0
-

@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.

vitkutny
Člen | 73
+
0
-

máš tu podmínku opačně

$existuje = $this->database->table('users')->get($mail);
if( ! $existuje){
	$this->flashMessage('Uživatel již existuje', 'warning');
}

pokud uživatel neexistuje vypisuješ hlášku, že existuje

mysak9
Člen | 18
+
0
-

@vitkutny Podmínku jsem zkoušel prohodit, ale pak mi validace nefunguje vůbec a pustí to mail co již je v db.

mysak9
Člen | 18
+
0
-

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');