Přesměrování zpět na stránku produktu po přidání do košíku
- simon
- Člen | 98
Zdravim,
tvorim si jednoduchy eshop.
Mam nasledujici situaci:
Uzivatel je na strance produktu, klikne na pridat do kosiku. Formular odesle
POST pozadavek na pridani do kosiku na preseter kosik s metodou add
(/shop/kosik/add/). Produkt se prida, vytvori se flashmessage o uspesnem
pridani.
Nyni bych chtel presmerovat uzivatele zpatky na stranku produktu a tam
zobrazit oznameni o pridani.
Nevim vsak jak to elegantne udelat. Pozadavem na pridani produktu do kosiku muze
prijit z ruznych stranek, treba z katalogu produktu atd. ale vzdy v ramci
produktu.
Musim si tedy nejak zapamatovat stranku odkud prisel pozadavek na pridani do kosiku a na tu zpatky presmerovat.
Prosim jak to udelat elegantne a bezpecne? Napadl me referer, ale ten se da podvrhnout.
Predem dekuji.
- vlki
- Člen | 218
Doporučuju se podívat na ukázku CD-collection z distribuce. V Presenteru
DashboardPresenter
je před redirectem na
AuthPresenter
aktuální požadavek uložen. A při zpracování
přihlašovacího formuláře zase vyvolán zpět.
Přesměrování (přesněji forward) se provede rovnou v rámci metody
restoreRequest
. Pokud požadavek v session uložen není, přejde
se na ten redirect co následuje.
- vlki
- Člen | 218
Jojo, o tom se koukám ví už od ledna
. Problém je v tom, že se při forwardu blbě předávají
parametry. On se vlastně znovu vyvolá ten požadavek na aplikaci, který
byl v okamžiku, kdy bylo chtěno přejít do košíku. A vzhledem k tomu,
že flash zprávy jsou identifikovány v požadavku (parametr _fid), tak se ty
parametry z aktuálního průběhu aplikace vůbec neberou v potaz.
A osobně mě taky moc řešení nenapadá. Uložit před tím natvrdo do session a pak vybrat by dělalo problémy při více otevřených oknech s aplikací.
Proč tam vůbec nemůže být redirect místo forwardu?
EDIT: Editovat požadavek je moc velká prasárna?:) Třeba přidat nějaký prostor v rámci požadavku jen pro flash zprávy…?
Editoval vlki (18. 8. 2009 22:25)
- PetrP
- Člen | 587
Ve verzi 0.9 se už flash zprávy předávají i při forwardu (respektive restoreRequestu).
Při použití 0.8 se nabízí asi několik řešení,
přejít na 0.9 (nejlepší)
zachytit ForwardException a upravit ho (jak píše vlky)
napsat si vlastní obsluhu restoreRequestu (je uložena v
$application->getSession()->getNamespace('Nette.Application/requests')
podle toho _fid klíče)
Proč tam vůbec nemůže být redirect místo forwardu?
To je z toho důvodu že například odeslaný formulář tě odkaže na přihlášení a po přihlášení se ten odesláný formaláře dokončí. Při klasických get požadavcích stejně nakonec autoCanonizace způsobí redirect.
- David Grudl
- Nette Core | 8254
O problému vím, ale řešení není triviální, takže to bude chvilku trvat. Zatím je asi nejvhodnější skutečně pozměnit objekt $request.