PluginSchnittstelleVortrag

Implementation eines Plugins

Grundsätzlich stehen sechs verschiedene Typen von Plugins zur Verfügung:

  • Administrationsplugin
  • Homepageplugin
  • Portalplugin
  • Standardplugin
  • Systemplugin

Jedes Plugin bedient dabei bestimmte Hooks, die in Stud.IP integriert sind. Prinzipiell kann das Hook-Konzept so so zusammengefasst werden: In Stud.IP werden an bestimmten Stellen in bestimmten Seiten Einsprungspunkte definiert. An zentraler Stelle ("Verwaltung von Plugins") kann man Plugins aktivieren, die dann an den entsprechenden Einsprungspunkten instanziiert und aufgerufen werden. Eine Liste der gegenwärtigen Hooks zeigt die entsprechenden Screenshots.

Die Zuordnung von Plugins zu Hooks liefert folgende Tabelle:

PluginklasseAdministrationHomepagePortalStandardSystem
Hook #01: Login  ×  
Hook #02: Übersicht  ×  
Hook #03: Adminmenü×    
Hook #04: Adminlinkleiste×    
Hook #05: Meine Veranstaltungen   × 
Hook #06: Veranstaltungsmenü   × 
Hook #07: Veranstaltungseinst.   × 
Hook #08: Homepage ×   
Hook #09: Stud.IP Score   ××
Hook #10: systemweite Icons    ×
Hook #11: Backgroundtasks    ×

Generelle Pluginimplementation

Generell kann und sollte jedes Plugin folgende Methode überschreiben:

  # Das Plugin sollte in jedem Fall über eine actionShow-Methode verfügen,
  # da diese der Haupteinstiegspunkt für die Plugin-Engine ist.
  # Innerhalb dieser actionShow-Methode sollte das Plugin den Request verarbeiten und eine Ausgabe liefern.
  function actionShow() {
    printf("in %s:%s\n", __CLASS__, __FUNCTION__);
  }

Zusätzlich sollten im Konstruktor das Plugin-Icon und die Plugin-Navigation gesetzt werden. Ein Beispiel:

  function __construct() {
    parent::__construct();

    # this plugin wants an own icon
    $this->setPluginiconname("img/plugin.png");

    # navigation
    $navigation = new PluginNavigation();
    $navigation->setDisplayname(_("MySystemPlugin Navigation"));
    $this->setNavigation($navigation);
  }

Abhängig von der Pluginklasse müssen weitere Anpassungen getätigt werden. Diese werden im folgenden aufgeführt.

Administrationsplugin

