Kuchařka: Jak po odeslání formuláře zobrazit stejnou stránku? – prosím o revizi

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

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

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

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.

Nox
Člen | 378
+
0
-

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

Tomáš Votruba
Moderator | 1114
+
0
-

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í :)

nanuqcz
Člen | 822
+
0
-

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 šablony

Nebo mi pořád něco uniká? Zbytek tutoriálu chválím, je lehce pochopitelný.. ale tenhle detail… :-)

Tomáš Votruba
Moderator | 1114
+
0
-

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 šablony

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

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

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

@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)

duke
Člen | 650
+
0
-

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.

Pitt
Člen | 6
+
0
-

@Schmutzka: Vida, clovek se tady uci nove veci kazdym dnem, diky.

Nox
Člen | 378
+
0
-

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

Tomáš Votruba
Moderator | 1114
+
0
-

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)