Für AJAX-Aufrufe im Frontend wurde die json.php
eingeführt um einfache und einheitliche Requests zu ermöglichen.
Ein AJAX-Aufruf muss /json.php
ansteuern. Hier werden Methoden einer json.php
-Datei aufgerufen die in site/ liegt. Welche json.php
das ist, wird über die Parameter festgelegt:
site
= der Mandantlang
= die Spracheid
= die ID Seite
Wenn "site", "lang" und "id" nicht gesetzt sind, wird der Standardmandant und dessen Startseite verwendet!
Die json.php Datei wird gesucht in:
site/<Mandant>/<Seitentyp>/
site/_global/<Seitentyp>/
site/<Mandant>/
site/_global/
In der angesteuerten json.php wird eine Klasse definiert:
class JSON_Request extends Ego_Request {
}
In dieser Klasse werden Methoden definiert, die mit dem Parameter method
aufgerufen werden. Eventuelle Parameter, die dieser Methode übergeben werden sollen, werden mit einem Objekt params
übergeben.
In dieser Klasse kann jederzeit mit $this->site
und $this->page
auf das aktuelle Site und Page-Objekt zugegriffen werden (oder auch $this->auth
und $this->smarty
). Beispiel:
class JSON_Request extends Ego_Request {
public function json_test($a, $b) {
return $this->page->field['name'].', '.$a.', '.$b;
}
}
Wird keine Klasse definiert, können auch alternativ Funktionen definiert werden. Die Site und Page-Objekte sind dann mit $GLOBALS['site']
und $GLOBALS['page']
erreichbar (oder auch $GLOBALS['auth']
und $GLOBALS['smarty']
). Beispiel:
function json_test($a, $b) {
return $GLOBALS['page']->field['name'].', '.$a.', '.$b;
}
Der Rückgabewert ist ein Objekt mit result
und error
. Die Methode selbst liefert nur den Rückgabewert für result
. Eigene Fehlermeldungen können mit $GLOBALS['return']['error']
geschrieben werden (für die JSON_Request Klasse sind die Methoden getError()
und setError($error)
verfügbar).
Ein Javascript AJAX-Aufruf mit JSON sieht z.B. so aus:
if (JSON) {
var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
}
if (xmlhttp) {
xmlhttp.open('POST', '{/literal}{$egotec_conf.url_dir}json.php{literal}', true);
xmlhttp.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
var ret = JSON.parse(xmlhttp.responseText);
}
};
xmlhttp.send(JSON.stringify({
site : '{/literal}{$site->name}{literal}',
lang : '{/literal}{$site->language}{literal}',
id : {/literal}{$page->field.id}{literal},
params : {a : 1, b : 2},
method : 'json_test'
}));
}
}
So ein Aufruf lässt sich natürlich auch mit z.B. dojo oder jQuery realisieren. Wichtig ist, dass der Request als JSON gesendet und der Response als JSON empfangen wird.
Bitte beachten Sie, dass nur POST Requests erlaubt sind. Alle anderen Methoden werden mit einem 403 Header beantwortet.
Magic Methoden
Sie können auch Magic Methoden nutzen. Diese Methoden werden nicht direkt in der Klasse JSON_Request definiert, sondern erst bei Bedarf eingebunden. Über Magic Methoden können Sie mehrere JSON Methoden eines Seitentyps umsetzen, welcher z.B. im Standard und in einem kundenspezifischen Design existiert und jeweils eigene Definitionen liefern muss.
Dazu legen Sie eine json.METHODE.php Datei an, in welcher die Methode definiert ist. Beispiel json.magic_test.php:
function magic_test($site, $page, $auth, $smarty, $params) {
}
Die Magic Methode erwartet folgende Parameter:
- $site: Das Site Objekt.
- $page: Das Page Objekt.
- $auth: Das Auth Objekt.
- $smarty: Das Smarty Objekt.
- $params: Die Parameter, die der Methode übergeben wurden.