(re)storeRequest a flashMessage
- Majkl578
- Moderator | 1364
Zdravím,
při vytváření přihlašovacího systémku pro aplikaci jsem narazil na
problém.
Snažím se nastavit flashMessage a poté restorovat request a navrátit se na
původní stránku, to ale bohužel nefunguje, jelikož restoreRequest
přepíše nastavenou flash zprávu.
konkrétní kód:
<?php
//tento kód se vykoná v části presenteru, kde je vyžadováno přihlášení
if (!$this->user->isAuthenticated()) {
$this->flashMessage('Pro nahrání souboru se musít přihlásit');
$backlink = $this->getApplication()->storeRequest();
$this->redirect('Auth:login', $backlink); //backlink je persistent
}
?>
<?php
//toto se provede při úspěšném zpracování přihlašovacího formuláře
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Homepage:default');
?>
Revize 407.
Neví někdo jak dál? :)
EDIT: našel jsem toto: https://forum.nette.org/…flash-zpravy, ale je to jaksi staré. Stále se nepřišlo na řešení?
Editoval Majkl578 (11. 7. 2009 23:42)
- Ola
- Člen | 385
Hlásil jsem to spolu s další chybou, zatím bez odpovědi – zkus úpravu z bodu 1 v tomto tématu
- kravčo
- Člen | 721
Dlhšie som hľadal spôsob, ako to elegantne vyriešiť a stále s tým nie som úplne spokojný… zatiaľ som dospel k tomuto:
public function restoreRequest($key)
{
$session = $this->getSession()->getNamespace('Nette.Application/requests');
if (isset($session[$key])) {
$request = clone $session[$key];
unset($session[$key]);
$request->setFlag(PresenterRequest::RESTORED, TRUE);
+
+ // override flash message session in restored request.
+ $params = $request->getParams();
+ if ($this->presenter->hasFlashSession()) {
+ $params[Presenter::FLASH_KEY] = $this->presenter->getParam(Presenter::FLASH_KEY);
+ } else {
+ unset($params[Presenter::FLASH_KEY]);
+ }
+ $request->setParams($params);
+ // -----
+
+ if (!$request->isPost()) {
+ $destination = ':'. $request->getPresenterName() .':'. $params[Presenter::ACTION_KEY];
+ $this->presenter->redirect($destination, $params);
+ }
$this->presenter->terminate(new ForwardingResponse($request));
}
}
Funguje to tak, že flash session uloženého requestu zruší a prepíše aktuálnou (ak nejaká je). Zatiaľ som sa totiž nestretol s tým, že by som ukladal request s flash správou, ktorú by bolo treba zachovať…
- David Grudl
- Nette Core | 8218
Celá věc je značně složitější. Je potřeba ověřit, jestli znovu-přihlášený uživatel je ten stejný, jinak vznikne bezpečnostní díra. Jestli někdo pošle pull-request, rád ho přidám.