Přesměrování zpět na stránku produktu po přidání do košíku

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

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

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.

simon
Člen | 98
+
0
-

Diky moc, to bude presne ono.

Jen mam jeste problemy s flash message. Pro pouziti ulozeni pozadavku mi nejak nefungujou.

<?php

public function renderAdd() {
        $this->flashMessage("Produkt byl úspěšně přidán");

        $this->getApplication()->restoreRequest($this->backlink);
        $this->redirect("Kosik:");

    }

?>

k presmerovani dojde ale k vypsani zpravy uz ne. pokud pouziji proste presmerovani na kosik tak to funguje.

vlki
Člen | 218
+
0
-

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)

simon
Člen | 98
+
0
-

aha, takze jsem v loji:(

PetrP
Člen | 587
+
0
-

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.

simon
Člen | 98
+
0
-

Asi neco delam spatne ale zpravy se mi pri restoreRequest nepredavaji ani ve verzi 0.9. stahnul jsem si posledni stable verzi 0.9 a tam to nejede.

obnoveni requestu se v poradku provede ale flash zprava se nezobrazi.

prosim tedy o radu co s tim.

simon
Člen | 98
+
0
-

jen se pripominam se svym problemem… nevite prosim co s tim? predem diky

David Grudl
Nette Core | 8157
+
0
-

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.