Validace pro registeační formulář

Raziner
Člen | 5
+
0
-

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

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

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)

Kcko
Člen | 470
+
+1
-

@CZechBoY v čem je to lepší než když si udělá vlastní logiku a oveření do onValidate[]? Nikam nebude formulář přesměrovávat, chybovku může přidat nad formulář nebo k řádku s e-mailem.

CZechBoY
Člen | 3608
+
0
-

@Kcko Na co reaguješ? On má vlastní rule, onValidate už teda nepotřebuje.