registrační formulář – vlastní validace

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Melmen
Člen | 132
+
0
-

Ahoj,
Potřeboval bych pomoct s vlastní validací ve formuláři. Jedná se o registrační formulář, tudíž bych potřeboval zjistit, jestli je uživatelské jméno a email volné.

Jen podotýkám že používám NotORM a Diggriolu z kuchařky

Můj UserPresenter:

<?php
use Nette\Application\UI;
class UserPresenter extends BasePresenter{


    public function renderDefault(){

    }



    protected function createComponentRegistrationForm(){

        $form = new UI\Form;
        $form->addText('username', 'Uživatelské jméno')
             ->addRule(function (Nette\Forms\IFormControl $control) {
          return (bool) $this->getModel('user')->findByUserUsername($control->getValue);
     }, 'Uživatelské jméno je již použité');

        $form->addText('email', 'E-mail');

        $form->addPassword('password', 'Heslo');

        $form->addPassword('2ndpass', 'Heslo pro kontrolu')
                ->addRule(UI\Form::FILLED, 'Zadejte heslo ještě jednou pro kontrolu')
    ->addRule(UI\Form::EQUAL, 'Zadané hesla se neshodují', $form['password']); ;

        $form->addSubmit('submit', 'Vytvořit účet');

        $form->onSuccess[] = callback($this, 'registrationFormSubmitted');


        return $form;
    }



    public function registrationFormSubmitted($form)
    {
        $data = $form->getForm()->getValues();
        unset($data['2ndpass']);
        $data['password'] = md5($data['password']);

        $cas= new Nette\DateTime;
        $data['registered'] = $cas;
        $this->template->data = $data;
        //dump($data);
        $this->getModel('user')->insert( (array) $data);
    }

}

A laděnka mi vyhazuje chybu

Recoverable Error

Argument 1 passed to {closure}() must be an instance of Nette\Forms\IFormControl, instance of Nette\Forms\Controls\TextInput given
Filip Procházka
Moderator | 4668
+
0
-
Argument 1 passed to {closure}() must be an instance of Nette\Forms\IFormControl, instance of Nette\Forms\Controls\TextInput given

První argument předaný do klošury musí být instance Nette\Forms\IFormControl (protože si to vynucuješ), předána ale byla instance Nette\Forms\Controls\TextInput.

Malá nápověda: https://api.nette.org/…Control.html

Melmen
Člen | 132
+
0
-

Pokud to změním na IControl, dostanu chybu

Using $this when not in object context

Někde na fóru jsem četl že musím napsat něco jako $_this = $this a pak k tý funkci přidám use ($_this), takže bude vypadat nějak takhle

->addRule(function (Nette\Forms\IControl $control) use ($_this) {
         return (bool) $_this->getModel('user')->findByUserUsername($control->getValue);
    }, 'Uživatelské jméno je již použité');

Ale vyskočí na mě chyba

Call to undefined method UserPresenter::getModel().

getModel() mám ale BasePresenteru :D

Filip Procházka
Moderator | 4668
+
0
-

Otázka je, jestli UserPresenter dědí od BasePresenteru :)

voda
Člen | 561
+
0
-

Pokud není getModel public, tak to nebude fungovat. Předával bych rovnou model:

$model = $this->getModel('user');
...->addRule(function (Nette\Forms\IControl $control) use ($model) {
         return (bool) $model->findByUserUsername($control->getValue);
    }, 'Uživatelské jméno je již použité');
Melmen
Člen | 132
+
0
-

voda

máš pravdu, getModel() je v BasePresenteru protected.
Pro úplnost kompletní presenter:

<?php
use Nette\Application\UI;
class UserPresenter extends BasePresenter{


    public function renderDefault(){

    }



    protected function createComponentRegistrationForm($form){
        $model = $this->getModel('user');
        $form = new UI\Form;
        $form->addText('username', 'Uživatelské jméno')
             ->addRule(function (Nette\Forms\IControl $control) use ($model) {
          return (bool) $model->where('username', $control->getValue());
     }, 'Uživatelské jméno je již použité');

        $form->addText('email', 'Uživatelské jméno')
             ->addRule(function (Nette\Forms\IControl $control) use ($model) {
          return (bool) $model->where('email', $control->getValue());
     }, 'Uživatel s tímto emailem je již registrován');

        $form->addPassword('password', 'Heslo');

        $form->addPassword('2ndpass', 'Heslo pro kontrolu')
                ->addRule(UI\Form::FILLED, 'Zadejte heslo ještě jednou pro kontrolu')
    ->addRule(UI\Form::EQUAL, 'Zadané hesla se neshodují', $form['password']); ;

        $form->addSubmit('submit', 'Vytvořit účet');

        $form->onSuccess[] = callback($this, 'registrationFormSubmitted');


        return $form;
    }



    public function registrationFormSubmitted($form)
    {
        $data = $form->getForm()->getValues();
        unset($data['2ndpass']);
        $data['password'] = md5($data['password']);

        $cas= new Nette\DateTime;
        $data['registered'] = $cas;
        $this->template->data = $data;

        //$this->getModel('user')->insert( (array) $data);
    }

}

Oboum moc díky za pomoc !