Kuchařka: Jak po odeslání formuláře zobrazit stejnou stránku? – prosím o revizi
- Tomáš Votruba
- Moderator | 1114
Zkusil jsem sesmolit návod pro re/storeRequest
: https://doc.nette.org/…tore-request.
Prosím o revizi, případně pokud existují další/lepší cesty, prosím
o doplnění.
Díky :)
EDIT: Link fix.
Editoval Schmutzka (23. 3. 2012 22:26)
- nanuqcz
- Člen | 822
Ahoj, díky za návod :-)
Nepochopil jsem jen jednu věc:
Je důležité, aby se zpracování formuláře (requestu) odehrálo před renderováním šablony. Uložení requestu tedy nelze provádět v handle<name> nebo action<name>
handle<name>
i action<name>
se přeci
vykonávají ještě před rederováním šablony, ne?
- awsickness
- Člen | 98
jen me zmatlo ze to davsa do renderDefault kdyz by to bylo lepsi davat to starup nebo tak berorender etc aby back link byl dostupny vzdy. pro jednoduche akce jako tady processForm staci pak dat redirect(„this“) ale jinak pekny navod.
- Tomáš Votruba
- Moderator | 1114
awsickness napsal(a):
jen me zmatlo ze to davsa do renderDefault kdyz by to bylo lepsi davat to starup nebo tak berorender etc aby back link byl dostupny vzdy. pro jednoduche akce jako tady processForm staci pak dat redirect(„this“) ale jinak pekny navod.
Pravda. Fixed. (Celé by to mělo vést k používání session, aby se zbytečně nezanášely odkazy.)
Nox napsal(a):
Pěkný nápad se session
@**nanuqcz** tipuju, že „před renderováním“ se myslí „těsně před renderováním“ … ale uvidíme co na to Schmutzka
Tak tak! Někde jsem vyčetl (bohužel jsem nedohledal kde), že uložení
requestu jinde než mimo render neuloží aktuální request. Právě jsem
vyzkoušel použít startup()
místo beforeRender
a
neúspěšně. Trochu jsem to tam popsal, i když by to chtělo fundovanější
vyjádření :)
- Tomáš Votruba
- Moderator | 1114
nanuqcz napsal(a):
Schmutzka: Aha, začínám chápat :-) Pak bych to ale napsal takhle:
Je důležité, aby se
zpracování formuláře (requestu)uložení requestu odehrálo těsně před renderováním šablonyNebo mi pořád něco uniká? Zbytek tutoriálu chválím, je lehce pochopitelný.. ale tenhle detail… :-)
Ano, máš pravdu. Opraveno. Díky. Původně jsem chtěl napsat 2 věci, že uložení musí být těsně před renderováním a vyvolání requestu ještě předtím (ostatně, stačí když vyvolání requestu bude vždy před jeho uložením a záleží už na každém, které 2 akci si k tomu vybere), ale to je snad už jasné.
- Pitt
- Člen | 6
Navod super. Lehce pochopitelne i implementovatelne. Jen jedna vec:
V urcite casti aplikace mam iframe, ve kterem je clanek (iframe je mensi nez
cly clanek, ten videt cely ani nemusim, je tam jen pro informaci da se rict).
Problem je, ze do iframe se prenasi prommene:
<iframe id="articles" width="640" height="400" src="{link Comments:iframe, $article->news_id, "article"}"></iframe>
No a jelikoz toto je posledni request tak pokud dam z teto stranky treba prihlasit tak me to hodi do toho iframe.
Odhledneme od toho jak je toto reseni raritni, nicmene se stat muze.
Editoval Pitt (26. 3. 2012 2:17)
- duke
- Člen | 650
To řešení přes session má nicméně jednu nevýhodu. A sice, že pokud si otevřeš více stránek téže webové aplikace současně, budou si vzájemně šahat na tatáž session data, takže se chování těchto stránek bude měnit také podle toho, co uděláš na těch ostatních. Takže řešení přes query string je tu IMHO lepší.
- Tomáš Votruba
- Moderator | 1114
@Pitt: To bych spíše řešil tím, že použiji
externí latte soubor (kde bude stejný obsah jako na view
Comment:iframe
):
{include comment.iframe.latte, "article" => $article->news_id}
Nebo si z toho udělal komponentu (pokud používáš na více místech):
{control commentIframe $article->news_id}
@duke: Nějaké funkční (= bez bordelu v url, ale
splňující tvé požadavky) řešení tě nenapadá?
(Možná něco s $httpRequest->getReferer()
?)
Editoval Schmutzka (26. 3. 2012 2:41)
- Tomáš Votruba
- Moderator | 1114
Nox napsal(a):
Myslim že David nad tím dumal asi dost, když přemýšlel o flash messages a pokud vybral url … asi by to tedy mělo být v url, viz duke
FM jsou ok, ty se zobrazí, jen když to má smysl. Viz níže.
duke napsal(a):
S řešením přes referrer nemám zkušenosti, takže se raději zdržím komentáře. Osobně bych se nebránil tomu „bordelu“ v query stringu (minimálně v tom případě přihlašování).
Mimochodem, podobný problém se už diskutoval zde.
V query stringu by to muselo být navíc (@persistent
) všude,
kde předpokládáme storeRequest()
, tedy stránku, na kterou by
uživatel mohl přistoupit bez přihlášení. Jedině tak můžeme request
předat dále. Pokud se pletu, prosím o příklad, kdy by to šlo tímto
způsobem udělat.
Teď mne napadá, že tento postup vůbec samotné přístup bez přihlášení neřeší – tedy situace, kdy chci jít na zabezpečenou stránku a jsem přesměrován na login stránku (o to tady primárně jde). Zde by se hodilo něco podobného:
// tam, kam nemáme bez přihlášení přístup
if (!$this->user->loggedIn) {
$this->mySession->loginBacklink = $this->httpRequest->getUrl(); // uložíme požadavek do session
$this->mySession->setExpiration("loginBacklink", "+ 5 minutes"); // e.g.
$this->redirect("Homepage:login");
}
// po přihlášení se vrátíme tam, odkud jsme byli sprostě vyhozeni
if(isset($this->mySession->loginBacklink)) {
$this->redirectUrl($this->mySession->loginBacklink));
}
Bohužel to v praxi aktuálně neřeším, takže je to spíše nástřel. Jak to pro tento účel (tučně) vidíte?
Editoval Schmutzka (26. 3. 2012 16:46)