Typo3: JSON Beispiel JS, TypoScript, Controller

Hier ein vollständiges Beispiel für einen JSON Dispatcher, der ein JavaScript-Objekt im Frontend als JSON an einen Controller im Backend sendet und dann ein JSON zurück bekommt.

Für Suchmaschinen: JSON von JavaScript in PHP auslesen. JSON per Post an Typo3 Controller Backend senden. method=POST, JSON dispatcher für Typo3. Per JavaScript Objekt aus dem Typo3 Backend laden und parsen.

1. Per TypoScript Setup wird über den page-Type eine neuer Ausgabe-Typ für das JSON definiert:

json_beispiel = PAGE
json_beispiel {
   typeNum = 9901
   config {
      disableAllHeaderCode = 1
      xhtml_cleaning = 0
      admPanel = 0
      additionalHeaders = Content-type: text/plain
      no_cache = 1
      contentObjectExceptionHandler = 0
   }
   10 = USER_INT
   10 {
      userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
      extensionName = Beispiel
      pluginName = Beispiel
      vendorName = Vendor
      controller = Controllername
      switchableControllerActions {
         Controllername {
            1 = getJson
         }
      }
   }
}

2. Der Controller nimmt das JSON aus dem Frontend entgegen und sendet ein JSON zurück:

/**
 * JSON im Controller laden
 *
 * @return void
 */
public function getJsonAction () {
 
   $gp = json_decode(file_get_contents('php://input'), true);
 
   // Hier dann was machen...
   $result = ['result'=>'1234'];
   return json_encode($result, JSON_UNESCAPED_UNICODE);
 
}

3. Und so sieht die Abfrage per JavaScript im Frontend (jQuery) aus:

var url = 'index.php?id=XXX&type=9910';
var data = {beispiel:[10,20,30]};
 
 
$.ajax({
    type: "POST",
    url: url,
    data: JSON.stringify(data),
    success: function (data) {
        func( data );
    },
    error: function (errMsg) {
        alert('Fehler beim Aufruf des Backend.');
    }
});

One thought to “Typo3: JSON Beispiel JS, TypoScript, Controller”

  1. 1) additionalHeaders funktioniert nicht – im Controller muss TSFE->setContentType (oder so ähnlich) aufgerufen werden
    2) file_get_contents(‚php://input‘) ist ja ein ganz böser Hack. Wozu gibt es das $this->request Objekt und $this->arguments und die Übergabe von benannten Parametern?
    3) Aus der Action sollte NIE eine Ausgabe (echo) erfolgen, sondern ein return. Dann wird auch das Template nicht gerendert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.