# Plugins

## Eigene Plugins erstellen

Plugins können im Verzeichnis `/share/plugins/[plugin_type]/` eingebunden werden.&#x20;

Aktuell werden die folgende `[plugin_type]`unterstützt:

* auth&#x20;
* repository&#x20;
* webservice

### Aufbau eines Plugins

```
Ordnerstruktur:
/pluginname/plugin.php 
           /(config.php)
           /(install.php)
           /(classes/)
           /(processors/)
           /(request/)
           
```

Die Datei plugin.php erweitert die entsprechende \[plugin\_type]\_plugin\_base Klasse. Hier ein Beispiel für ein Repository-Plugin.

```
class repository_plugin_meinPlugin extends repository_plugin_base {
    const PLUGINNAME = 'meinPlugin';
    
    /**
     * optionale const HIDE_IN_CONFIG
     * Wenn HIDE_IN_CONFIG gesetzt ist, wird kein Tab in config.tpl angezeigt.
     * Dies ist meist bei Subklassen von Plugins der Fall
     */
    const HIDE_IN_CONFIG = true;
    
    /**
     * Optionale Funktion
     * plugin_config wird (falls definiert) in config.tpl über die folgende Renderfunktion aufgerufen
     * {RENDER::plugin_config("{$plugin.type}_plugin_{$plugin.name}")}
     * So können zusätzliche Konfigurationen geladen werden. 
     */
    public function plugin_config(){
        return "Config is working";
    }
}        
```

### Plugin einbinden

Damit ein Plugin genutzt werden kann, muss es aktiviert werden.&#x20;

Dies geschieht durch einen Eintrag in die Tabelle **config.** Um z.B. das oAuth2 Plugin zu aktivieren, muss der folgende Eintrag gemacht werden.&#x20;

| name | value  | context\_id | reference | type   |
| ---- | ------ | ----------- | --------- | ------ |
| auth | oauth2 | 19          | 0         | string |

Erläuterung:

* **name**: Typ des Plugins
* **value**: Name des Plugins
* **context\_id**: 19 (entspricht config Tabelle)
* **type**: string (benötigt, damit das Feld **value** in php den passenden Datentyp erhält)

Alle Einträge mit dem context **config** (context\_id 19) werden in der Datei setup.php über die Funktion `$config->load(); //config.class.php line 41`geladen.&#x20;

Die Plugin-Klasse wird über den Klassennamen sowie über $CFG verfügbar gemacht. Die Klasse kann dann folgt instanziert werden:&#x20;

```
// Beispiel 1: Wenn ein bestimmtes Plugin aufgerufen werden soll
$auth = $CFG->settings->auth->oauth2;
$auth->test();

$auth1 = new auth_plugin_oauth2();
$auth1->test();

// Beispiel 2: Wenn alle Klassen eines Plugin-Types instanziert werden sollen. 
// Hier das Beispiel zum Laden von Dateien. Es werden alle aktiven Repos aufgerufen.
foreach ($CFG->settings->repository as $r) {
    if (method_exists($r,'getFiles')){
        $files = $r->getFiles($dependency, $id, $files); 
    }
}
```

### Konfiguration

Für plugins ohne eigene Datenbank-Tabelle bietet curriculum die Möglichkeit Konfigurationen in der Tabelle **config\_plugins** zu speichern. Dazu muss die Konfiguration dem Plugin zugeordnet werden. Dazu werden in **plugin** der Plugin-Bezeichner wie folgt gespeichert: plugintyp/pluginname. Unter **name** wird der Variablenname und unter **value** der Wert gespeichert.

| plugin      | name | value                           |
| ----------- | ---- | ------------------------------- |
| auth/oauth2 | api  | https://api.curriculumonline.de |

Die Konfigurations-Einträge können dann über die Konfigurationsseite (config.tpl) eingesehen und bearbeitet werden.&#x20;
