Actions

Plugins - advanced/de: Difference between revisions

From LimeSurvey Manual

(Updating to match new version of source page)
(Updating to match new version of source page)
 
(116 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages />
<languages />
== Overview ==
== Übersicht ==


Starting from LimeSurvey 2.05, LimeSurvey will officially support plugins. Some plugins will be supported by the LimeSurvey team and will go into core. Some will be supported by others outside the LimeSurvey team. To help find them, check out the [[Available third party plugins]] and add your own plugin to it!
Ab LimeSurvey 2.05 unterstützt LimeSurvey offiziell Plugins. Einige Plugins werden vom LimeSurvey-Team unterstützt und in den Kern integriert. Einige werden von anderen außerhalb des LimeSurvey-Teams unterstützt. Um sie leichter zu finden, sehen Sie sich die [[Verfügbare Plugins von Drittanbietern]] an und fügen Sie Ihr eigenes Plugin hinzu!


Plugins allow users to customize the functionality of their installation while still being able to benefit from regular software updates.
Mit Plugins können Benutzer die Funktionalität ihrer Installation anpassen und gleichzeitig von regelmäßigen Software-Updates profitieren.


This documentation is meant for developers that are extending LimeSurvey for their own use or for their clients; end users will not be helped by this documentation.
Diese Dokumentation richtet sich an Entwickler, die LimeSurvey für den eigenen Gebrauch oder für ihre Kunden erweitern; Endbenutzern wird diese Dokumentation nicht weiterhelfen.


Plugins must implement the [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/iPlugin.php iPlugin] interface. We recommend extending your plugin class from the [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/PluginBase.php PluginBase] class.  
Plugins müssen die Schnittstelle [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/iPlugin.php iPlugin] implementieren. Wir empfehlen, Ihre Plugin-Klasse von der Klasse [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/PluginBase.php PluginBase] zu erweitern.  


Plugins are developed around an [http://manual.limesurvey.org/Plugin_events event] mechanism.
Plugins werden rund um einen [http://manual.limesurvey.org/Plugin_events Event]-Mechanismus entwickelt.


== Plugin settings ==
== Plugin-Einstellungen ==


By extending you benefit from common functionality required by plugins that we already have implemented for you. One of these function is the implementation of the getPluginSettings function. This function must return an array describing the configuration options for the user.
Durch die Erweiterung profitieren Sie von der allgemeinen Funktionalität, die von Plugins benötigt wird, die wir bereits für Sie implementiert haben. Eine dieser Funktionen ist die Implementierung der getPluginSettings-Funktion. Diese Funktion muss ein Array zurückgeben, das die Konfigurationsoptionen für den Benutzer beschreibt.


The example plugin exposes just 1 configurable setting, the message it'll show.
Das Beispiel-Plugin stellt nur eine konfigurierbare Einstellung bereit, nämlich die angezeigte Meldung.


<syntaxhighlight lang="php" enclose="div">
<syntaxhighlight lang="php">
protected $settings = array(
protected $settings = array(
    'logo' => array(
'logo' => array(
         'type' => 'logo',
  'type' => 'logo',
         'path' => 'assets/logo.png'
  'path' => 'assets/logo.png'
      ),
  ) ,


     'message' => array(
'message' => array(
         'type' => 'string',
'type' => 'string',
          'label' => 'Message'
'label' => 'Message'
     )
)
);
);
</syntaxhighlight>
</syntaxhighlight>


The array contains a name for each setting as a key. The values are arrays containing the required meta data.
Das Array enthält für jede Einstellung einen Namen als Schlüssel. Die Werte sind Arrays, die die erforderlichen Metadaten enthalten.


Supported types are:
Unterstützte Typen sind:


* logo
* logo
* string
* int (ganzzahlige Zahl)
* string (alphanumerisch)
* text
* html
* html
* choice
* relevant
* relevance
* info
* info
* passwort
* datum! N!* auswählen


Besides type a number of other keys are available:
Neben dem Typ stehen noch eine Reihe weiterer Schlüssel zur Verfügung:


* label, defines a label
* label, definiert eine Beschriftung.
* default, defines a value to show if no value is specified (only for global settings, not for survey settings)
* default, definiert einen Wert, der angezeigt wird, wenn kein Wert angegeben ist (nur für globale Einstellungen, nicht für Umfrageeinstellungen).
* current, defines the current value.
* current, definiert den aktuellen Wert.
* readOnly : shown the settings as readonly
* readOnly: Zeigt die Einstellungen als schreibgeschützt an
* htmlOptions, the htmlOptions of the input part ( see Yii manual [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* htmlOptions, die htmlOptions des Eingabeteils (siehe Yii-Handbuch [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* pluginOptions, for some settings (html or select) : set the widget option
* PluginOptions, für Einige Einstellungen (HTML oder Select): Legen Sie die Widget-Option fest
* labelOptions : htmlOptions of the label
* labelOptions: htmlOptions des Labels
* controlOptions : htmlOptions of the wrapper of label and input
* controlOptions: htmlOptions des Wrappers von Label und Eingabe


You can find a plugin example using all actual settings at [https://framagit.org/Shnoulle/exampleSettings exampleSettings]  
Ein Plugin-Beispiel mit allen tatsächlichen Einstellungen finden Sie unter [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
=== Read and write plugin settings ===
=== Plugin-Einstellungen lesen und schreiben ===


It's possible to read and write plugin settings directly from your plugin code.
Es ist möglich, Plugin-Einstellungen direkt aus Ihrem Plugin-Code zu lesen und zu schreiben.


Example:
Beispiel:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Line 66: Line 69:
</syntaxhighlight>
</syntaxhighlight>


You can get a default value if the setting happens to be null:
Sie können einen Standardwert erhalten, wenn die Einstellung zufällig null ist:
 
<syntaxhighlight lang="php">
$mySetting = $this->get('mySetting', null, null, 10); // 10 ist Standard
</syntaxhighlight>
 
=== Survey specific plugin settings ===
 
Two events are used to create survey specific plugin settings:
 
* newSurveySettings
* beforeSurveySettings
 
Example to disable a plugin for a specific survey:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$mySetting = $this->get('mySetting', null, null, 10); // 10 is default
 
    public function init()
    {
        $this->subscribe('beforeSurveySettings');
        $this->subscribe('newSurveySettings');
        // Other events...
    }
 
    public function beforeSurveySettings()
    {
    $event = $this->event;
    $surveyId = intval($event->get('survey'));
 
        $event->set(
            "surveysettings.{$this->id}",
            [
                'name' => get_class($this),
                'settings' => [
                    'isActive' => [
                        'type' => 'boolean',
                        'label' => 'isActive',
                        'current' => $this->getIsActive($surveyId),
                        'help' => 'Activate plugin for this survey'
                    ],
                ]
            ]
        );
    }
 
    public function newSurveySettings()
    {
        $event = $this->event;
        foreach ($event->get('settings') as $name => $value)
        {
            $this->set($name, $value, 'Survey', $event->get('survey'), false);
        }
    }
 
    private function getIsActive(int $sid): bool
    {
        return (bool) $this->get('isActive', 'Survey', $sid, false);
    }
</syntaxhighlight>
</syntaxhighlight>


== Events ==
== Ereignisse ==


Plugins subscribe to events and can interact with LimeSurvey when the event is fired. For a list of currently available events check [[Plugin events]].
Plugins abonnieren Ereignisse und können mit LimeSurvey interagieren, wenn das Ereignis ausgelöst wird. Eine Liste der derzeit verfügbaren Ereignisse finden Sie unter [[Plugin-Ereignisse]].


== API ==
== API ==


Plugins should only extend LimeSurvey via its "public" API. This means that directly using classes found in the source code is a bad practice. Though we can't force you not to, you risk having a broken plugin with every minor update we do.
Plugins sollten LimeSurvey nur über seine „öffentliche“ API erweitern. Dies bedeutet, dass die direkte Verwendung von im Quellcode gefundenen Klassen eine schlechte Praxis ist. Obwohl wir Sie nicht zwingen können, dies nicht zu tun, riskieren Sie bei jedem kleineren Update, das wir durchführen, ein defektes Plugin.


As much as possible interact with LimeSurvey only via methods described [http://api.limesurvey.org/classes/LimeSurvey.PluginManager.LimesurveyApi.html here]. Same as for events.
Interagieren Sie mit LimeSurvey so weit wie möglich nur über die beschriebenen Methoden [http://api.limesurvey.org/classes/LimeSurvey.PluginManager.LimesurveyApi.html hier]. Gleiches wie bei Veranstaltungen.


The API object is available via <code>$this->api</code> when extending from PluginBase, otherwise you can get it from the PluginManager instance that is passed to your plugins' constructor.
Das API-Objekt ist über <code>$this->api</code> verfügbar, wenn es von PluginBase erweitert wird. Andernfalls können Sie es von der PluginManager-Instanz abrufen, die an den Konstruktor Ihres Plugins übergeben wird.


New functions can be added to the API object upon request.
Auf Anfrage können dem API-Objekt neue Funktionen hinzugefügt werden.


== Localization {{NewIn|v=3}} ==
== Formularerweiterung{{NewIn|v=6}} ==


It's possible for plugins to add their own locale files. File format used is .mo, same as core translations. The files must be stored in
=== Einführung ===


<plugin root folder>/locale/<language>/<language>.mo
Das Formularerweiterungssystem ist eine allgemeinere Möglichkeit, Formulare im Kern von LimeSurvey zu erweitern, ohne für jedes Formular ein neues Ereignis hinzuzufügen.


where "<language>" is a two letter word like "de" or "fr".
Es besteht aus folgenden Komponenten:


To use the specific locale file, use the plugin function gT:
* Ein globales Modul namens '''FormExtensionService''
* Eine Bibliothek von '''Eingabeklassen'', die Plugins zur obigen Modulinitialisierung hinzufügen können
* Ein '''Widget'', zusammen mit Benutzerdefinierte Renderer, die in den LimeSurvey-Ansichtsdateien verwendet werden
 
Jedes Formular wird durch eine „Positionszeichenfolge“ identifiziert, z<form name><dot><tab name> . Beispiel: <code>globalsettings.general</code> oder <code>globalsettings.security</code> .
 
Der Sinn eines klassenbasierten Systems ohne HTML besteht darin, die Plugin-Autoren von der Arbeit zu befreien, damit sie den HTML-Code aktualisieren können, wenn sich der Kern-HTML-Code ändert. Dennoch kann der Autor bei Bedarf den Typ <code>RawHtmlInput</code> verwenden.
 
Eine Sache, die Sie in diesem System nicht tun können, ist das Hinzufügen „neuer Formularregisterkarten“.
 
=== Beispiel ===
 
Um einem Formular über ein Plugin eine neue Eingabe hinzuzufügen, verwenden Sie den folgenden Code aus Ihrer <code>init()</code> Funktion:
 
TODO: In den Plugin-Einstellungen statt global speichern


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("A plugin text that needs to be translated");
// Am Anfang der Datei
use LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
use LimeSurvey\Libraries\FormExtension\SaveFailedException;
 
// Inside init()
Yii::app()->formExtensionService->add(
'globalsettings.general',
new TextInput([
'name' => 'myinput',
'label' => 'Label',
'disabled' => true,
'tooltip' => 'Moo muh muh',
'help' => 'Einige Hilfetexte',
'save' => function($request, $connection) {
$value = $request->getPost('myinput');
if ($value === 'irgendein ungültiger Wert') {
throw new SaveFailedException("Die benutzerdefinierte Eingabe 'myinput' konnte nicht gespeichert werden");
} else {
SettingGlobal::setSetting('myinput', $value);
}
} ,
'load' => function () {
return getGlobalSetting('myinput');
}
])
);
</syntaxhighlight>
</syntaxhighlight>


If the given string can't be found in the plugin specific locale file, the function will look in the core locale files. So it's safe to use strings like "Cancel":
=== Validierung ===
 
Die Validierung der Eingabe erfolgt in der <code>save</code> (siehe Beispiel oben). Wenn der gepostete Wert ungültig ist, lösen Sie eine <code>SaveFailedException</code> aus und dem Benutzer wird eine Warnmeldung angezeigt.
 
=== Unterstützte Formulare ===
 
Folgende Formen können erweitert werden:
 
* globalsettings.general{{NewIn|v=6.0.0}}
 
Wenn Sie Unterstützung für ein anderes Kernformular hinzufügen möchten, müssen Sie die folgende Änderung in einem Pull-Request anwenden:
 
Fügen Sie in der Ansichtsdatei Folgendes hinzu:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("Cancel"); // Will be translated even if "Cancel" is not in the plugin locale file
<?php
use LimeSurvey\Libraries\FormExtension\FormExtensionWidget;
use LimeSurvey\Libraries\FormExtension\Inputs\DefaultBaseRenderer;
?>
... mehr HTML
<?= FormExtensionWidget::render(
    App()-> formExtensionService->getAll('globalsettings.security'),
new DefaultBaseRenderer()
); ?>
</syntaxhighlight>
</syntaxhighlight>


If you are using views together with your plugin, you should use
Möglicherweise müssen Sie eine neue Renderer-Klasse basierend auf <code>DefaultBaseRenderer</code> erstellen, wenn sich der HTML-Code des Formulars von anderen Formularen unterscheidet. Möglicherweise müssen Sie auch die Standard-Renderer-Klasse um Eingabetypen erweitern, die noch nicht hinzugefügt wurden.
 
Die zweite Änderung, die Sie vornehmen müssen, ist das Hinzufügen eines Aufrufs der Formularerweiterungsdienstklasse in der Controller-Aktion, die das Formular speichert:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$plugin->gT("Translate me");
$request = App()->request;
Yii::app()->formExtensionService->applySave('globalsettings', $request);
</syntaxhighlight>
</syntaxhighlight>


to do plugin specific translation in your view.
Das ist es!


== Logging {{NewIn|v=3}} ==
== Lokalisierung {{NewIn|v=3}} ==


If you want to log something from your plugin, just write
Es ist für Plugins möglich, ihre eigenen Gebietsschemadateien hinzuzufügen. Das verwendete Dateiformat ist .mo, dasselbe wie bei Kernübersetzungen. Die Dateien müssen in gespeichert werden
 
<plugin root folder>/Gebietsschema/<language> /<language> .mo
 
Wo "<language> „ist ein aus zwei Buchstaben bestehendes Wort wie „de“ oder „fr“.
 
Um die spezifische Gebietsschemadatei zu verwenden, verwenden Sie die Plugin-Funktion gT:
 
<syntaxhighlight lang="php">
$this->gT("Ein Plugin-Text, der übersetzt werden muss");
</syntaxhighlight>
 
Wenn die angegebene Zeichenfolge in der Plugin-spezifischen Gebietsschemadatei nicht gefunden werden kann, sucht die Funktion in den Kerngebietsschemadateien. Daher ist es sicher, Zeichenfolgen wie „Abbrechen“ zu verwenden:
 
<syntaxhighlight lang="php">
$this->gT("Abbrechen"); // Wird übersetzt, auch wenn „Abbrechen“ nicht in der Plugin-Gebietsschemadatei enthalten ist
</syntaxhighlight>
 
Wenn Sie Ansichten zusammen mit Ihrem Plugin verwenden, sollten Sie verwenden
 
<syntaxhighlight lang="php">
$plugin->gT("Übersetze mich");
</syntaxhighlight>
 
um aus Ihrer Sicht eine Plugin-spezifische Übersetzung durchzuführen.
 
Sie können die Datei [https://github.com/LimeSurvey/LimeSurvey/blob/master/locale/_template/limesurvey.pot limesurvey.pot] als Beispiel dafür verwenden, wie eine Pot-Datei aussehen kann. Dies wird in Ihr Übersetzungstool importiert.
 
=== Werkzeuge ===
 
Ein Open-Source-Tool zum Bearbeiten von Po- und Mo-Dateien ist [https://poedit.net/Poedit].
 
== Protokollierung {{NewIn|v=3}} ==
 
Wenn Sie etwas von Ihrem Plugin protokollieren möchten, schreiben Sie einfach


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Your message");
$this->log("Ihre Nachricht");
</syntaxhighlight>
</syntaxhighlight>


The default logging level is trace, but you can give another log level as an optional second argument:
Die Standardprotokollierungsstufe ist „trace“, Sie können jedoch eine andere Protokollierungsstufe als optionales zweites Argument angeben:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Something went wrong!", CLogger::LEVEL_ERROR);
$this->log("Etwas ist schiefgelaufen!", CLogger::LEVEL_ERROR);
</syntaxhighlight>
</syntaxhighlight>


The log file can be found in folder
Die Protokolldatei finden Sie im Ordner


  <limesurvey root folder>/tmp/runtime/plugin.log
  <limesurvey root folder>/tmp/runtime/plugin.log


Your plugin name is automatically used as category. A nice way to see only the errors from your plugin is using grep (on Linux):
Ihr Plugin-Name wird automatisch als Kategorie verwendet. Eine gute Möglichkeit, nur die Fehler Ihres Plugins anzuzeigen, ist die Verwendung von grep (unter Linux):


  $ tail -f tmp/runtime/plugin.log | grep <your plugin name>
$ tail -f tmp/runtime/plugin.log | grep<your plugin name>


More info about configuring logging in Yii 1: [[Optional_settings#Logging_settings]].
Weitere Informationen zum Konfigurieren der Protokollierung in Yii 1: [[Optional_settings#Logging_settings]].


== Extension updates {{NewIn|v=4}} ==
== Erweiterungsaktualisierungen {{NewIn|v=4}} ==


Since LimeSurvey version 4.0.0, there's a system in place to deal with plugin and other extension updates. To use this system, your extension config.xml file needs to include updater configuration.
Seit LimeSurvey Version 4.0.0 gibt es ein System für den Umgang mit Plugin- und anderen Erweiterungsaktualisierungen. Um dieses System verwenden zu können, muss Ihre Erweiterungsdatei config.xml die Updater-Konfiguration enthalten.


<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<updaters>
<updaters>  
    <updater>
<updater>  
        <stable>1</stable>
<stable> 1</stable>  
        <type>rest</type>
<type> ausruhen</type>  
        <source>https://comfortupdate.limesurvey.org/index.php?r=limestorerest</source>
<source> https://comfortupdate.limesurvey.org/index.php?r=limestorerest</source>  
        <manualUpdateUrl>https://somedownloadlink.com/maybegithub</manualUpdateUrl>
<manualUpdateUrl> https://somedownloadlink.com/maybegithub</manualUpdateUrl>  
    </updater>
</updater>  
</updaters>
</updaters>  
</syntaxhighlight>
</syntaxhighlight>


(The source tag above points to the LimeStore REST API, which will be used for all extensions available in our LimeStore.)
(Das obige Quell-Tag verweist auf die LimeStore-REST-API, die für alle in unserem LimeStore verfügbaren Erweiterungen verwendet wird.)


{| class="wikitable"
{| class="wikitable"
|+ Updater tag descriptions
|+ Updater-Tag-Beschreibungen
|-
|-
! Tag  
! Tag  
! Description
! Beschreibung
|-
|-
| stable
| stabil
| "1" if this source only gives you stable version numbers; "0" if the source will also provide unstable versions, like <code>0.3.3-beta</code>.
| „1“, wenn diese Quelle nur stabile Versionsnummern liefert; „0“, wenn die Quelle auch instabile Versionen bereitstellt, wie <code>0.3.3-beta</code> .
|-
|-
| type
| Geben Sie
| For now, only type <code>rest</code> is supported. It's easy to add new updater types (version checkers), like git, wget, etc.
| ein Derzeit wird nur der Typ <code>rest</code> unterstützt. Es ist einfach, neue Updater-Typen (Versionsprüfer) wie Git, Wget usw. hinzuzufügen
|-
|-
| source
| Quelle
| The URL to fetch new versions from.
| Die URL zum Abrufen neuer Versionen von.
|-
|-
| manualUpdateUrl  
| manualUpdateUrl  
| URL which the user can go to to update the latest version of the extension.
| URL, zu der der Benutzer gehen kann, um die neueste Version der Erweiterung zu aktualisieren.
|-
|-
| automaticUpdateUrl
| AutomaticUpdateUrl
| TODO
| TODO
|}
|}


If you don't want to supply an updater, you should put the following text in your config XML file:
Wenn Sie keinen Updater bereitstellen möchten, sollten Sie den folgenden Text in Ihre Konfigurations-XML-Datei einfügen:


<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<updaters disabled="disabled">
<updaters disabled="disabled">  
</updaters>
</updaters>  
</syntaxhighlight>
</syntaxhighlight>


This way, you tell the system that you purposefully disabled the update system, and didn't just forget to add it.
Auf diese Weise teilen Sie dem System mit, dass Sie das Update-System absichtlich deaktiviert und nicht einfach vergessen haben, es hinzuzufügen.


The new plugin '''UpdateCheck''' - installed and activated by default - checks for new updates for ''all'' installed extensions when a super admin logs in, asynchronously, max one time every 24 hours. If any new versions are found, a notification is pushed.
Das neue Plugin „UpdateCheck“ – standardmäßig installiert und aktiviert – sucht nach neuen Updates für „alle“ installierten Erweiterungen, wenn sich ein Superadministrator asynchron anmeldet, maximal einmal alle 24 Stunden. Wenn neue Versionen gefunden werden, wird eine Benachrichtigung gesendet.


[[File:availableupdates.png||Available updates]]
[[Datei:availableupdates.png||Verfügbare Updates]]


If a new security update is found, the notification will open automatically and be styled in "danger" class.
Wenn ein neues Sicherheitsupdate gefunden wird, wird die Benachrichtigung automatisch geöffnet und in der Kategorie „Gefahr“ angezeigt.


[[File:availablesecurityupdates.png||Available security updates]]
[[Datei:availablesecurityupdates.png||Verfügbare Sicherheitsupdates]]


You can manually check for updates by going to the plugin manager view and click on "Check updates". Note that this button is only visible if the UpdateCheck plugin is activated.
Sie können manuell nach Updates suchen, indem Sie in der Plugin-Manager-Ansicht auf „Updates prüfen“ klicken. Beachten Sie, dass diese Schaltfläche nur sichtbar ist, wenn das UpdateCheck-Plugin aktiviert ist.


[[File:manuallycheckforupdates.png||Manually check for updates]]
[[File:manuallycheckforupdates.png||Manuell nach Updates suchen]]


=== Under the hood ===
=== Unter der Haube ===


This section provides a brief overview over the extension updater implementation.
Dieser Abschnitt bietet einen kurzen Überblick über die Implementierung des Erweiterungs-Updaters.


The extension updater is part of the ExtensionInstaller library. Below is a UML diagram for the classes related to the updater process.
Der Erweiterungs-Updater ist Teil der ExtensionInstaller-Bibliothek. Unten finden Sie ein UML-Diagramm für die Klassen, die sich auf den Updater-Prozess beziehen.


[[File:extensionupdateruml.png||Extension updater UML diagram]]
[[File:extensionupdateruml.png||Extension Updater UML-Diagramm]]


Program flow when Yii starts:
Programmablauf beim Start von Yii:


<pre>
<pre>
  Yii init
  Yii init
  VersionFetcherServiceLocator->init()
VersionFetcherServiceLocator->init()
    Add REST version fetcher
REST-Versions-Fetcher hinzufügen
  ExtensionUpdaterServiceLocator->init()
ExtensionUpdaterServiceLocator->init()
    Add PluginUpdater
PluginUpdater!N hinzufügen! TODO: Für jeden Erweiterungstyp (Theme, Fragenvorlage, ...) einen Updater hinzufügen
    TODO: Add an updater for each extension type (theme, question template, ...)
</pre>
</pre>


Program flow when running the UpdaterCheck plugin:
Programmablauf beim Ausführen des UpdaterCheck-Plugins:


<pre>
<pre>
  Get all updaters from ExtensionUpdaterServiceLocator
  Holen Sie sich alle Updater von ExtensionUpdaterServiceLocator
  Loop each updater
  Schleifen Sie jeden Updater
  For each updater, loop through version fetchers configured by <updater> XML
Durchlaufen Sie für jeden Updater die von konfigurierten Versionsabrufer<updater> XML
    For each version fetcher, contact remote source and get version information
Wenden Sie sich für jeden Versionsabrufer an die Remote-Quelle und holen Sie sich Versionsinformationen
  Compose all versions into a notification
  Fassen Sie alle Versionen in einer Benachrichtigung zusammen
</pre>
</pre>


The [https://github.com/LimeSurvey/LimeSurvey/blob/develop/application/core/plugins/UpdateCheck/UpdateCheck.php#L130 checkAll] method in the UpdateCheck plugin provides an example of how to query all extensions for new versions.
Die Methode [https://github.com/LimeSurvey/LimeSurvey/blob/develop/application/core/plugins/UpdateCheck/UpdateCheck.php#L130 checkAll] im UpdateCheck-Plugin bietet ein Beispiel dafür, wie alle Erweiterungen nach neuen Versionen abgefragt werden .


==== Adding new version fetchers ====
==== Neue Versionsabrufer hinzufügen ====


To add a new custom version fetcher, run this during Yii initialization:
Um einen neuen benutzerdefinierten Versionsabrufer hinzuzufügen, führen Sie Folgendes während der Yii-Initialisierung aus:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$service = \Yii::app()->versionFetcherServiceLocator
$service = \Yii::app()->versionFetcherServiceLocator
$service->addVersionFetcherType(
$service->addVersionFetcherType(
  'myNewVersionFetcherType',
'myNewVersionFetcherType',
  function (\SimpleXMLElement $updaterXml) {
function (\SimpleXMLElement $updaterXml) {
    return new MyNewVersionFetcher($updaterXml);
return new MyNewVersionFetcher( $updaterXml);
  }
}
);
);
</syntaxhighlight>
</syntaxhighlight>


Of course, the class <code>MyNewVersionFetcher</code> has to subclass <code>VersionFetcher</code>.
Natürlich muss die Klasse <code>MyNewVersionFetcher</code> eine Unterklasse <code>VersionFetcher</code> sein.


To use your new version fetcher, configure the <code>type</code> tag in the updater XML to use
Um Ihren neuen Versionsabrufer zu verwenden, konfigurieren Sie das <code>type</code> Tag im Updater-XML so, dass es
<code>myNewVersionFetcherType</code> (instead of e.g. <code>rest</code>).
verwendet. <code>myNewVersionFetcherType</code> (anstelle von zB <code>rest</code> ).


==== Adding new extension updaters ====
==== Neue Erweiterungs-Updater hinzufügen ====


To add a new custom extension updater, run this during Yii initialization:
Um einen neuen benutzerdefinierten Erweiterungs-Updater hinzuzufügen, führen Sie diesen während der Yii-Initialisierung aus:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$service = \Yii::app()->extensionUpdaterServiceLocator;
$service = \Yii::app()->extensionUpdaterServiceLocator;
$service->addUpdaterType(
$service->addUpdaterType(
  'myNewExtensionUpdater',
'myNewExtensionUpdater',
  function () {
function () {
    return MyNewExtensionUpdater::createUpdaters();
return MyNewExtensionUpdater::createUpdaters() ;
  }
}
);
);
</syntaxhighlight>
</syntaxhighlight>


Class <code>MyNewExtensionUpdater</code> has to subclass <code>ExtensionUpdater</code>.
Die Klasse <code>MyNewExtensionUpdater</code> muss eine Unterklasse <code>ExtensionUpdater</code> sein.
 
Das oberste <code>type</code> Tag in config.xml („plugin“, „theme“, ...) steuert, welcher Erweiterungs-Updater für diese Erweiterung verwendet wird. Das System ist noch nicht vollständig anpassbar, da Sie auch einen benutzerdefinierten ExtensionInstaller, Menüelemente usw. hinzufügen müssen. Theoretisch und möglicherweise in Zukunft sollte es jedoch möglich sein, auf diese Weise einen neuen Erweiterungstyp hinzuzufügen.
 
== Erweiterungsinstallationsprogramm ==
 
Die Erweiterungsinstallationsbibliothek besteht aus zwei abstrakten Klassen:
 
* ExtensionInstaller
* FileFetcher
 
Der ExtensionInstaller ist für jeden Erweiterungstyp in Unterklassen unterteilt, z. B. PluginInstaller, QuestionThemeInstaller usw.
 
Der FileFetcher ist für jede unterschiedliche Art des Dateiabrufs in Unterklassen unterteilt. Derzeit werden nur hochgeladene ZIP-Dateien unterstützt, aber in Zukunft könnte es auch einen Github- oder LimeStore-Abrufer geben.


The top <code>type</code> tag in config.xml ('plugin', 'theme', ...) will control which extension updater are used for this extension. The system is not fully customizable  yet, since you also need to add a custom ExtensionInstaller, menu items, etc. But in theory, and maybe in the future, it should be possible to add a new type of extension this way.
[[Datei: extensioninstalleruml.png]]


== Special plugins ==
== Spezielle Plugins ==


* [[Authentication plugin development]]
* [[Entwicklung des Authentifizierungs-Plugins]]
* [[Export plugin development]]
* [[Entwicklung des Export-Plugins]]


== Available plugins ==
<div class="mw-translate-fuzzy">
* [[Authentication plugins]]
== Verfügbare Plugins ==
* [[Audit log]]
* [[Authentifizierungs-Plugins]]
* [[Audit-Protokoll]]
* [[CintLink]]
* [[CintLink]]
* [[Available third party plugins]]
* [[Verfügbare Plugins von Drittanbietern]]
</div>


== Tutorial ==
== Tutorial ==
[https://medium.com/@evently/creating-limesurvey-plugins-adcdf8d7e334 This] step-by-step tutorial shows how to create a plugin that sends a post request on every survey response submission. The tutorial shows you how to create and save global and per-survey settings, how to register events and more.
[https://medium.com/@evently/creating-limesurvey-plugins-adcdf8d7e334 Dieses] Schritt-für-Schritt-Tutorial zeigt, wie man ein Plugin erstellt, das bei jeder Umfrageantwort eine Post-Anfrage sendet Vorlage. Das Tutorial zeigt Ihnen, wie Sie globale und pro-Umfrage-Einstellungen erstellen und speichern, wie Sie Ereignisse registrieren und vieles mehr.


[[Category:Development]]
[[Kategorie:Entwicklung]]
[[Category:Plugins]]
[[Kategorie:Plugins]]

Latest revision as of 16:58, 2 April 2024

Übersicht

Ab LimeSurvey 2.05 unterstützt LimeSurvey offiziell Plugins. Einige Plugins werden vom LimeSurvey-Team unterstützt und in den Kern integriert. Einige werden von anderen außerhalb des LimeSurvey-Teams unterstützt. Um sie leichter zu finden, sehen Sie sich die Verfügbare Plugins von Drittanbietern an und fügen Sie Ihr eigenes Plugin hinzu!

Mit Plugins können Benutzer die Funktionalität ihrer Installation anpassen und gleichzeitig von regelmäßigen Software-Updates profitieren.

Diese Dokumentation richtet sich an Entwickler, die LimeSurvey für den eigenen Gebrauch oder für ihre Kunden erweitern; Endbenutzern wird diese Dokumentation nicht weiterhelfen.

Plugins müssen die Schnittstelle iPlugin implementieren. Wir empfehlen, Ihre Plugin-Klasse von der Klasse PluginBase zu erweitern.

Plugins werden rund um einen Event-Mechanismus entwickelt.

Plugin-Einstellungen

Durch die Erweiterung profitieren Sie von der allgemeinen Funktionalität, die von Plugins benötigt wird, die wir bereits für Sie implementiert haben. Eine dieser Funktionen ist die Implementierung der getPluginSettings-Funktion. Diese Funktion muss ein Array zurückgeben, das die Konfigurationsoptionen für den Benutzer beschreibt.

Das Beispiel-Plugin stellt nur eine konfigurierbare Einstellung bereit, nämlich die angezeigte Meldung.

protected $settings = array(
 'logo' => array(
 'type' => 'logo',
 'path' => 'assets/logo.png'
 ) ,

'message' => array(
 'type' => 'string',
 'label' => 'Message'
 )
);

Das Array enthält für jede Einstellung einen Namen als Schlüssel. Die Werte sind Arrays, die die erforderlichen Metadaten enthalten.

Unterstützte Typen sind:

  • logo
  • int (ganzzahlige Zahl)
  • string (alphanumerisch)
  • text
  • html
  • relevant
  • info
  • passwort
  • datum! N!* auswählen

Neben dem Typ stehen noch eine Reihe weiterer Schlüssel zur Verfügung:

  • label, definiert eine Beschriftung.
  • default, definiert einen Wert, der angezeigt wird, wenn kein Wert angegeben ist (nur für globale Einstellungen, nicht für Umfrageeinstellungen).
  • current, definiert den aktuellen Wert.
  • readOnly: Zeigt die Einstellungen als schreibgeschützt an
  • htmlOptions, die htmlOptions des Eingabeteils (siehe Yii-Handbuch [[1]])
  • PluginOptions, für Einige Einstellungen (HTML oder Select): Legen Sie die Widget-Option fest
  • labelOptions: htmlOptions des Labels
  • controlOptions: htmlOptions des Wrappers von Label und Eingabe

Ein Plugin-Beispiel mit allen tatsächlichen Einstellungen finden Sie unter exampleSettings

Plugin-Einstellungen lesen und schreiben

Es ist möglich, Plugin-Einstellungen direkt aus Ihrem Plugin-Code zu lesen und zu schreiben.

Beispiel:

$mySetting = $this->get('mySetting');
$this->set('mySetting', $mySetting + 1);

Sie können einen Standardwert erhalten, wenn die Einstellung zufällig null ist:

$mySetting = $this->get('mySetting', null, null, 10); // 10 ist Standard

Survey specific plugin settings

Two events are used to create survey specific plugin settings:

  • newSurveySettings
  • beforeSurveySettings

Example to disable a plugin for a specific survey:

   
    public function init()
    {
        $this->subscribe('beforeSurveySettings');
        $this->subscribe('newSurveySettings');
        // Other events...
    }

    public function beforeSurveySettings()
    {
	    $event = $this->event;
	    $surveyId = intval($event->get('survey'));

        $event->set(
            "surveysettings.{$this->id}",
            [
                'name' => get_class($this),
                'settings' => [
                    'isActive' => [
                        'type' => 'boolean',
                        'label' => 'isActive',
                        'current' => $this->getIsActive($surveyId),
                        'help' => 'Activate plugin for this survey'
                    ],
                ]
            ]
        );
    }

    public function newSurveySettings()
    {
        $event = $this->event;
        foreach ($event->get('settings') as $name => $value)
        {
            $this->set($name, $value, 'Survey', $event->get('survey'), false);
        }
    }

    private function getIsActive(int $sid): bool
    {
        return (bool) $this->get('isActive', 'Survey', $sid, false);
    }

Ereignisse

Plugins abonnieren Ereignisse und können mit LimeSurvey interagieren, wenn das Ereignis ausgelöst wird. Eine Liste der derzeit verfügbaren Ereignisse finden Sie unter Plugin-Ereignisse.

API

Plugins sollten LimeSurvey nur über seine „öffentliche“ API erweitern. Dies bedeutet, dass die direkte Verwendung von im Quellcode gefundenen Klassen eine schlechte Praxis ist. Obwohl wir Sie nicht zwingen können, dies nicht zu tun, riskieren Sie bei jedem kleineren Update, das wir durchführen, ein defektes Plugin.

Interagieren Sie mit LimeSurvey so weit wie möglich nur über die beschriebenen Methoden hier. Gleiches wie bei Veranstaltungen.

Das API-Objekt ist über $this->api verfügbar, wenn es von PluginBase erweitert wird. Andernfalls können Sie es von der PluginManager-Instanz abrufen, die an den Konstruktor Ihres Plugins übergeben wird.

Auf Anfrage können dem API-Objekt neue Funktionen hinzugefügt werden.

Formularerweiterung (New in 6 )

Einführung

Das Formularerweiterungssystem ist eine allgemeinere Möglichkeit, Formulare im Kern von LimeSurvey zu erweitern, ohne für jedes Formular ein neues Ereignis hinzuzufügen.

Es besteht aus folgenden Komponenten:

  • Ein globales Modul namens 'FormExtensionService
  • Eine Bibliothek von 'Eingabeklassen, die Plugins zur obigen Modulinitialisierung hinzufügen können
  • Ein 'Widget, zusammen mit Benutzerdefinierte Renderer, die in den LimeSurvey-Ansichtsdateien verwendet werden

Jedes Formular wird durch eine „Positionszeichenfolge“ identifiziert, z<form name><dot><tab name> . Beispiel: globalsettings.general oder globalsettings.security .

Der Sinn eines klassenbasierten Systems ohne HTML besteht darin, die Plugin-Autoren von der Arbeit zu befreien, damit sie den HTML-Code aktualisieren können, wenn sich der Kern-HTML-Code ändert. Dennoch kann der Autor bei Bedarf den Typ RawHtmlInput verwenden.

Eine Sache, die Sie in diesem System nicht tun können, ist das Hinzufügen „neuer Formularregisterkarten“.

Beispiel

Um einem Formular über ein Plugin eine neue Eingabe hinzuzufügen, verwenden Sie den folgenden Code aus Ihrer init() Funktion:

TODO: In den Plugin-Einstellungen statt global speichern

// Am Anfang der Datei
use LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
use LimeSurvey\Libraries\FormExtension\SaveFailedException;

// Inside init()
Yii::app()->formExtensionService->add(
 'globalsettings.general',
 new TextInput([
 'name' => 'myinput', 
 'label' => 'Label',
 'disabled' => true,
 'tooltip' => 'Moo muh muh',
 'help' => 'Einige Hilfetexte', 
 'save' => function($request, $connection) {
 $value = $request->getPost('myinput');
 if ($value === 'irgendein ungültiger Wert') {
 throw new SaveFailedException("Die benutzerdefinierte Eingabe 'myinput' konnte nicht gespeichert werden");
 } else {
 SettingGlobal::setSetting('myinput', $value);
 }
 } ,
 'load' => function () {
 return getGlobalSetting('myinput');
 }
 ])
);

Validierung

Die Validierung der Eingabe erfolgt in der save (siehe Beispiel oben). Wenn der gepostete Wert ungültig ist, lösen Sie eine SaveFailedException aus und dem Benutzer wird eine Warnmeldung angezeigt.

Unterstützte Formulare

Folgende Formen können erweitert werden:

  • globalsettings.general (New in 6.0.0 )

Wenn Sie Unterstützung für ein anderes Kernformular hinzufügen möchten, müssen Sie die folgende Änderung in einem Pull-Request anwenden:

Fügen Sie in der Ansichtsdatei Folgendes hinzu:

 <?php
use LimeSurvey\Libraries\FormExtension\FormExtensionWidget;
use LimeSurvey\Libraries\FormExtension\Inputs\DefaultBaseRenderer;
?> 
... mehr HTML
<?= FormExtensionWidget::render(
    App()-> formExtensionService->getAll('globalsettings.security'),
 new DefaultBaseRenderer()
); ?>

Möglicherweise müssen Sie eine neue Renderer-Klasse basierend auf DefaultBaseRenderer erstellen, wenn sich der HTML-Code des Formulars von anderen Formularen unterscheidet. Möglicherweise müssen Sie auch die Standard-Renderer-Klasse um Eingabetypen erweitern, die noch nicht hinzugefügt wurden.

Die zweite Änderung, die Sie vornehmen müssen, ist das Hinzufügen eines Aufrufs der Formularerweiterungsdienstklasse in der Controller-Aktion, die das Formular speichert:

$request = App()->request;
Yii::app()->formExtensionService->applySave('globalsettings', $request);

Das ist es!

Lokalisierung (New in 3 )

Es ist für Plugins möglich, ihre eigenen Gebietsschemadateien hinzuzufügen. Das verwendete Dateiformat ist .mo, dasselbe wie bei Kernübersetzungen. Die Dateien müssen in gespeichert werden

<plugin root folder>/Gebietsschema/<language> /<language> .mo

Wo "<language> „ist ein aus zwei Buchstaben bestehendes Wort wie „de“ oder „fr“.

Um die spezifische Gebietsschemadatei zu verwenden, verwenden Sie die Plugin-Funktion gT:

$this->gT("Ein Plugin-Text, der übersetzt werden muss");

Wenn die angegebene Zeichenfolge in der Plugin-spezifischen Gebietsschemadatei nicht gefunden werden kann, sucht die Funktion in den Kerngebietsschemadateien. Daher ist es sicher, Zeichenfolgen wie „Abbrechen“ zu verwenden:

$this->gT("Abbrechen"); // Wird übersetzt, auch wenn „Abbrechen“ nicht in der Plugin-Gebietsschemadatei enthalten ist

Wenn Sie Ansichten zusammen mit Ihrem Plugin verwenden, sollten Sie verwenden

$plugin->gT("Übersetze mich");

um aus Ihrer Sicht eine Plugin-spezifische Übersetzung durchzuführen.

Sie können die Datei limesurvey.pot als Beispiel dafür verwenden, wie eine Pot-Datei aussehen kann. Dies wird in Ihr Übersetzungstool importiert.

Werkzeuge

Ein Open-Source-Tool zum Bearbeiten von Po- und Mo-Dateien ist [2].

Protokollierung (New in 3 )

Wenn Sie etwas von Ihrem Plugin protokollieren möchten, schreiben Sie einfach

$this->log("Ihre Nachricht");

Die Standardprotokollierungsstufe ist „trace“, Sie können jedoch eine andere Protokollierungsstufe als optionales zweites Argument angeben:

$this->log("Etwas ist schiefgelaufen!", CLogger::LEVEL_ERROR);

Die Protokolldatei finden Sie im Ordner

<limesurvey root folder>/tmp/runtime/plugin.log

Ihr Plugin-Name wird automatisch als Kategorie verwendet. Eine gute Möglichkeit, nur die Fehler Ihres Plugins anzuzeigen, ist die Verwendung von grep (unter Linux):

$ tail -f tmp/runtime/plugin.log | grep<your plugin name>

Weitere Informationen zum Konfigurieren der Protokollierung in Yii 1: Optional_settings#Logging_settings.

Erweiterungsaktualisierungen (New in 4 )

Seit LimeSurvey Version 4.0.0 gibt es ein System für den Umgang mit Plugin- und anderen Erweiterungsaktualisierungen. Um dieses System verwenden zu können, muss Ihre Erweiterungsdatei config.xml die Updater-Konfiguration enthalten.

<updaters> 
<updater> 
<stable> 1</stable> 
<type> ausruhen</type> 
<source> https://comfortupdate.limesurvey.org/index.php?r=limestorerest</source> 
<manualUpdateUrl> https://somedownloadlink.com/maybegithub</manualUpdateUrl> 
</updater> 
</updaters>

(Das obige Quell-Tag verweist auf die LimeStore-REST-API, die für alle in unserem LimeStore verfügbaren Erweiterungen verwendet wird.)

Updater-Tag-Beschreibungen
Tag Beschreibung
stabil „1“, wenn diese Quelle nur stabile Versionsnummern liefert; „0“, wenn die Quelle auch instabile Versionen bereitstellt, wie 0.3.3-beta .
Geben Sie ein Derzeit wird nur der Typ rest unterstützt. Es ist einfach, neue Updater-Typen (Versionsprüfer) wie Git, Wget usw. hinzuzufügen
Quelle Die URL zum Abrufen neuer Versionen von.
manualUpdateUrl URL, zu der der Benutzer gehen kann, um die neueste Version der Erweiterung zu aktualisieren.
AutomaticUpdateUrl TODO

Wenn Sie keinen Updater bereitstellen möchten, sollten Sie den folgenden Text in Ihre Konfigurations-XML-Datei einfügen:

<updaters disabled="disabled"> 
</updaters>

Auf diese Weise teilen Sie dem System mit, dass Sie das Update-System absichtlich deaktiviert und nicht einfach vergessen haben, es hinzuzufügen.

Das neue Plugin „UpdateCheck“ – standardmäßig installiert und aktiviert – sucht nach neuen Updates für „alle“ installierten Erweiterungen, wenn sich ein Superadministrator asynchron anmeldet, maximal einmal alle 24 Stunden. Wenn neue Versionen gefunden werden, wird eine Benachrichtigung gesendet.

|Verfügbare Updates

Wenn ein neues Sicherheitsupdate gefunden wird, wird die Benachrichtigung automatisch geöffnet und in der Kategorie „Gefahr“ angezeigt.

|Verfügbare Sicherheitsupdates

Sie können manuell nach Updates suchen, indem Sie in der Plugin-Manager-Ansicht auf „Updates prüfen“ klicken. Beachten Sie, dass diese Schaltfläche nur sichtbar ist, wenn das UpdateCheck-Plugin aktiviert ist.

Manuell nach Updates suchen

Unter der Haube

Dieser Abschnitt bietet einen kurzen Überblick über die Implementierung des Erweiterungs-Updaters.

Der Erweiterungs-Updater ist Teil der ExtensionInstaller-Bibliothek. Unten finden Sie ein UML-Diagramm für die Klassen, die sich auf den Updater-Prozess beziehen.

Extension Updater UML-Diagramm

Programmablauf beim Start von Yii:

 Yii init
 VersionFetcherServiceLocator->init()
 REST-Versions-Fetcher hinzufügen
 ExtensionUpdaterServiceLocator->init()
 PluginUpdater!N hinzufügen! TODO: Für jeden Erweiterungstyp (Theme, Fragenvorlage, ...) einen Updater hinzufügen

Programmablauf beim Ausführen des UpdaterCheck-Plugins:

 Holen Sie sich alle Updater von ExtensionUpdaterServiceLocator
 Schleifen Sie jeden Updater
 Durchlaufen Sie für jeden Updater die von konfigurierten Versionsabrufer<updater> XML
 Wenden Sie sich für jeden Versionsabrufer an die Remote-Quelle und holen Sie sich Versionsinformationen
 Fassen Sie alle Versionen in einer Benachrichtigung zusammen

Die Methode checkAll im UpdateCheck-Plugin bietet ein Beispiel dafür, wie alle Erweiterungen nach neuen Versionen abgefragt werden .

Neue Versionsabrufer hinzufügen

Um einen neuen benutzerdefinierten Versionsabrufer hinzuzufügen, führen Sie Folgendes während der Yii-Initialisierung aus:

$service = \Yii::app()->versionFetcherServiceLocator
$service->addVersionFetcherType(
 'myNewVersionFetcherType',
 function (\SimpleXMLElement $updaterXml) {
 return new MyNewVersionFetcher( $updaterXml);
 }
);

Natürlich muss die Klasse MyNewVersionFetcher eine Unterklasse VersionFetcher sein.

Um Ihren neuen Versionsabrufer zu verwenden, konfigurieren Sie das type Tag im Updater-XML so, dass es

verwendet. myNewVersionFetcherType (anstelle von zB rest ).

Neue Erweiterungs-Updater hinzufügen

Um einen neuen benutzerdefinierten Erweiterungs-Updater hinzuzufügen, führen Sie diesen während der Yii-Initialisierung aus:

$service = \Yii::app()->extensionUpdaterServiceLocator;
$service->addUpdaterType(
 'myNewExtensionUpdater',
 function () {
 return MyNewExtensionUpdater::createUpdaters() ;
 }
);

Die Klasse MyNewExtensionUpdater muss eine Unterklasse ExtensionUpdater sein.

Das oberste type Tag in config.xml („plugin“, „theme“, ...) steuert, welcher Erweiterungs-Updater für diese Erweiterung verwendet wird. Das System ist noch nicht vollständig anpassbar, da Sie auch einen benutzerdefinierten ExtensionInstaller, Menüelemente usw. hinzufügen müssen. Theoretisch und möglicherweise in Zukunft sollte es jedoch möglich sein, auf diese Weise einen neuen Erweiterungstyp hinzuzufügen.

Erweiterungsinstallationsprogramm

Die Erweiterungsinstallationsbibliothek besteht aus zwei abstrakten Klassen:

  • ExtensionInstaller
  • FileFetcher

Der ExtensionInstaller ist für jeden Erweiterungstyp in Unterklassen unterteilt, z. B. PluginInstaller, QuestionThemeInstaller usw.

Der FileFetcher ist für jede unterschiedliche Art des Dateiabrufs in Unterklassen unterteilt. Derzeit werden nur hochgeladene ZIP-Dateien unterstützt, aber in Zukunft könnte es auch einen Github- oder LimeStore-Abrufer geben.

Datei: extensioninstalleruml.png

Spezielle Plugins

Tutorial

Dieses Schritt-für-Schritt-Tutorial zeigt, wie man ein Plugin erstellt, das bei jeder Umfrageantwort eine Post-Anfrage sendet Vorlage. Das Tutorial zeigt Ihnen, wie Sie globale und pro-Umfrage-Einstellungen erstellen und speichern, wie Sie Ereignisse registrieren und vieles mehr.

Kategorie:Entwicklung Kategorie:Plugins