Entwickler.PluginSchnittstelleVortrag History

Hide minor edits - Show changes to markup

 
 
April 01, 2011, at 11:37 PM by tthelen -
Added lines 1-2:

(:redirect 'http://docs.studip.de/develop/Entwickler/PluginSchnittstelleVortrag':)

 
 
September 13, 2009, at 10:29 PM by eludwig -
Changed line 45 from:
  function MySystemPlugin() {
to:
  function __construct() {
Changed line 65 from:
  function MyAdministrationPlugin() {
to:
  function __construct() {
Changed lines 118-119 from:
    printf("in s (authorized: %s)\n", __CLASS__, __FUNCTION__,
           (int)$authorizedview);
to:
    printf("in s (authorized: %s)\n", __CLASS__, __FUNCTION__, $authorizedview);
 
 
September 13, 2009, at 10:06 PM by eludwig -
Changed lines 46-47 from:
    parent::AbstractStudIPSystemPlugin();
to:
    parent::__construct();
Changed lines 66-67 from:
   […]
to:
    parent::__construct();
 
 
September 13, 2009, at 07:50 PM by eludwig -
Deleted line 5:
  • Coreplugin
Changed lines 16-28 from:
PluginklasseAdministrationCoreHomepagePortalStandardSystem
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     ×
to:
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    ×
Changed lines 31-32 from:

Generell kann und sollte jedes Plugin folgende Methoden überschreiben:

to:

Generell kann und sollte jedes Plugin folgende Methode überschreiben:

Changed lines 34-44 from:
  1. Diese Methode wird jedesmal aufgerufen,
  2. wenn ein Plugin instanziiert wird.

void function initialize();

  1. Diese Methode gibt den lesbaren Namen des Plugins wieder.

String function getPluginname();

  1. Das Plugin sollte in jedem Fall über eine show-Methode verfügen,
  2. da diese der Haupteinstiegspunkt für die Plugin-Engine ist.
  3. Innerhalb dieser show-Methode sollte das Plugin den Request verarbeiten und eine Ausgabe liefern.

void function show();

to:
  # 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\n", __CLASS__, __FUNCTION__);
  }
Changed lines 42-43 from:

Ein Beispiel für diese Methoden:

to:

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

Changed lines 45-46 from:
  function initialize() {
    printf("in s\n", __CLASS__, __FUNCTION__);
to:
  function MySystemPlugin() {
    parent::AbstractStudIPSystemPlugin();

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

    # navigation
    $navigation = new PluginNavigation();
    $navigation->setDisplayname(_("MySystemPlugin Navigation"));
    $this->setNavigation($navigation);
Deleted lines 55-64:
  function getPluginname() {
    return _("MyCorePlugin Name");
  }


  function show() {
    printf("in s\n", __CLASS__, __FUNCTION__);
  }
Changed lines 58-59 from:

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

to:

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:

Deleted lines 64-86:
  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:

[@

Changed line 72 from:
    $top_navigation =& new PluginNavigation();
to:
    $top_navigation = new PluginNavigation();
Changed line 75 from:
    $top_navigation_submenu_1 =& new PluginNavigation();
to:
    $top_navigation_submenu_1 = new PluginNavigation();
Changed line 77 from:
    $top_navigation_submenu_1->setLinkParam('submenu_1');
to:
    $top_navigation_submenu_1->addLinkParam('cmd', 'submenu_1');
Changed line 80 from:
    $top_navigation_submenu_2 =& new PluginNavigation();
to:
    $top_navigation_submenu_2 = new PluginNavigation();
Changed line 82 from:
    $top_navigation_submenu_2->setLinkParam('submenu_2');
to:
    $top_navigation_submenu_2->addLinkParam('cmd', 'submenu_2');
Deleted lines 90-93:

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.

Changed lines 103-104 from:

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.

to:

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.

Changed line 106 from:
  function showAdministrationPage() {
to:
  function actionShowAdministrationPage() {
Changed line 124 from:

Um diese Methode aber überhaupt aufgerufen zu bekommen, MÜSSEN folgende Methoden __überschrieben__ werden.

to:

Um diese Methode aber überhaupt aufgerufen zu bekommen, müssen folgende Methoden überschrieben werden.

Deleted line 127:
Changed lines 143-144 from:

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.

to:

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.

Changed lines 167-168 from:

Theoretisch könnte ein Standardplugin auch eine Liste von Änderungen zurückgeben, aufgerufen wird die folgende Methode leider nie:

to:

Systemplugin

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

Changed lines 172-174 from:
  # not used
  function getChangeMessages($lastlogin, $ids) {
    return array();
to:
  function getScore() {
    return 200000;
Deleted lines 176-185:

Systemplugin

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

  function getScore() {
    return 200000;
  }
Changed lines 179-183 from:

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:

to:
  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:

Deleted line 188:
Changed line 194 from:

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.

to:

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.

 
 
September 03, 2008, at 12:11 PM by mlunzena -
Added lines 1-236:

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:

PluginklasseAdministrationCoreHomepagePortalStandardSystem
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.

 

 

Source: Basis-Wiki-Hilfe | Last change: April 01, 2011, at 11:37 PM, tthelen | Local view: Basis-Hilfe