Ověření registračního formu
- wicked
- Člen | 290
Zdravím přátelé,
mam jeden menší dotaz. Mám form na registraci userů, po jeho vyplnění potřebuji, aby se nejdříve zobrazil form na ověření, zda je to zprávné (výpis údajů) a až potom možnost zaregistrovat, uložit do DB.
Reg. form:
public function createComponentRegistraceForm() {
$form = new Form();
$form->addText('username', 'Login:')
$form->addSubmit('registrovat', 'Zaregistrovat');
$form->onSubmit[] = $this->registracePotvrzeni;
return $form;
}
public function registracePotvrzeni($form) {
$values = $form->getValues();
$form = new Form();
$form->addText($values['username']);
$form->addSubmit('registrovat', 'Zaregistrovat');
$form->onSubmit[] = $this->registraceDokoncena;
return $form;
}
public function registraceDokoncena($form){
$values = $form->getValues();
unset($values['password1']);
dibi::query('insert into users', array(
'username' => $values['username']));
$this->flashMessage('Registrace byla úspěšná! Nyní se můžete přihlásit.');
$this->redirect('Homepage:');
Napadlo mě, že bych formu registraceForm() přidal $this->redirect(‚registrace:potvrzeni‘) a v tomto view bych vytvořil form registracePotvrzeni().
Bohužel ale, když do formu přidám zmiňovaný redirect, hází to chybu ale bez textu …
měl jsem to takto:
public function createComponentRegistraceForm() {
$form = new Form();
$form->addText('username', 'Login:')
$form->addSubmit('registrovat', 'Zaregistrovat');
$form->onSubmit[] = $this->redirect('registrace:potvrzeni');
return $form;
}
Nenapadá Vás jak toto řešit?
Editoval wicked (9. 6. 2013 9:06)
- pavelplzak
- Člen | 21
Vytvoř si akce pro registraci a potvrzení registrace, stejně tak dva formuláře. V onSuccess callbacku toho registračního formuláře si ty údaje ulož třeba do session a přesměruj na tu druhou akci s tím potvrzovacím formulářem, do jeho onSuccess callbacku dej to uložení do databáze.
- Etch
- Člen | 403
@wicked:
public function createComponentRegistraceForm() {
$control = new Form();
$control->addText('username', 'Login:')
$control->addSubmit('registrovat', 'Zaregistrovat');
$control->onSuccess[] = callback($this, 'registracePotvrzeni');
return $control;
}
public function createComponentPotvrzeniForm() {
$control = new Form();
$control->addHidden('username')
$control->addSubmit('registrovat', 'Zaregistrovat');
$control->onSuccess[] = callback($this, 'registraceDokoncena');
return $control;
}
public function registracePotvrzeni(Form $form){
$values = $form->values;
$session = $this->getSession('registrace');
$session->username = $values->username;
$this->redirect('potvrzeni');
}
public function actionPotvrzeni(){
$session = $this->getSession('registrace');
$this['potvrzeniForm']['username']->setValue($session->username);
unset($session);
}
Do redirectů si dej co potřebuješ a metodu
registraceDokoncena
si udělej jak potřebuješ.
PS: Psané na rychlo, takže nezaručuji, že v tom nejsou nějaké překlepy.
Editoval Etch (9. 6. 2013 11:18)
- Etch
- Člen | 403
Glottis napsal(a):
asi mi neco nedochazi ale proc by tam mel davat nejake hidden inputy kdyz to stejne ukladas do sessions?
No jednoduše nemusí. Záleží, jaké přesné požadavky na to bude mít.
Je zcela evidentní, že ten kód, který zde uvedl není kompletní.
Minimálně tam chybí položka ‚heslo‘ a ‚potvrzení hesla‘, protože
v metodě registraceDokoncena
volá
unset($values['password1']);
což jasně naznačuje, že tam ty
položky jsou.
metodě actionPotvrzeni
se stejně nevyhne, protože by
minimálně měl ověřit, jestli daná session opravdu existuje a pokud ne, tak
by měl přijít redirect zpět na registrační form.
Ten druhý formulář by tam teoreticky vůbec nemusel být a mohl by tam být pouze odkaz, protože by si všechny data mohl vytáhnout ze session. Druhý form (pole může mít klidně display: none) tam může dát, pokud chce, aby dané data ze session prošly znovu validací.
Celej ten kód nebyl psán ani tak z důvodu toho, aby mu dal přesný návod jak to udělat, ale aby mu vysvětlil jak se nastavuje callback pro onSuccess (onClick) a nutno ho tedy tak brát.