restoreRequest() pri AJAX odeslání
- Chbox
- Člen | 125
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
A jak si představuješ, že to bude fungovat? Na straně klienta to máš naskriptované správně?
- Jan Tvrdík
- Nette guru | 2595
restoreRequest
funguje při ajaxovém požadavku naprosto
stejně, jako při normálním.
- Jan Tvrdík
- Nette guru | 2595
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
..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
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
- tím pádem jediná výjimka, kterou můžu chytat, je
Č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)
- uestla
- Backer | 799
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:
- AJAXový formulář
- v
onSuccess
eventu volatrestoreRequest()
- následné přesměrování (při použití https://componette.org/search/?… je to zautomatizováno)
Předem děkuji za odezvu.