Problem s $this->restoreRequest, $this->storeRequest() pri prihlasovani

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

Zdravim,
mam takovy problem s redirectem:

$testRouter = new RouteList('Test');


$testRouter[] = new Route('/skolni/<id>', [
             'presenter' => 'Skola',
            'action' => 'default',
            'id' => NULL,
        ]);

adresa neco.tstdomena.cz/skola/prvni

tedy pokud ma stanka v adrese /skolni – preda se zpracovani presenteru Skola v modulu Test, akce bude vzdy deafult, id pak urcuje ktery test

pokud uzivatel neni prihlaseny, tak se musi prihlasit a kdyz vyplni spatne prihlasovaci udaje,
je presmerovan na neco.tstdomena.cz/uzivatel/prihlaseni/, kde bude mit zase login form a pokud se uspesne prihlasi, tak ho chci presmerovat zpet na neco.tstdomena.cz/skola/prvni

problem je , ze $this->restoreRequest($this->backLink) ho forwarduje jen na modul:presenter:action , ale uz ne na to id

Da se nejak po tom opravnem prihlaseni presmerovat na ten puvodni request neco.tstdomena.cz/skola/prvni ?

Za rady predem dekuju.

Editoval Willik (16. 10. 2016 18:00)

Oli
Člen | 1215
+
0
-

Nejsem si jistej, ale obávám se že automaticky nedá. Ten backLink je informace odkud uživatel přišel. To znamená jeden krok zpět. Dva kroky zpět si to nette nepamatuje. Takže ideální asi bude pokud se přihlásí špatně, tak si do session uložit ten backLink a přesměrovat na ten login page. V login page pokud se přihlásí dobře, tak si ze session vytáhnout tu původní adresu a přesměrovat na ni.

Takhle bych to řešil já, ale je možný že to má nette nějak vyřešený, jen o tom nevím :)

Willik
Člen | 19
+
0
-

Jsem to zkusil dumpnout po tom forwardu pres $this->restoreRequest($this->backLink)

if ($this->request->hasFlag(\Nette\Application\Request::RESTORED)) {

    \dump($this->link('this'));
   }

„/skolni/“

bohuzel tam nerestorne tu cast id

Myslel jsem jestli to uz nekdo neresil, ze bych se rad priucil :-)

Tharos
Člen | 1030
+
0
-

Myslím, že by to neměl být problém.

Vestavěné storeRequest pracuje se session, přežije libovolný počet redirectů, jen se musí nějakým způsobem zajistit předání klíče napříč těmi requesty (standardně se předává v URL).

Tak, jak to popisuješ, to skoro zní, jako kdyby se špatně serializoval do session Request (jako kdyby se ztratilo to id), ale tomu moc nevěřím. :)

Nedokázal bys problém nasimulovat třeba na čistém sandboxu? Já bych ti mohl napsat kód, ve kterém by to fungovalo, ale nejsem si úplně jist, zda bych přesně vystihl tvou situaci…

Willik
Člen | 19
+
0
-

Zatim dekuju, urcite se k tomu vratim.
Zatim jsem to vyresil pres tu session – do ni si ulozim pri tom prvnim neuspesnem prihlaseni $this->getHttpRequest()->url->path , presmeruju na tu prihlasovaci stranku (pritom jsem tam nechal to storeRequest) a a pokud se uspesne prihlasi, tak po forwardu pres restoreRequest udelam ve startupu ten redirect pokud je $this->request->hasFlag(\Nette\Application\Request::RESTORED)
Vim, ze je to zdvojeni, ale prozatim to dela, co potrebuju a az doresim dalsi, tak se k tomu vratim.

Editoval Willik (16. 10. 2016 19:23)

Oli
Člen | 1215
+
0
-

@Tharos chápu dobře, že si nette pamatuje celou historii procházení (sezení)?

Tharos
Člen | 1030
+
+1
-

@oli Úplně celou ne, do session se uloží jen ten request, u kterého se to vyžádá.

Implementace Presenter::storeRequest je docela triviální. Ten klíč pak plní podobnou funkci, jako například _fid u flash zpráv.