Vygenerování pouze JSON response

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

Ahoj všem :-)

Snažím se pochopit jak funguje ajaxový response v Nette. Chci použít na stránkách Open Flash Chart, kterému bych rád podstrčil nějaká data. OFC umí přijmout jako parametr JSON data, bingo! Jenže jak v presenteru Nette napsat takovou action, aby vždy vygenerovala pouze JSON response? Nemám nikde žádný snippet a chtěl bych to vyřešit nějak líp než

<?php

echo $json;
die();

?>

Což je aktuální stav, jak to dělám. Ale vím, že Nette definuje JsonResponse, takže by to mělo jít nějak systémově, že :-) předem díky.

Foowie
Člen | 269
+
+2
-

V action/render metodě zavoláš $presenter->sendResponse a předáš mu jako parametr JsonResponse . Tomu do konstruktoru podstrčíš pole hodnot, které se má odeslat.

potapnik
Člen | 127
+
0
-

Super, super, super. Přesně ono. Díky moc. Vypadá to luxusně.

norbe
Backer | 405
+
0
-

Zkus v presenteru použít něco takového (payload by se měl odeslat jako json):

$this->payload->foo = "bar";
$this->sendResponse();

// Edit: sakra to je rychlost :-)

Editoval norbe (20. 1. 2011 13:39)

Filip Procházka
Moderator | 4668
+
+1
-

když už tak né sendResponse, ale když posíláš payload tak

$this->sendPayload();

:)

potapnik
Člen | 127
+
0
-

Nakonec jsem na to přišel je to čistší, ALE dost mě omezuje a otravuje, že nejde přistupovat přímo k this.payload, musím mu jednotlivé pod-objekty manuálně přiřazovat, tj. nelze

<?php

$this->payload = $mujobjekt;
$this->sendPayload();

?>

ale musim:

<?php

$this->payload->elements = $mujobjekt->elements;
...
$this->sendPayload();

?>

Ze zdrojáků a z výpisu Laděnky jsem pochopil, že payload lze jenom číst, není na něj setter, nějak nemůžu z logiky věci pochopit, proč není defaultně modifikovatelnej…

Filip Procházka
Moderator | 4668
+
+1
-

protože má kvůli nette.jquery.js zavedenou určitou strukturu, když odpoví, aby to ten script dokázal správně spracovat, svoje data si dej do nějaké proměnné

$this->payload->data = $data;

klídeček :) nebo budeš mít pocuchané nervy, vždyť je to jedno jestli posíláš jenom data, nebo je tam o zanoření víc.

A nebo použij sendResponse, pokud ti to velicemoc vadí

$this->sendResponse(new JsonResponse($mujObjekt));

Editoval HosipLan (20. 1. 2011 20:30)

potapnik
Člen | 127
+
0
-

No ono jde o to, že dělám wrapper pro Open Flash Chart, který bere jako vstupní data celý objekt, ale díky za objasnění, už to chápu, nějak jsem akorát neviděl důvod, teď už na světě je :-)

sendResponse je OK, vlastně jsem ho během ohejbání OFC použil, ale teď jsem na něj nějak pozapomněl…