registrační formulář – vlastní validace
- Melmen
- Člen | 132
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
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
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
- voda
- Člen | 561
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
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 !