SideBarMenu

Man stelle sich vor, ein Plugin möchte, ohne die Stud.IP-Seite neu laden zu lassen, Informationen darüber abrufen, welches Buddys gerade online sind (so das OnlineBadge-Plugin aus Osnabrück). Ein Messenger möchte alle paar Sekunden abrufen, ob der Nutzer neue Nachrichten bekommen hat. Und die Seite selbst will abrufen, ob es im Forum einen neuen Beitrag gibt. Für Stud.IP war das zuvor nur umständlich möglich. Bei gängigen sozialen Netzwerken ist das hingegen Gang und Gebe.

Ab der Version Stud.IP 2.2 gibt es zumindest einen zentralen Mechanismus, damit in dem obigen Fall nicht drei AJAX-Requests pro Sekunde gestartet werden. Das würde selbst leistungsfähige Server an den Rand der Verzweiflung führen. Wenn die Plugins die Klasse UpdateInformation benutzen, um die Daten zu bekommen, entlastet das den Server und den Programmierer, da er sich um einige Dinge nicht mehr kümmern muss.

Usecase 1: Plugins

Ein Plugin, das zum Beispiel Nutzer anzeigen soll, die online sind, bedient sich der Klasse UpdateInformation, die in der Datei lib/classes/UpdateInformation.class.php liegt. Das Plugin sollte ein Systemplugin sein, damit es (also der Konstruktor) aufgerufen wird, bevor der Trails-Controller app/controllers/jsupdater.php zum Zuge kommt und die Daten wiederum abholt.

Im Konstruktor des Systemplugins steht dann der Aufruf in etwa so: UpdateInformation::setInformation('myplugin.function', $data) Die Variable $data (wasauchimmer da drin ist, ein String, eine Zahl oder ein Array) wird dann an eine Javascript-Funktion übergeben, die STUDIP.myplugin.function heißt. Diese Javascript-Funktion muss natürlich das Plugin selbst zur Verfügung stellen.

Daraufhin passiert folgender Weg:

  1. Die Javascript-Funktion STUDIP.JSUpdater.call wird alle paar Sekunden (mal häufiger, mal schneller, je nach Servergeschwindigkeit, Datenlage und Benutzeraktivität) aufgerufen und ruft selbst per Ajax-Request die Seite dispatch.php/jsupdater/get auf.
  2. Hinter dispatch.php/jsupdater verbirgt sich der Trails-Controller in app/controllers/jsupdater.php und dessen Methode get_action().
  3. Bevor der Controller irgendwas macht, werden die Konstruktoren der Systemplugins aktiviert. Das Plugin myplugin sammelt Daten und gibt sie an UpdateInformation::setInformation weiter. Die Daten sind jetzt registriert und bereit zur Weitergabe.
  4. JsupdaterController ist jetzt dran und ruft UpdateInformation::getInformation() auf.
  5. Bei UpdateInformation::getInformation() gibt die Daten, die es von den Plugins bekommen hat als Array zurück.
  6. JsupdaterController nimmt dieses riesige Array und konvertiert alle Textstrings in UTF8 um, und danach das ganze Array in ein JSON-Objekt.
  7. Dieses JSON-Objekt kommt bei der Javascript Funktion STUDIP.JSUpdater.processUpdate an, die die einzelnen Daten an die vom Plugin definierte Javascript-Funktion übergibt. Es wird also die Funktion STUDIP.myplugin.myfunction aufgerufen, die als Parameter das definierte Value bekommt. Alles weitere macht dann diese Funktion.

Usecase 2: Kernfunktionalität

Auch wenn man es manchmal vergisst: Funktionalität in Stud.IP wird nicht nur durch Plugins bereit gestellt. Kernfunktionalität, die periodische AJAX-Updates verwenden möchte, benutzt nicht die Klasse UpdateInformation, sondern erweitert die Methode JsUpdaterController#coreInformation() einfach um ein paar Zeilen. Dort wird ein Array $data initialisiert und am Ende zurück gegeben, das assoziativ ist. Die Indexeinträge sind der Name der Javascript-Funktion (ohne "STUDIP." davor) und die Values sind dann beliebig.

Update zu Stud.IP 3.1

In der Version 3.1 von Stud.IP wurde der JS-Updater optimiert und um neue Funktionalitäten ergänzt.

Auf PHP-Seite gibt es die folgenden neuen Methoden zum Zugriff auf übergebene Daten in Javascript:

  1. UpdateInformation::hasData($index) - prüft, ob Daten unter dem angegebenen Index vorliegen
  2. UpdateInformation::getData($index) - liefert die Daten unter dem angegeben Index zurück (bzw. null, falls keine Daten vorliegen.

Auf JavaScript-Seite wurde die Fassade des JS-Updaters geschmälert und nach aussen stehen nur noch die folgenden Funktionen zur Verfügung:

  1. STUDIP.JSUpdater.start() - Startet den JS-Updater
  2. STUDIP.JSUpdater.stop() - Beendet den JS-Updater
  3. STUDIP.JSUpdater.register(index, callback, data) - Meldet ein neues Objekt unter dem angegeben Index beim Updater an. Zurückgelieferte Daten werden von dem angegebenen Callback verarbeitet und in data angegebene Daten werden bei jedem Aufruf des Updaters mitgesendet. data kann dabei entweder ein reguläres JavaScript-Array oder Objekt sein oder eine Funktion, die die Daten dynamisch zurückliefert.
  4. STUDIP.JSUpdater.unregister(index) - Entfernt ein zuvor angemeldetes Objekt.

Im Hintergrund wurde der JS-Updater optimiert, so dass zum Einen zu jedem Zeitpunkt nur noch ein einziger Aufruf des Updaters stattfindet und zum Anderen wird besser auf Lastsituationen am Server reagiert. Ebenso wird die Anzahl der Abfragen reduziert, wenn sich das Fenster mit Stud.IP im Hintergrund befindet und somit inaktiv ist.

Letzte Änderung am 04.04.2014 16:13 Uhr von tleilax.