Der Trick besteht im Wesentlichen darin, dass die Seite, von der der AJAX-Call abgesetzt wird, noch einmal aufgerufen wird. Damit ist garantiert, dass der gleiche CMS-Context wie vorher wieder hergestellt ist.
Ich möchte die Vorgehensweise am Beispiel von Contao zeigen, aber das Beispiel ist eigentlich unabhängig von Programmiersprache und CMS – kann also genauso in jedem anderen System wie WordPress oder Kentico, Joomla oder Drupal angewendet werden.
Wir befinden und also in einem PHP-File, in dem es einen JavaScript-Abschnitt gibt, in dem die Variablen für den AJAX-Call bereits vorbereitet worden sind.
Als erstes müssen wir den URL um etwaige QueryString-Parameter bereinigen. Sollten diese für den AJAX-Call auch benötigt werden, muss der URL entsprechend anders zusammengesetzt werden. In unserem Beispiel verwerfen wir alle vorhandenen Query-Parameter:
var tempArray = window.location.href.split("?");
var baseURL = tempArray[0];
Der baseURL ist also der um die QueryParameter bereinigte URL.
Danach wird der AJAX-Call mittels JQuery und POST-Methode auf die Selbst-Referenz abgesetzt. Es wird ein neuer QueryParameter hinzugefügt (isAJAX), anhand dessen wir später erkennen können, dass wir einen AJAX-Call abarbeiten müssen.
$.ajax({
type: "POST",
url: baseURL + '?isAjax=1',
data: {
p1: $p1,
p2: $p2,
ID: <?php echo $entry['data']['ID']['raw']; ?>
}
});
Nun folgt noch die Code-Passage, die den AJAX-Call abarbeitet:
<?php
if ($this->Input->get('isAjax') == '1')
{
$p1 = $_POST['p1'];
$p1 = $_POST['p2'];
$ID = $_POST['ID'];
$this->import('Database');
$this->Database->prepare("UPDATE tabelle SET p1=?, p2=? WHERE ID=?")->execute($p1,$p2,$ID);
exit; // IMPORTANT!
}
?>
An dieser Stelle sind 2 Punkte wichtig:
- Es müssen alle Parameter übergeben werden, die sich aus dem Kontext der aufrufenden Seite ergeben. Im AJAX-Call soll eigentlich nur der Datenbank-Zugriff abgearbeitet werden. Es kann natürlich an dieser Stelle auch ein Lese-Vorgang und eine Datenaktualisierung auf der Seite erfolgen. Dann müssen entsprechend andere Parameter übergeben werden.
- Nach Ausführung des Calls muss sofort ein EXIT erfolgen, damit der Seitenaufbau, etc. nicht erneut durchgeführt werden.
Ist doch cool, oder?
LG,
Sabine.