Jak na přesměrování formuláře při výskytu chyby v datech v Nette 2.1
- matin
- Člen | 9
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
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
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
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
@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
@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)