Jak předat proměnnou z handle do šablony
- Thommie
- Člen | 34
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 | 1029
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
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)