Wenn das Administrationsplugin auf der Übersichtsseite als Menüpunkt erscheinen soll (Hook #3), muss im Konstruktor die sogenannte Topnavigation gesetzt werden:

  function __construct() {
    parent::__construct();

    ## AbstractStudIPAdministrationPlugin specifics

    # top navigation
    $top_navigation = new PluginNavigation();
    $top_navigation->setDisplayname(_("MyAdministrationPlugin Topnavigation"));

    $top_navigation_submenu_1 = new PluginNavigation();
    $top_navigation_submenu_1->setDisplayname(_("Submenu 1"));
    $top_navigation_submenu_1->addLinkParam('cmd', 'submenu_1');
    $top_navigation->addSubMenu($top_navigation_submenu_1);

    $top_navigation_submenu_2 = new PluginNavigation();
    $top_navigation_submenu_2->setDisplayname(_("Submenu 2"));
    $top_navigation_submenu_2->addLinkParam('cmd', 'submenu_2');
    $top_navigation->addSubMenu($top_navigation_submenu_2);

    $this->setTopnavigation($top_navigation);
  }

Für die Anzeige in der Administrationslinkleiste (Hook #4) wird die oben erwähnte Navigation recycelt. Es reicht damit ein entsprechender Aufruf von $this->setNavigation(..);

Homepageplugin

Das Homepageplugin kann auf der Homepage eines jeden Stud.IP-Benutzers angezeigt werden (Hook #08). Zum einen besteht die Möglichkeit, einen Kasten anzeigen zu lassen, und zum anderen kann ein Reiter auf der eigenen Seite gezeigt werden.

Wichtig ist an dieser Stelle das Setzen einer Navigation (siehe oben $this->setNavigation(..); ! Ohne Navigation wird auch der Kasten nicht angezeigt. Selbiger wird durch Aufruf der zu überschreibenden Methode showOverview() dargestellt. Ein Beispiel:

  function showOverview() {
    printf("in %s:%s\n", __CLASS__, __FUNCTION__);
  }

Interessant ist auch das Implementieren der Methode actionShowAdministrationPage(), die aufgerufen wird, wenn man auf den "Doppelpfeil nach rechts" rechts oben im Kasten des Plugins klickt, während man sich auf der eigenen Homepage befindet.

  function actionShowAdministrationPage() {
    printf("in %s:%s\n", __CLASS__, __FUNCTION__);
  }

Portalplugin

Portalplugins können je nach Rechtesetzung? auf der Loginseite (Hook #1) und auf der Übersichtsseite (Hook #2) erscheinen.

Angezeigt wird der Kasten mit der Methode showOverview, die einen boolschen Parameter besitzt, um anzuzeigen, ob es sich nun um Hook Nº 1 oder Nº 2 handelt. (Dieses Verhalten hätte eigentlich auf zwei Methoden verteilt werden sollen, wie auch die weiteren Ausführungen glaubhaft machen.) Ein Beispiel:

  function showOverview($authorizedview = TRUE) {
    printf("in %s:%s (authorized: %s)\n", __CLASS__, __FUNCTION__, $authorizedview);
  }

Um diese Methode aber überhaupt aufgerufen zu bekommen, müssen folgende Methoden überschrieben werden. Für Hook Nº1 wäre das:

  function hasUnauthorizedView() {
    return TRUE;
  }

und für Hook Nº2:

  function hasAuthorizedView() {
    return TRUE;
  }

Standardmässig liefert die erste Methode FALSE und die zweite TRUE.

Darüber hinaus kann man ebenso wie bei den Homepageplugis noch die Methode actionShowAdministrationPage() implementieren, die aufgerufen wird, wenn man eingeloggt auf der Übersichtsseite (Hook Nº2) ist, und dort auf den Doppelpfeil oben rechts im Pluginkasten klickt.

Standardplugin

Das Standardplugin wird bei Einrichtungen und/oder Veranstaltungen angezeigt, wenn das Plugin für diese aktiviert ist (Hook Nº7). Nach der Aktivierung können die notwendigen Änderungen für die Hooks Nº 5, 6 und 9 vorgenommen werden.

Um einen Reiter in der Veranstaltung zu zeigen (Hook Nº 5), ist es notwendig, eine Navigation zu setzen. Um auf der Seite "Meine Veranstaltungen" angzeigt zu werden (Hook Nº 6), muss im Konstruktor folgender Aufruf geschehen: $this->setShownInOverview(TRUE);.

Als Icon für diese Übersicht wird das Pluginicon (setPluginIconName('iconname')) oder aber, wenn sich im Plugin etwas geändert hat (z.Bsp. neue Wikiseite..) das Icon, das durch setChangeIndicatorIconName('iconname') festgelegt wurde. Ob sich etwas geändert hat, kann das Plugin durch Überschreiben der folgenden Methode festlegen:

  function hasChanged($lastlogin) {
    return TRUE;
  }

Für den Hook Nº 9 (Score) reicht es, die folgende Methode zu überschreiben:

  function getScore() {
    return 200000;
  }

Systemplugin

Auch Systemplugins können zum Score (Hook Nº 9) beitragen; auch dort muss dieselbe Methode überschrieben werden:

  function getScore() {
    return 200000;
  }

Außerdem dürfen Systemplugins im "Hintergrund" Sachen ausführen (Hook Nº 11). Dabei sind zwei Sachen zu beachten:

  1. Die definierten Tasks werden natürlich nicht im Hintergrund ausgeführt. PHP kann das einfach nicht.
  2. Die Tasks werden erst relativ spät (nämlich mitten während des Renderns der obersten Iconleiste) ausgeführt.

Das schränkt den Nutzen dieses Hooks sehr ein. Um dennoch Tasks ausführen zu lassen, müssen zwei Methoden überschrieben werden:

  function hasBackgroundTasks() {
    return TRUE;
  }

  function doBackgroundTasks() {
    printf('<script>alert("in %s:%s");</script>', __CLASS__, __FUNCTION__);
  }

Zu guter Letzt dürfen Systemplugins Icons in der obersten Iconleiste hinzufügen (Hook Nº 10). Verwendet wird entweder das Pluginicon oder falls definiert das Icon der Navigation. Ohne Navigation wird allerdings kein Icon angezeigt.

Letzte Änderung am September 13, 2009, at 10:29 PM von eludwig.