Ajax Schnittstelle (Frontend)

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 Mandant
  • lang = die Sprache
  • id = 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:

  1. site/<Mandant>/<Seitentyp>/
  2. site/_global/<Seitentyp>/
  3. site/<Mandant>/
  4. 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' })); } }
wb_incandescent

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.

warning

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.