Naja ajax odkazy a Error4×xPresenter

d@rkWolf
Člen | 167
+
0
-

Zdravím, netušíte někdo, jak přesvědčit Naju(mám pocit, že při dřívějších pokusech s Nette.Ajax jsem měl stejný problém), aby překreslila snippety pro Error4xxPresenter? Vycházím ze Sandbox Nette 3, hlavní ErrorPresenter mám mimo moduly a Error4xxPresenter mám v každém modulu(Admin/Front/možná eště něco) samostatný s upravenými šablonami, protože v případě 4xx chyb chci, aby se jejich text zobrazoval uvnitř designu stránky.

V případě, že vyvolám pod přihlášením neexistující stránku běžným odkazem, dostanu 404.latte tak jak si představuju, ale v případě, že tu neexistující stránku vyvolám odkazem s třídou ajax, dostanu GET se 404, jsou tam i data pro snippety na překreslení(title, content, flash messages) s obsahem odpovídajícím 404.latte, ovšem na stránce se to nepřekreslí, vidím to jen v požadavku v konzoli v prohlížeči.

CatchExceptions mám nastaveno na true, abych viděl, co ten error presenter zobrazuje.

Předpokládám, že to způsobuje něco v Naja/Nette.ajax, když to při neajaxovém požadavku funguje? Bohužel nemám nejmenší tušení co…

Ještě horší je to s 403kou, protože tam na mě jakýkoliv odkaz, ať ajaxový, nebo neajaxový, vyhazuje Nette\Application\ForbiddenRequestException 403 z metody checkRequirements a přitom v konzoli v prohlížeči je 500 a nikde žádný zalogovaný error…

jiri.pudil
Nette Blogger | 1029
+
0
-

Ahoj, Naja překresluje snippety a tak vůbec reaguje na odpověď jen tehdy, je-li request úspěšný (tzn. status code je v rozsahu [200, 300)). V takovém případě dispatchuje událost success, na kterou právě reagují všechny core komponenty, které se starají o překreslení snippetů, integraci do History API aj.

V opačném případě (tedy i při 404) pouze vyvolá událost error. Do ní se předává jak xhr, kterého se můžeš zeptat na status, tak response, pokud se ji podaří ze serveru přijmout a zparsovat, takže teoreticky můžeš na tuto událost poslouchat a pro určité kódy vyvolat překreslení snippetů ručně:

naja.addEventListener('error', ({xhr, response}) => {
	if (xhr.status === 404 && response.snippets) {
		naja.snippetHandler.updateSnippets(response.snippets);
	}
});
d@rkWolf
Člen | 167
+
0
-

@jiripudil ahoj, vypadá to, že to funguje, dík moc. Bohužel ten objektovej JS jde dost mimo mě, moc netuším, co se tam děje, u starýho nette.ajax. sem tak nějak byl už zvyklej na pár potřebných věcí s jQuery a teď todle…došel jsem k tomu, že tu podmínku můžu rozšířit na >= 400 a <= 499, ať to pobere vše, co jde na ty 4xx šablony u Error4xxPresenteru.

Bohužel mi furt crashují práva, 403 ForbiddenRequest nepropadá do Error4xxPresenteru a nemůžu přijít na to proč, ale to není problém s Ajaxem a Najou, to je problém někde jinde, protože to dělá jak u normálních, tak ajax požadavků. :-(