FLOW3 – wie erstelle ich eine Ajax Action mit json Rückgabe?

Ganz einfach:

im Controller folgende Klassenvariable setzen:

protected $supportedFormats = array("html", "json");
	protected $viewFormatToObjectNameMap = array(
		"json" => "\TYPO3\FLOW3\MVC\View\JsonView",
		"html" => "\TYPO3\Fluid\View\TemplateView"
	);

und in der Routes.yml (bzw. im Routing) einen Eintrag nach folgendem Muster vornehmen:

-
  name: '[name_der_route]'
  uriPattern: '[gewünschter_pfad]'
  defaults:
    '@package':    '[package_name]'
    '@action':     '[action_im_controller]'
    '@controller': '[controller]'
    '@format':     'json'

Mit der Klassenvariable sorgt ihr dafür, dass der Controller beim Format “json” auf ein Template verzichtet und den Return-Value einer Action direkt ausgibt (also im Normalfall per json_encode() formatiert). Mit der Konfiguration der Route legt ihr nur noch fest, dass die jeweilige Action an Stelle von HTML lieber JSON verwendet.

[Update]
Nach der Frage von Mario hier nochmal als Nachtrag eine entsprechende Beispiel-Action:

/**
 *
 * @param string $param
 *
 * @return json test data
 */
public function getDataAction($param) {
	$data = array("testKey"=>$param, "testKey2"=>"testValue2");
	return json_encode($data);
}

Tags: , , , , , , , ,

3 Kommentare

  1. [...] return a json. As there is not much about this inside the documentation I tried a the way like in http://bytelude.de/2012/09/10/flow3-wie-erstelle-ich-eine-ajax-action-mit-json-ruckgabe/, but I always got a answer from the application that there is no view defined. I am using FLOW3 [...]

  2. Aus $supportedFormats… schein ja mittlerweile
    $supportedMediaTypes=array(‘application/json’,'text/html’) geworden zu sein. Aber kannst Du vielleicht ein komplettes Beispiel, also controller, view und routes.yaml zeigen?

    • Hallo Mario,

      das Beispiel ist bereits komplett. Man benötigt nur den jeweiligen Eintrag in der Routes.yaml (Beispiel siehe oben) sowie die Deklaration der möglichen Response Datentypen im Controller als Property. Ich hab nochmal eine Beispielhafte Action angehangen, die die Verwendung vielleicht nochmal etwas klarer macht. Inwieweit die Json Annotation notwendig ist kann ich nicht mit Sicherheit sagen – es kann zumindest nicht schaden, den Rückgabewert korrekt anzugeben…
      Ein View ist nicht mehr notwendig, da wir ja nur JSON zurück geben wollen. Da wir dem Controller mit $supportetFormats bzw. MediaTypes sagen, welche Datentypen möglich sind und mit $viewFormatToObjectNameMap auf generische Views verweisen, sind explizite Views für Actions mit JSON Format nicht mehr nötig.

Hinterlasse einen Kommentar