Implementation eines Plugins
Grundsätzlich stehen sechs verschiedene Typen von Plugins zur Verfügung:
- Administrationsplugin
- Coreplugin
- 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:
Pluginklasse | Administration | Core | Homepage | Portal | Standard | System |
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 Methoden überschreiben:
# Diese Methode wird jedesmal aufgerufen,
# wenn ein Plugin instanziiert wird.
void function initialize();
# Diese Methode gibt den lesbaren Namen des Plugins wieder.
String function getPluginname();
# Das Plugin sollte in jedem Fall über eine show-Methode verfügen,
# da diese der Haupteinstiegspunkt für die Plugin-Engine ist.
# Innerhalb dieser show-Methode sollte das Plugin den Request verarbeiten und eine Ausgabe liefern.
void function show();
Ein Beispiel für diese Methoden:
function initialize() {
printf("in %s:%s\n", __CLASS__, __FUNCTION__);
}
function getPluginname() {
return _("MyCorePlugin Name");
}
function show() {
printf("in %s:%s\n", __CLASS__, __FUNCTION__);
}
Zusätzlich sollten im Konstruktor das Plugin-Icon und die Plugin-Navigation gesetzt werden. Ein Beispiel:
function MyCorePlugin() {
parent::AbstractStudIPCorePlugin();
# this plugin wants an own icon
$this->setPluginiconname("img/plugin.png");
# navigation
$navigation =& new PluginNavigation();
$navigation->setDisplayname(_("MyCorePlugin Navigation"));
$this->setNavigation($navigation);
}
Zu jedem Plugin darf auch die Methode showAdministrationPage()
überschrieben werden. Leider wird diese nur für Homepage- und Portalplugins tatsächlich verwendet.
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 MyAdministrationPlugin() {
[...]
## 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->setLinkParam('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->setLinkParam('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(..);
Coreplugin
Da die Coreplugins keinerlei Hooks bedienen, braucht hier nichts getan werden. Es stellt sich die Frage, warum es überhaupt diese Pluginklasse gibt, da dieselbe Funktionalität ebenso über einfache Bibliotheksdateien gegeben wäre.
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 Überschreiben der Methode showAdministrationPage()
, die angezeigt 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 showAdministrationPage() {
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__,
(int)$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 showAdministrationPage()
, 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;
}
Theoretisch könnte ein Standardplugin auch eine Liste von Änderungen zurückgeben, aufgerufen wird die folgende Methode leider nie:
# not used
function getChangeMessages($lastlogin, $ids) {
return array();
}
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.