Ajax request nevrací JSON

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

Když pomocí nette.ajax.js a konkrétně pomocí $.nette.ajax({}) pošlu požadavek na server tak se zpracuje jako normální. V presenteru sice vidím že je to ajax request ale na výstup jde html místo JSON. Až když přidám na konec terminate() tak to pošle payload. Co dělám špatně? Nebo ten terminate signál je potřeba poslat vždy?

froggy
Člen | 17
+
0
-

Neuvádíš kód v presenteru. Takto posílám data formátovaná jako JSON zpět do stránky. Jestli to pomůže?

public function actionDataSelect($kategorie, $znacka, $vlastnost) {
        $this->payload->kategorie = $this->katalog->getSkupinySelector();
        $this->payload->znacka = $this->katalog->getZnackySelector();
        $this->payload->vlastnost = $this->katalog->getVlastnostiSelector('produkt');
        $this->sendPayload();
}
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Ještě lepší než terminate() je sendPayload(), které přesně říká, pošli payload. Standardně se vrací HTML, JSON se vrací teprve v případě, že byl invalidován nějaký snippet, anebo že to bylo explicitně vyžádáno (právě tou metodou sendPayload()).

akadlec
Člen | 1326
+
0
-

No v presenteru nic extra není. Mám to např na handle pro smazání záznamů z tabulky. Akce se provede a na konci handle je otázka zda je ajax nebo ne, když není ajax tak to udělá redirect na výpis jinak nic.
Ono ani nepotřebuju provést invalidaci nějakých snippetů, jen aby to vrátilo JSON a né html.

V beforeRender mám teda ještě přidáno vyzobání flashmessages, které si naházím do pole a to pak hodím do payload.

public function beforeRender()
{
	$messages = ...vyzobrani z flashmessages

	$this->payload->messages = $messages;
}

Když na konci toho before renderu hodim terminate tak to pošle jako json jinak to pošle jako html.

akadlec
Člen | 1326
+
0
-

No a není lepší aby to nette hodilo samo? Jako přidávat tam ještě extra podmínku co detekne že je to ajax a pak říct ať pošle payload mi nepříjde jako štastné :(

Glottis
Člen | 129
+
0
-

spatne to neni podle me. json taky nemsusis chtit, ne?

akadlec
Člen | 1326
+
0
-

hmm je možné že někdy asi ne, i když ja jej chci vždy ;) takže sendPayload bouchnout do toho beforeRedereru? Je to správné místo?

Glottis
Člen | 129
+
0
-

jj, bouchnes ho tam kde chces konec a poslat

akadlec
Člen | 1326
+
0
-

Ok takže asi do before render, protože po provedené akci potřebuju ještě vyzobat ty flash zprávičky a předat je jako json pole. Dík za trpělivost ;)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Automaticky se posílá HTML třeba proto, aby se snadno dalo použít $.load(). Při použití tohoto by se zase někdo ptal „a proč to posílá JSON a ne HTML“ :).

akadlec
Člen | 1326
+
0
-

jj chapu. u jquery ajaxu se dá nastavit datatype na json ale tento údaj je tuším jen pro samotné jquery že očekává data ve formě json a proto je hned rozparsuje. Jen mě to překvapilo no ;)

Ale nemuselo by to být fixně podle ajax request ale třeba na základě když se něco hodí do payload co? Protože do něho vždy něco nahodim, minimálně teda ty zprávičky. Nebo se ten payload naplní i v non-ajax požadavku?