(re)storeRequest a flashMessage

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

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

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

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ť…

Vyki
Člen | 388
+
0
-

Jeden dotaz. Co brání tomu, že to ještě není implementováno? V pohodě to běhá a ten původní bug to řeší. Kde je roblém?

Honza Kuchař
Člen | 1662
+
0
-

Oživuji.

frosty22
Člen | 373
+
0
-

Souhlasím s Vyki, již je to opět skorem rok a není implementováno? Nyní jsem se právě setkal s tímto požadavek restore request + flash message, a tato kravčova úprava to vyřešila, čili to má nějaké jiné mouchy? či se to jen pozapomnělo implementovat :)

David Grudl
Nette Core | 8228
+
0
-

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.

David Grudl
Nette Core | 8228
+
0
-

fixed