(edit)
Unwichtige Korrekturen ausblenden - Änderungen im Wiki Quelltext
(:redirect 'http://docs.studip.de/develop/Entwickler/PluginSchnittstelle':)
Über die oben beschriebenen typspezifischen Fähigkeiten hinaus, d.h. insbesondere der Einbettung in vorhandene Seiten in Stud.IP, hat jedes Plugin die Möglichkeit, komplett eigene Seiten - inklusive einer eigenen Navigation - anzubieten. Dazu gibt es in der Plugin-Schnittstelle einen Mechanismus, der vom Nutzer aufgerufene URLs in Methodenaufrufe im Plugin übersetzt, in dieser Beschreibung als "Plugin-Aktionen" bezeichnet. Eine solche Plugin-Aktion ist eine normale (öffentliche) Methode in der Plugin-Klasse, deren Name auf "_action" endet:
_action
class TestPlugin extends StudipPlugin implements SystemPlugin { [...] public function delete_action($id) { [...] } }
Eine Aktion kann Funktionsparameter haben (hier im Beispiel: $id), aber auch Request-Parameter verarbeiten (z.B. beim Absenden eines Formulars).
$id
Über die oben beschriebenen typspezifischen Fähigkeiten hinaus hat jedes Plugin die Möglichkeit, eigene Seiten - inklusive einer eigenen Navigation - anzubieten. Das Erstellen von Navigationspunkten für Plugins ist an anderer Stelle beschrieben und funktioniert genauso wie im Stud.IP-Kernsystem.
Das Erstellen von Navigationspunkten für Plugins ist an anderer Stelle beschrieben und funktioniert genauso wie im Stud.IP-Kernsystem. Die zugehörigen URLs führen in der Regel zu bestimmten Aktionen im Plugin, deren Erstellung im folgenden Abschnitt beschrieben ist.
Damit der Nutzer eine bestimmte Aktion aufrufen kann, muß natürlich das Plugin auch die zugehörige URL kennen. Um URLs zu diesen Plugin-Aktionen erstellen zu können, gibt es zwei Hilfsfunktionen in der Klasse PluginEngine:
PluginEngine
/
show
<a href="<?= PluginEngine::getLink("testplugin/delete/$id") ?>"> Eintrag löschen </a>
getURL()
getLink()
header('Location: ' . $PluginEngine::getURL("testplugin/show"));
Gelegentlich ist es auch wünschenswert, mit anderen Plugins interagieren zu können. Dazu bietet die Klasse PluginEngine ebenfalls eine Reihe von Hilfsfunktionen:
NULL
System-Plugins werden auf jeder Seite in Stud.IP geladen (mit Ausnahme von Seiten, die eine komplett andere Darstellung verwenden wie z.B. Druckansichten). Sie können überall im System eignene Navigationspunkte einblenden.
System-Plugins werden auf jeder Seite in Stud.IP geladen (mit Ausnahme von Seiten, die eine komplett andere Darstellung verwenden wie z.B. Druckansichten). Sie können überall im System eigene Navigationspunkte einblenden.
Um an bestimmten Stellen in Stud.IP aktiv werden zu können, muß ein Plugin noch eines oder mehrere der Plugin-Interfaces implementieren. In der Version 1.11 stehen dafür die folgenden Schnittstellen bereit:
Um an bestimmten Stellen in Stud.IP aktiv werden zu können, muss ein Plugin noch eines oder mehrere der Plugin-Interfaces implementieren. In der Version 1.11 stehen dafür die folgenden Schnittstellen bereit:
Portal-Plugins werden auf der Startseite geladen, auch wenn der Benutzer (noch) nicht angemeldet ist. Sie können eigene Navigationsseite auf der Login- und Startseite einblenden und einen Informationsblock auf der Startseite anzeigen.
Portal-Plugins werden auf der Startseite geladen, auch wenn der Benutzer (noch) nicht angemeldet ist. Sie können eigene Navigationspunkte auf der Login- und Startseite einblenden und einen Informationsblock auf der Startseite anzeigen.
Dieses Interface enthält die folgende Methode:
Dieses Interface enthält die folgenden Methoden:
TODO
Das StudienmodulManagementPlugin wird in der Anzeige von Studienbereichen verwendet, um weitere modulespezifische Informationen anzeigen zu können.
Frage: Wie bindet man Trails in ein Plugin ein?
Darüber hinaus hat jedes Plugin die Möglichkeit, eigene Seiten - inklusive eigener Navigation - anzubieten.
Homepage-Plugins werden nur im Homepage-Kontext geladen. Sie können auf der Homepage eigene Navigationspunkte einblenden und einen Informationsblock auf der Übersichtsseite der Homepage anzeigen.
Standard-Plugins werden nur im Veranstaltungs- und Einrichtungs-Kontext geladen (allerdings zur Zeit nicht im Admin-Bereich). Sie können in der Veranstaltung bzw. Einrichtung eigene Navigationspunkte einblenden und ein Icon mit einem Link zum Plugin auf der Seite "Meine Veranstaltungen" anzeigen.
Dieses Interface enthält keine Methoden.
Dieses Interface enthält die folgende Methode: :getHomepageTemplate($user_id): Liefert ein Template, das auf der Übersichtsseite des Benutzers angezeigt wird. Wenn das Plugin dort nicht angezeigt werden soll, sollte die Methode NULL liefern. Zur Konfiguration des Anzeigebereichs kann das Plugin im Template neben den eigenen Platzhaltern noch einige spezielle Werte setzen (Voreinstellungen in eckigen Klammern): * title – Anzeigetitel [Name des Plugins] * icon_url – Plugin-Icon [kein Icon] * admin_url – Administrations-Link [kein Link] * admin_title – Beschriftung für den Administrations-Link [Administration]
Dieses Interface enthält die folgende Methode: :getPortalTemplate(): Liefert ein Template, das auf der Startseite des Systems angezeigt wird. Wenn das Plugin dort nicht angezeigt werden soll, sollte die Methode NULL liefern. Zur Konfiguration des Anzeigebereichs kann das Plugin im Template neben den eigenen Platzhaltern noch einige spezielle Werte setzen (Voreinstellungen in eckigen Klammern): * title – Anzeigetitel [Name des Plugins] * icon_url – Plugin-Icon [kein Icon] * admin_url – Administrations-Link [kein Link] * admin_title – Beschriftung für den Administrations-Link [Administration]
Jedes Plugin muß mindestens eine Klasse enthalten, die die für die Einbettung in die Stud.IP-Umgebung erforderlichen Funktionen des Plugins implementiert. Natürlich können daneben beliebig viele weitere Klassen im Plugin-Paket enthalten sein.
Die Plugin-Klasse muß den im Manifest unter pluginclassname angegebenen Namen haben und von der Klasse StudIPPlugin abgeleitet sein. Außerdem sollte die Klasse mindestens ein Interface implementieren, um sich an bestimmten Stellen in ein bestehendes Stud.IP-System einklinken zu können.
StudIPPlugin
Durch das Ableiten von der Klasse StudIPPlugin besitzt jedes Plugin automatisch eine Reihe von Methoden:
Innerhalb eines Plugin-Pakets kann sich ein SQL-Skript befinden, welches mit Semikolon abgeschlossene SQL-Befehle enthält. Dieses SQL-Skript dient dem initialen Anlegen einer oder mehrerer Datenbank-Tabellen für das Plugin. Es wird während der Installation des Plugins von Stud.IP ausgeführt.
Analog zu den Regeln für ein SQL-Skript zur Erzeugung des Datenschemas für das Plugin läßt sich auch ein Skript definieren, welches unmittelbar vor dem Entfernen des Plugins aus Stud.IP ausgeführt wird.
(:source lang=xml:)[@
In der folgenden Abschnitten werden die verschiedenen Bestandteile eines Plugin-Pakets der Reihe nach erklärt:
Jedes Plugin-Paket muß ein sogenanntes "Plugin-Manifest" enthalten, in dem wichtige Informationen über das Plugin für die Installation und Verwaltung des Plugins enthalten sind. Das Plugin-Manifest liegt immer im Wurzelverzeichnis des Plugins und hat den Namen plugin.manifest. Es ist eine Textdatei und kann bzw. muß folgende Einträge enthalten:
plugin.manifest
version_compare()
updateURL
@]
plugin
release
Ein Beispiel für ein vollständiges Manifest:
pluginname=Demo pluginclassname=DemoPlugin origin=virtUOS version=1.2 dbscheme=sql/install.sql uninstalldbscheme=sql/uninstall.sql updateURL=http://plugins.studip.de/svn/plugins/plugins.xml studipMinVersion=1.6.0 studipMaxVersion=1.8.5
(:toc:)
Da jeder Standort, an dem Stud.IP eingesetzt wird, ganz eigene Anforderungen oder Einschränkungen hat, wird mit der Plugin-Schnittstelle ein Mechanismus angeboten, über den man eigene Funktionen zu Stud.IP hinzufügen kann, ohne dabei das Kernsystem anfassen zu müssen. Das Aktualisieren, Entfernen oder Hinzufügen von Komponenten ist dabei im laufenden Betrieb möglich.
Plugins können eigene Seiten im Stud.IP-System anbieten, die an bestimmten Stellen in die Navigationsstruktur eingebunden werden können, z.B. als neuer Reiter in einer Veranstaltung. Darüber hinaus verfügen bestimmte Plugin-Typen auch über die Möglichkeit, auf bestehende Seiten Einfluß zu nehmen und damit z.B. einen eigenen Block auf der Stud.IP-Startseite anzuzeigen.
Ein Plugin ist eine ZIP-Datei, die eine Beschreibung des Pugins (Name, Version, usw.), den Programmcode und ggf. von Plugin mitgebrachte Ressourcen (Bilder, Stylesheets usw.) enthält. Im einzelnen kann ein Plugin-Paket die folgenden Komponenten enthalten:
migrations
locale
templates
Ein Beispiel für die Verzeichnisstruktur in einem Plugin-Paket:
MyPlugin.class.php plugin.manifest images/ icon.png migrations/ 1_test.php 2_foobar.php sql/ install.sql uninstall.sql stylesheets/ grid.css templates/ page.php
<?xml version="1.0" encoding="UTF-8"?> <plugins> <plugin name="Demo"> <release version="1.2" url="http://plugins.studip.de/uploads/Plugins/demo-1.2.zip" studipMinVersion="1.6.0" studipMaxVersion="1.8.5" /> <release version="2.0" url="http://plugins.studip.de/uploads/Plugins/demo-2.0.zip" studipMinVersion="1.8.0" /> </plugin> </plugins>
Grundsätzlich stehen sechs verschiedene Typen von Plugins zur Verfügung:
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:
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.
showAdministrationPage()
Abhängig von der Pluginklasse müssen weitere Anpassungen getätigt werden. Diese werden im folgenden aufgeführt.
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(..);
$this->setNavigation(..);
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.
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:
showOverview()
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__); }
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:
showOverview
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.
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);.
$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:
setPluginIconName('iconname')
setChangeIndicatorIconName('iconname')
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(); }
Auch Systemplugins können zum Score (Hook Nº 9) beitragen; auch dort muss dieselbe Methode überschrieben werden:
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.
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:
setPluginiconname('iconname')
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:
setChangeIndicatoriconName('iconname')
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:
setChangeindicatoriconname('iconname')
Portalplugins können je nach Rechtesetzung (siehe StudipEntwicklung.PluginRechte?) auf der Loginseite (Hook #1) und auf der Übersichtsseite (Hook #2) erscheinen.
Jedes Plugin bedient dabei bestimmte StudipEntwicklung.PluginHooks?, 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 StudipEntwicklung.PluginHooks? zeigt die entsprechenden Screenshots.
Quelle: Basis-Wiki-Hilfe | Letzte Änderung: 01.04.2011 23:33 Uhr, tthelen | Local view: Basis-Hilfe