Jak předat proměnnou z handle do šablony

Thommie
Člen | 32
+
0
-

Ahoj,

mám tento ajaxový požadavek:

$.ajax({
			type: 'POST',
			url: url,
			data: {'zbozi': $(this).find('#zbozi').val()},
			dataType: 'json',
			success: function(result) {
				console.log(result.zbozi);
			},
			error: function(result) {
				console.log('chyba');
			},
			contentType: 'application/json',
			timeout: 3000
		});

a potom zpracování v presenteru:

public function handleAddToBasket($zbozi) {
    return $this->sendResponse(new \Nette\Application\Responses\JsonResponse(["zbozi" => $zbozi]));
}

Když ale v success udělám console.log(result.zbozi); tak se vypíše null. Pokud v požadavku změním metodu na GET, tak to funguje. Jak mám v handle přistoupit k datům odeslaným jako post?

Díky moc, s ajaxem začínám a moc tomu předávání v nette nerozumím.

Editoval Thommie (5. 4. 2018 14:02)

jiri.pudil
Nette Blogger | 1028
+
+1
-

Nastavení contentType ovlivňuje Content-Type požadavku: když ho nastavíš na application/json, pošlou se data jako JSON, s čímž si Nette resp. PHP samo od sebe neporadí. Pokud necháš výchozí contentType (což je application/x-www-form-urlencoded), mělo by to fungovat i přes POST. (GET funguje, protože z definice neobsahuje tělo, takže jQuery data serializuje do query stringu.)

jahudka
Člen | 71
+
0
-

Důležitý je, že to contentType, který nastavuješ ve volání $.ajax, nastavuje Content-Type hlavičku požadavku, nic víc ani míň; jQuery pak parametry, který předáš do data, serializuje podle metody požadavku buď do query stringu (pro GET) nebo do request body (pro všechno ostatní afaik – efektivně taky jako query string, což by odpovídalo Content-Type: application/x-www-form-urlencoded). Když ale zároveň s tím nastavíš requestu Content-Type: application/json, korektně nastavenej backend by ti měl kiksnout, protože mu říkáš, že mu posíláš JSON, ale ve skutečnosti mu posíláš ten query string – takže by se backend někde měl pokusit o něco jako json_decode('zbozi=123'), což by samozřejmě selhalo a nazdar bazar. Nette ale samo od sebe request body takhle nezpracovává, musel by sis přidat nějakou logiku třeba do routeru (a upravit odpovídajícím způsobem js kód, aby data skutečně posílal jako JSON).

Editoval jahudka (11. 4. 2018 2:45)