Ověření registračního formu

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

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

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.

wicked
Člen | 290
+
0
-

Wow, děkuji za radu … ale teď po pravdě, vůbec nevím, jak to myslíš? Nemůžeš prosím nakopnout nějak blíž?

Etch
Člen | 403
+
0
-

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

Glottis
Člen | 129
+
0
-

asi mi neco nedochazi ale proc by tam mel davat nejake hidden inputy kdyz to stejne ukladas do sessions?

Etch
Člen | 403
+
0
-

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.

Glottis
Člen | 129
+
0
-

jasny :) ja se ptal hlavne proto, jestli se tam neskryva neco zajimaveho a neprinese to nejakou vyhodu.