Jak na přesměrování formuláře při výskytu chyby v datech v Nette 2.1

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

Ahoj, prosím o radu na začátečnický dotaz k formulářům:

Mám přihlašovací formulář na url:
http://example.com/Sign/in

V SignPresenter.php mám nadefinovaný callback pro zpracování formuláře:

<?php
    public function signInFormSucceeded(Nette\Application\UI\Form $form)
    {
	$values = $form->getValues();

	try
	{
	    $this->getUser()->login($values->username , $values->password);
	    $this->redirect('Homepage:');
	}
	catch (Nette\Security\AuthenticationException $e)
	{
	    $form->addError($e->getMessage());
	}
    }
?>

Pokud nastane chyba (např. chybné heslo), tak se mi zobrazí formulář znovu s vypsanou chybou, ale v url je přidán parametr do=signInForm-submit. Pokud se refreshne stránka, tak se formulář znovu odešle. Tomu bych chtěl zabránit.

Rád bych, aby mi to po chybě spadlo opět na to http://example.com/Sign/in a současně, abych měl přístup k chybovým hláškám a ideálně i k původně vyplněným údajům, které prošly validací. Umí to nativní formuláře v Nette, nebo si to budu muset nějak modifikovat sám?

Děkuji za odpovědi.
Martin

kedrigern
Člen | 102
+
0
-

Nejsem si jist, tak bez mou odpověď s rezervou, ale:

V momentě, kdy zavoláš redirect (což bys musel, aby ses toho zbavil), tak se provede nový dotaz, čili se data vymažou. Čili bys na místo toho mohl mít např. persistentní parametr s chybou – což asi také nechceš.

Řešením IMHO bude javascriptové odeslání formuláře.

matin
Člen | 9
+
0
-

kedrigern napsal(a):

Nejsem si jist, tak bez mou odpověď s rezervou, ale:

V momentě, kdy zavoláš redirect (což bys musel, aby ses toho zbavil), tak se provede nový dotaz, čili se data vymažou. Čili bys na místo toho mohl mít např. persistentní parametr s chybou – což asi také nechceš.

Řešením IMHO bude javascriptové odeslání formuláře.

Jistě, řešení by se našlo dost, ať už to zasílat AJAXem nebo např. výsledek zpracování formuláře uložit do session a při opětovném zobrazení formuláře si načíst data a chyby, předvyplnit formulář a zobrazit chybové hlášky. Nicméně očekával jsem, že by to mohly nette formuláře už umět.

Díky za odpověď.

sKopheK
Člen | 207
+
0
-
public function signInFormSucceeded(Nette\Application\UI\Form $form)
{
    $values = $form->getValues();

    try
    {
        $this->getUser()->login($values->username , $values->password);
    }
    catch (Nette\Security\AuthenticationException $e)
    {
        $this->flashMessage($e->getMessage(), 'css-trida-pro-error');
    }
    $this->redirect('Homepage:');
}

Vyplněné údaje si zapamatuj v session a pak případně vlož do formuláře jako defaultního hodnotu, ale u hesla bych to nedoporučoval, protože to není bezpečné – nejjednodušší cesta k odkrytí hesla by pak byla jednoduše kouknout do zdrojového kódu.

Editoval sKopheK (7. 4. 2014 16:20)

Jan Suchánek
Člen | 404
+
0
-

@matin: Nemělo by to být spíš na Sign:in

public function signInFormSucceeded(Nette\Application\UI\Form $form)
{
    $values = $form->getValues();

    try
    {
		$this->getUser()->login($values->username , $values->password);
		// Redirect po úspěšném přihlášení
		$this->redirect('Homepage:');
    }
    catch (Nette\Security\AuthenticationException $e)
    {
        $this->flashMessage($e->getMessage(), 'css-trida-pro-error');
    }

    // redirect na přihlašovací formulář
    $this->redirect('Sign:in');
}

Editoval jenicek (7. 4. 2014 16:48)

matin
Člen | 9
+
0
-

@sKophek:

Dík za odpověď. Přesně takto na to půjdu.

K tomu heslu – však ve zdrojáku by se taky objevily hvězdičky ne? :D
Heslo bych určitě nepředvyplňoval, jednak mně moc nenapadá situace, kdy by se to hodilo a navíc takovéto nejzákladnější základní základy mi jsou dnes už jasné.

@jenicek:

Ta otázka asi neměla jít na mně, ale máš pravdu, při chybě zpět na Sign:in. Díky za upřesnění.

Editoval matin (7. 4. 2014 17:10)