Pouzitie restoreRequest() po uspesnom ajaxovom odoslani formulara

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

Tuto otazku som tu uz videl niekolko krat, ale v starsich vlaknach a nebola zodpovedana, preto sa skusim spytat znova, snad mi niekto bude vediet poradit.
Pouzivam nette.ajax.js. Mam ajaxovy formular pre prihlasovanie uzivatelov. Po uspesnom prihlaseni pouzivam restoreRequest(), aby to uzivatela hodilo na poslednu stranku. Lenze po kliknuti na submit button a uspesnom prihlaseni k presmerovaniu nedojde. Ked nasledne refreshnem stranku, uzivatel je prihlaseny. To znamena, ze sa jedna len o to presmerovanie, ktore nefunguje. Ak AJAX vypnem, funguje to. Vedel by mi niekto poradit, ako na to?

enumag
Člen | 2118
+
0
-

To že přesměrování při restoreRequest bez ajaxu funguje je dle mého názoru bug. Před pár dny jsem na toto téma napsal RFC kde uvádím i řešení. Používám to i při ajaxu, funguje bez problémů.

hoou
Člen | 43
+
0
-

Chapem to spravne, ze namiesto restoreRequest($this->backlink) budem volat tu funkciu redirectToRequest($this->backlink) a bude to robit, to co chcem? Skusal som to teraz hodit do BasePresenteru ako public metodu, ale hadze mi to chybu ‚Cannot read an undeclared property App\Presenters\SignPresenter::$httpRequest.‘ Co ma predstavovat ta property httpRequest?

enumag
Člen | 2118
+
0
-

Jsem to psal jako kdybych to vkládal přímo do UI\Presenter. Zkus místo httpRequest dát getHttpRequest(), to by mělo zabrat. Ale pozor, úplně jsem ten kód v tom RFC netestoval, ve své aplikaci to mám trochu jinak protože používám RequestStorage jako službu.

hoou
Člen | 43
+
0
-

To uz mi zobralo, ale este nepozna router. To je divne, kedze BasePresenter dedi z Nette\Application\UI\Presenter, kde podla dokumentacie je public property router. Preco to teda nevidi?

enumag
Člen | 2118
+
0
-

Router není public ale private, proto nefunguje. A není na něj ani getter takže si jej budeš muset injectnout sám.

hoou
Člen | 43
+
0
-

OK, takze toto sa mi podarilo nakoniec nejako rozbehat, kazdopadne to neriesi moj problem. Skusam tu druhu moznost s tym, ze metodu run() si definujem v BasePresenteri a nakonci volam parent::run(). Kazdopadne neviem, co jej mam dat za parameter, skusal som aj povodny $request alebo nahradeny premennou $stored, ale nefunguje mi to. Prepac, ze sa tak blbo pytam, ale vobec netusim co robim. BTW vysledok je taky, ze mi to nenacita ziadnu stranku, nedojdu mi ziadne data, len tracy.

enumag
Člen | 2118
+
0
-

Nejspíše voláš parent::run($request); místo return parent::run($request);. ;-)

hoou
Člen | 43
+
0
-

Ano, mas pravdu :) no bohuzial stale nic… Odoslem formular a nikde ma to nepresmeruje. Pricom vidim poziadavok POST s kodom 302 a hned za tym GET 200, kde vidim obsah, ktory potrebujem, ale nechce to prekreslit. Podotykam, ze pouzivam ajaxove spracovanie formulara. Ak ajax zrusim, tak to funguje perfektne, ale nevidim rozdiel v tomto a v klasickom restoreRequest(). Je potrebne napisat si nejaku js funkciu na strane klienta?

enumag
Člen | 2118
+
0
-

Hmm teď na to koukám že s ajaxem mi to funguje jen v některých případech. Nejspíš to bude tím že nette.ajax.js některé části payloadu zpracuje jen při úspěchu. Když dojde k chybě a response má kód 4xx tak to neprojde. Tohle nebude lehké opravit… :-D

enumag
Člen | 2118
+
0
-

Zkus na tenhle řádek dát complete místo success, to by mohlo pomoci. Ale nevím, u mě to nepomohlo protože používám history.ajax.js kde je to poněkud složitější a ještě jsem nevymyslel co s tím.

hoou
Člen | 43
+
0
-

Nepomohlo :( Zatial sa asi budem musiet zaobist bez tejto featurky, kazdopadne ti dakujem za ochotu a snahu :)

Barvoj
Člen | 60
+
0
-

Co se týče toho nefunkčního redirectu při ajaxu, tak mě pomohlo:

public function redirectToRequest($key) {
	...

	$url = $this->router->constructUrl($request, $refUrl);
	// Nahradit řádek
	// $this->sendResponse(new RedirectResponse($url));
	// za
    $this->redirectUrl($url);
}