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.');
}
});
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.