restoreRequest() pri AJAX odeslání

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

jak na restoreRequest při Ajax požadavku? Jedná se o klasiku, login formulář.
zkoušel jsem tady z fora:

try {
        $this->getApplication()->restoreRequest($this->getParam('backlink'));
} catch (ForwardingException $e) {
        $httpRequest = Environment::getHttpRequest();
        $uri = $this->getApplication()->getRouter()->constructUrl($e->getRequest(), $httpRequest);
        $this->redirectUri($uri);
}

místo:

	$this->getApplication()->restoreRequest($this->getParam('backlink'));
	$this->redirect('Homepage:');

..bohužel to žadnou vyjímku nevyhodí. :-(

Editoval Chbox (10. 2. 2011 2:26)

Jan Tvrdík
Nette guru | 2595
+
0
-

A jak si představuješ, že to bude fungovat? Na straně klienta to máš naskriptované správně?

Chbox
Člen | 125
+
0
-

…tomu nějak nerozumím, na co se ptáš? Co bych měl mít nastaveno? Funkci bych se představoval aspoň takovou, že se provede restoreRequest() jako při neajxovém volání nebo jako redirect u ajaxového požadavku.

Jan Tvrdík
Nette guru | 2595
+
0
-

restoreRequest funguje při ajaxovém požadavku naprosto stejně, jako při normálním.

Chbox
Člen | 125
+
0
-

no tak mně se z nějakého důvodu restoreRequest při ajaxSubmitu neprovede. Když Ajaxové odesílání formu vypnu, funguje to, jak má, tak co může být špatně? Ve firebugu to vratí správný data v XHR požadavku, ale stránka se neredirecuje na původní adresu.

Jan Tvrdík
Nette guru | 2595
+
0
-

A obslužný kód na straně klienta pozná, že se má redirectovat? Pomocí PHP nic takového nelze vnutit. Aby ti fungoval ajaxový redirect, tak si musíš v payloadu před informaci o tom, že se má redirectovat a kam se má redirectovat a obslužný kód pak musí zajistit změnu location.href.

Editoval Jan Tvrdík (9. 2. 2011 17:42)

Chbox
Člen | 125
+
0
-

Používám klasický jquery.ajaxform.js a jquery.nette.js, netušil jsem, že je potřeba ještě nějakých úprav.

Chbox
Člen | 125
+
0
-

..jak to tedy upravit na klientské časti, aby to fungovalo stejně jako bez AJAX submitu?
Tohle bez ajaxu funguje správně:

$this->getApplication()->restoreRequest($this->getParam('backlink'));
$this->redirect('Homepage:');

s ajaxem se akorat vrátí v odpovědi správný obsah, ale k restoreRequest nedojde.

uestla
Backer | 799
+
0
-

Stejný problém teď řeším ve verzi 2.0b, jen nevím, zda jdu na to správně… ?

  • v nové verzi se při restoreRequest() volá sendResponse()
  • v tom se nastavuje response (čili ForwardResponse s requestem, na jehož URL chceme přesměrovat) a cyklus se ukončuje
    • tím pádem jediná výjimka, kterou můžu chytat, je AbortException
    • těžko se pak ale např. z přihlašovací komponenty dostanu k response, který byl právě presenteru nastaven

Čili jsem se zatím dopracoval k následujícímu, nicméně kvůli již zmíněné nepřístupnosti k response to nefunguje:

// jedná se o komponentu, následující kód je uvnitř metody volané onSuccess

try {
	$presenter->application->restoreRequest( $presenter->backlink );

} catch (Nette\Application\AbortException $e) {
	// $presenter->response->request by mě měl dostat k requestu uloženému v session
	$presenter->redirectUrl( $presenter->context->router->constructUrl( $presenter->response->request, $presenter->context->httpRequest->getUrl() ) );
}

Editoval uestla (6. 7. 2011 13:07)

kravčo
Člen | 721
+
0
-

Prečo ju zachytávať??? Ona sama zabezpečí presmerovanie a všetko čo treba.

Navyše pozor, v prípade, že ukladáš POST request, volanie redirectUrl je dosť nevhodným riešením, keďže stratíš dáta…

uestla
Backer | 799
+
0
-

Taky si myslím, že by k tomu přesměrování mělo docházet, pokud se nemýlím, tak mnou zachytávaná výjimka je ve vnitřnostech zachycena tady.

Problém bude tedy v tom, že se mi neposílá payload s redirectem, ale HTML celé stránky.

uestla
Backer | 799
+
0
-

Ještě se tedy jen zeptám, zda to kdokoli ze zde diskutujících, či kdokoli jiný (klidně i kolemjdoucí) zkoušel a úspěšně vyřešil?

Jen shrnu:

Předem děkuji za odezvu.