Archiv

Webdesign-Blog

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.