05. März 2016
Externe Session-Daten in Joomla
Während der Bearbeitung eines neuen Projektes ergab sich die folgende knifflige Aufgabenstellung:
- Auf Daten eines externen PHP-Systems soll innerhalb von Joomla zugegriffen werden, abhängig vom Zustand eingeloggt ja/nein, welcher in separaten Session-Daten vorgehalten wird.
- Da Joomla seine eigene Session-Verwaltung betreibt. sind die externen Session-Daten in Joomla (wohl auch aus Sicherheitsgründen) nicht direkt erreichbar.
- Die Umprogrammierung des externen Systems hin zur Zusammenarbeit mit Joomla scheidet leider aus.
Nach einigen Überlegungen entwickelte ich die folgende Javascript / Ajax-Lösung, welche ich heute einmal kurz vorstellen möchte:
Schritt 1
Innerhalb des Joomla wird eine Markierung gesetzt, an der später der extern generierte HTML-Code eingefügt wird:
<div id="results"></div>
Das war ja noch einfach.
Schritt 2
Aufruf der verarbeitung.php per Javascript / jQuery über Ajax:
<script>
jQuery.get( "./php/verarbeitung.php",
{ do: "fall-1" },
function( data ) { jQuery( '#results' ).html( data ); }
);
</script>
<noscript>
<p>+++ Javascript ist deaktiviert +++</p>
</noscript>
Hier habe ich auch gleich noch einen noscript-Hinweis eingebaut für den Fall, dass Javascript deaktiviert sein sollte – dieser Zustand wird heute leider gerne vergessen. In meinem Falle ist der obige Code direkt in einer Joomla-Seite platziert, dies ermöglicht ein nützliches Plugin namens „Sourcerer“.
Im Code passiert folgendes: die verarbeitung.php wird mit dem Parameter do=fall-1 über Ajax aufgerufen. Die Ausgabe bzw. das Ergebnis (data) dieses Aufrufes setzt jQuery als HTML-Inhalt des DIV mit der ID #results.
Schritt 3
Meine PHP-Datei verarbeitung.php hat den folgenden Inhalt:
<?php
define( NICHTEINGELOGGT,'<p>+++ Nicht eingeloggt +++</p>' );
$do = $_REQUEST[ 'do' ]; // Parameter do holen
sess__init(); // Externe Session-Daten initialisieren
if ( $do == "fall-1" ) {
if ( sess__get('loggedin') == false ) echo NICHTEINGELOGGT;
else { // Anzeige der Daten nur für eingeloggte Personen
echo '<p>Anzeige der Daten, Fall 1</p>';
}
return;
} // Ende Fall 1
// Fehlerhaften Aufruf melden
echo '<p>+++ do=' . $do . ' undefiniert +++</p>';
?>
Cross-Origin
Noch ein Hinweis zum Pfad der PHP-Datei (oben: ./php/verarbeitung.php). Wenn Sie hier einen absoluten Pfad angegeben kann es sein, dass die Ajax-Abfrage nicht funktioniert. Im Konsole-Fenster Ihres Browsers sehen Sie dann eine Meldung ähnlich der Folgenden:
Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf https://www.manoftaste.de/***********/php/verarbeitung.php?do=fall-1. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt).
Apache blockiert hier den Zugriff aus Sicherheitsgründen. Verwenden Sie möglichst relative Pfade innerhalb Ihres Auftritts oder, falls dies nicht möglich sein sollte, schalten Sie den Zugriff über ein Kommando in der .htacces-Datei frei:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Fazit
Bei meinen Tests funktioniert bisher alles zuverlässig. Falls ich einen Fehler gemacht oder eine Situation übersehen haben sollte oder Sie nützliche Hinweise geben können, melden Sie sich bitte bei mir.