Problem s $this->restoreRequest, $this->storeRequest() pri prihlasovani
- Willik
- Člen | 19
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
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
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
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
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)
- Tharos
- Člen | 1030
@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.