form a handlery

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

Zdravim, potřebuju poradit. Nějak nechápu, kde a jak se mají volat handlery po zpracování formuláře.

Chci mít formulář pro přihlášení uživatele, kterej po odeslání vypíše chybu (pokud nastane). Ty chyby jsou dvě – neznámý uživatel a špatné heslo. Chyba se vypíše nad formulářem.

V presenteru mam takovýto kód:

<?php
class ProceedPresenter extends BasePresenter
{
	public function renderDefault()
	{
		$form = new Form;
		$form->addGroup('Přihlášení');
		$form->addText('name', 'Jméno', 20)
		->addRule(Form::FILLED, 'Vyplňte jméno');
		$form->addPassword('pass', 'Heslo', 20)
		->addRule(Form::FILLED, 'Vyplňte heslo');

		$form->addGroup();
		$form->addSubmit('submit1', 'Přihlásit se')
		->onClick[] = 'OkClickedHandler';
		// https://forum.nette.org/cs/839-best-practice-obsluha-formularu
		$this->template->form = $form;
	}
	public function OkClicked(SubmitButton $button)
	{
		$this->redirect('index.php');
	}
?>

Po odeslání formuláře k žádnému přesměrování nedojde. Myslim si totiž, že se kód nedostane ani do funkce OkClicked. Co dělám špatně? Ztrácim se v tom už totálně…

Ondřej Brejla
Člen | 746
+
0
-

Pořád to samé…hledat, továrničky, AppForm, …

class ProceedPresenter extends BasePresenter
{
        public function createComponentForm($name)
        {
                $form = new AppForm($this, $name);
                $form->addGroup('Přihlášení');
                $form->addText('name', 'Jméno', 20)
                ->addRule(Form::FILLED, 'Vyplňte jméno');
                $form->addPassword('pass', 'Heslo', 20)
                ->addRule(Form::FILLED, 'Vyplňte heslo');

                $form->addGroup();
                $form->addSubmit('submit1', 'Přihlásit se')->onClick[] = array($this, 'okClicked');
        }

        public function okClicked(SubmitButton $button)
        {
                // smth stf
        }
?>

V šabloně

{control form}

nezkoušel jsem…z hlavy…

Editoval Warden (18. 8. 2009 17:57)

kravčo
Člen | 721
+
0
-

Názov handlera musí pochopiteľne súhlasiť s menom funkcie („OkClickedHandler“ vs. „OkClicked“)

Navyše, keďže je handler metódou prezenteru, v callbacku to treba uviesť. Píše sa to i vo vlákne, ktoré si pripísal do odkazu… Takže správne:

class ProceedPresenter extends BasePresenter
{
    public function renderDefault()
    {
        // ...
        $form->addSubmit('submit1', 'Přihlásit se')
            // callback: array(<object>, <methodName>)
            ->onClick[] = array($this, 'OkClicked');
        // ...
    }
}

Dôležité je, že tieto handlery sa zavolajú len v prípade, že je formulár valídny. Pre opačný prípad treba pridať handler na udalosť onInvalidClick.

A tiež, ako píše Warden, použi AppForm a prečítaj si Správne vytváranie formulárov.

Editoval kravčo (18. 8. 2009 17:58)

bbb_
Člen | 11
+
0
-

zdravim, díky, oba jste mi pomohli, už mi to šlape, akorát jeden problém, chtěl bych vypisovat chybu do stejnýho template jako mam ten formulář, pro jistotu posílam ještě jednou celý kód:

<?php


require dirname(__FILE__).'../../models/MyAuthenticator.php';
class ProceedPresenter extends BasePresenter

{

	public function renderDefault()

	{

		$this->template->form = $this['form'];
	}
	protected function createComponentForm($name)
        {
		$form = new AppForm($this, $name);

		$form->addGroup('Přihlášení');
		$form->addText('name', 'Jméno', 20)
			->addRule(Form::FILLED, 'Vyplňte jméno');
		$form->addPassword('pass', 'Heslo', 20)
			->addRule(Form::FILLED, 'Vyplňte heslo');

		$form->addGroup();
		$form->addSubmit('submit1', 'Přihlásit se')->onClick[] = array($this, 'okClicked');

		return $form;
	}

	public function okClicked(SubmitButton $form)
	{

		$values = $form->form->getValues();

		$username = $values['name'];
		$password = $values['pass'];

		$user = Environment::getUser();

		// zaregistrujeme autentizační handler
		$user->setAuthenticationHandler(new MyAuthenticator);

		// nastavíme expiraci
		$user->setExpiration('+ 30 minutes');
		try {
        	// pokusíme se přihlásit uživatele...
			$user->authenticate($username, $password);
			// ...a v případě úspěchu presměrujeme na další stránku
			Environment::getHttpResponse()->redirect('index.php');

			} catch (AuthenticationException $e) {
			    $this->template->error = $e->getMessage();
			}



			// this is the end, my friend :-)

		if (empty($disableExit)) exit;
	}


}

?>

přihlašování funguje, ovšem jakmile nastane chyba, vypíše se na prázdnou stránku (ne nad formulář). myslim si, že tady odkazuju na neznámý template, jak to teda udělat?

<?php
} catch (AuthenticationException $e) {
$this->template->error = $e->getMessage();
}
?>

díky

jasir
Člen | 746
+
0
-

A tohle dělá co?

<?php
 ...
 if (empty($disableExit)) exit;
 ...
?>
bbb_
Člen | 11
+
0
-

jasně, už to funguje, je to totiž zkopírovaný z tutoriálu a uplně jsem to přehlíd. sem kokot, díky

jasir
Člen | 746
+
0
-

Jinak si ještě říkám k tomu tvému redirectu, jestli neni lepší použít

<?php
$this->redirect('JinyPresenter:jinaAkce');
?>
kravčo
Člen | 721
+
0
-

jasir napsal(a):

Jinak si ještě říkám k tomu tvému redirectu, jestli neni lepší použít

<?php
$this->redirect('JinyPresenter:jinaAkce');
?>

Určite je.


Navyše pri použití HTTP redirectu je nutné zavolať bezpodmienečný exit:

Environment::getHttpResponse()->redirect('index.php');
exit;