Actions

Plugins - advanced/fr: Difference between revisions

From LimeSurvey Manual

(Updating to match new version of source page)
(Updating to match new version of source page)
 
(118 intermediate revisions by 3 users not shown)
Line 2: Line 2:
== Vue d'ensemble ==
== Vue d'ensemble ==


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!
À partir de LimeSurvey 2.05, LimeSurvey prendra officiellement en charge les plugins. Certains plugins seront supportés par l'équipe LimeSurvey et entreront dans le noyau. Certains seront soutenus par d'autres en dehors de l'équipe LimeSurvey. Pour vous aider à les trouver, consultez les [[Plugins tiers disponibles]] et ajoutez-y votre propre plugin !


Plugins allow users to customize the functionality of their installation while still being able to benefit from regular software updates.
Les plugins permettent aux utilisateurs de personnaliser les fonctionnalités de leur installation tout en bénéficiant de mises à jour logicielles régulières.


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.
Cette documentation est destinée aux développeurs qui étendent LimeSurvey pour leur propre usage ou pour leurs clients ; les utilisateurs finaux ne seront pas aidés par cette documentation.


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.  
Les plugins doivent implémenter l'interface [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/iPlugin.php iPlugin]. Nous vous recommandons d'étendre votre classe de plugin à partir de la classe [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/PluginBase.php PluginBase].  


Plugins are developed around an [http://manual.limesurvey.org/Plugin_events event] mechanism.
Les plugins sont développés autour d'un mécanisme [http://manual.limesurvey.org/Plugin_events event].


== Plugin settings ==
== Paramètres du plugin ==


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.
En étendant, vous bénéficiez des fonctionnalités communes requises par les plugins que nous avons déjà implémentés pour vous. L'une de ces fonctions est l'implémentation de la fonction getPluginSettings. Cette fonction doit renvoyer un tableau décrivant les options de configuration pour l'utilisateur.


The example plugin exposes just 1 configurable setting, the message it'll show.
L'exemple de plugin expose un seul paramètre configurable, le message qu'il affichera.


<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.
Le tableau contient un nom pour chaque paramètre sous forme de clé. Les valeurs sont des tableaux contenant les métadonnées requises.


Supported types are:
Les types pris en charge sont :


* logo
* logo
* string
* int (nombre entier)
* chaîne (alphanumérique)
* texte
* html
* html
* choice
* pertinence
* relevance
* info
* info
* mot de passe
* date!
* sélectionner


Besides type a number of other keys are available:
Outre le type, un certain nombre d'autres clés sont disponibles :


* label, defines a label
* label, définit une étiquette
* default, defines a value to show if no value is specified (only for global settings, not for survey settings)
* par défaut, définit une valeur à afficher si aucune valeur n'est spécifiée (uniquement pour les paramètres globaux, pas pour les paramètres d'enquête)
* current, defines the current value.
* current, définit la valeur actuelle.
* readOnly : shown the settings as readonly
* readOnly : affiché les paramètres en lecture seule
* htmlOptions, the htmlOptions of the input part ( see Yii manual [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* htmlOptions, les htmlOptions de la partie d'entrée (voir le manuel Yii [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* pluginOptions, for some settings (html or select) : set the widget option
* pluginOptions, pour quelques paramètres (html ou select) : définissez l'option du widget
* labelOptions : htmlOptions of the label
* labelOptions : htmlOptions du label
* controlOptions : htmlOptions of the wrapper of label and input
* controlOptions : htmlOptions du wrapper de label et input


You can find a plugin example using all actual settings at [https://framagit.org/Shnoulle/exampleSettings exampleSettings]  
Vous pouvez trouver un exemple de plugin utilisant tous les paramètres réels sur [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
=== Read and write plugin settings ===
=== Lire et écrire les paramètres du plugin ===


It's possible to read and write plugin settings directly from your plugin code.
Il est possible de lire et d'écrire les paramètres du plugin directement à partir du code de votre plugin.


Example:
Exemple:


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


You can get a default value if the setting happens to be null:
Vous pouvez obtenir une valeur par défaut si le paramètre est nul :
 
<syntaxhighlight lang="php">
$mySetting = $this->get('mySetting', null, null, 10); // 10 est la valeur par défaut
</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 ==
== Événements ==


Plugins subscribe to events and can interact with LimeSurvey when the event is fired. For a list of currently available events check [[Plugin events]].
Les plugins s'abonnent aux événements et peuvent interagir avec LimeSurvey lorsque l'événement est déclenché. Pour une liste des événements actuellement disponibles, consultez [[Événements du plugin]].


== 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.
Les plugins ne doivent étendre LimeSurvey que via son API "publique". Cela signifie qu’utiliser directement les classes trouvées dans le code source est une mauvaise pratique. Bien que nous ne puissions pas vous y obliger, vous risquez d'avoir un plugin défectueux à chaque mise à jour mineure que nous effectuons.
 
Dans la mesure du possible, interagissez avec LimeSurvey uniquement via les méthodes décrites [http://api.limesurvey.org/classes/LimeSurvey.PluginManager.LimesurveyApi.html ici]. Idem pour les événements.
 
L'objet API est disponible via <code>$this->api</code> lors de l'extension depuis PluginBase, sinon vous pouvez l'obtenir à partir de l'instance PluginManager qui est transmise au constructeur de vos plugins.
 
De nouvelles fonctions peuvent être ajoutées à l'objet API sur demande.
 
== Extension de formulaire{{NewIn|v=6}} ==
 
=== Présentation ===
 
Le système d'extension de formulaire est un moyen plus général d'étendre les formulaires dans le noyau de LimeSurvey sans ajouter de nouvel événement pour chaque formulaire.


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.
Il se compose des éléments suivants :


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.
* Un module global appelé '''FormExtensionService'''
* Une bibliothèque de '''classes d'entrée''' que les plugins peuvent ajouter à l'initialisation du module ci-dessus
* Un '''widget''', ainsi que moteurs de rendu personnalisés, utilisés dans les fichiers de vue LimeSurvey


New functions can be added to the API object upon request.
Chaque formulaire est identifié par une '''chaîne de position''', comme<form name><dot><tab name> . Exemple : <code>globalsettings.general</code> ou <code>globalsettings.security</code> .


== Localization {{NewIn|v=3}} ==
L'objectif d'un système basé sur des classes sans HTML est de libérer les auteurs de plugins de l'œuvre pour qu'ils mettent à jour le code HTML lorsque le code HTML principal change. Néanmoins, l'auteur peut utiliser le type <code>RawHtmlInput</code> si nécessaire.


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
Une chose que vous ne pouvez pas faire dans ce système est d'ajouter de « nouveaux onglets de formulaire ».


<plugin root folder>/locale/<language>/<language>.mo
=== Exemple ===


where "<language>" is a two letter word like "de" or "fr".
Pour ajouter une nouvelle entrée à un formulaire à partir d'un plugin, utilisez le code suivant de votre fonction <code>init()</code> :


To use the specific locale file, use the plugin function gT:
TODO : Enregistrer dans les paramètres du plugin au lieu de global


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("A plugin text that needs to be translated");
// En haut du fichier
utilisez LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
utilisez LimeSurvey\Libraries\FormExtension\SaveFailedException;
 
// À l'intérieur de init()
Yii::app()->formExtensionService->add(
'globalsettings.general',
new TextInput([
'name' => 'myinput',
'label' => 'Label',
'disabled' => true,
'tooltip' => 'Moo moo moo',
'help' => 'Un texte d'aide',
'save' => function($request, $connection) {
$value = $request->getPost('myinput');
if ($value === 'une valeur invalide') {
throw new SaveFailedException("Impossible d'enregistrer l'entrée personnalisée 'myinput'");
} 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":
=== Validation ===
 
La validation de la saisie se fait dans la fonction <code>save</code> (voir exemple ci-dessus). Si la valeur publiée n'est pas valide, lancez une <code>SaveFailedException</code> et un message flash d'avertissement sera affiché à l'utilisateur.
 
=== Formulaires pris en charge ===
 
Les formulaires suivants peuvent être étendus :
 
* globalsettings.general{{NewIn|v=6.0.0}}
 
Si vous souhaitez ajouter la prise en charge d'un autre formulaire principal, vous devez appliquer la modification suivante dans une pull-request :
 
Dans le fichier de vue, ajoutez :
 
<syntaxhighlight lang="php">
<?php
use LimeSurvey\Libraries\FormExtension\FormExtensionWidget;
use LimeSurvey\Libraries\FormExtension\Inputs\DefaultBaseRenderer;
?>
... plus HTML
<?= FormExtensionWidget::render(
    App()-> formExtensionService->getAll('globalsettings.security'),
nouveau DefaultBaseRenderer()
); ?>
</syntaxhighlight>
 
Vous devrez peut-être créer une nouvelle classe de rendu basée sur <code>DefaultBaseRenderer</code> , si le formulaire HTML est différent des autres formulaires. Vous devrez peut-être également étendre la classe de rendu par défaut avec des types d'entrée non encore ajoutés.
 
La deuxième modification que vous devez effectuer est d'ajouter un appel à la classe de service d'extension de formulaire dans l'action du contrôleur qui enregistre le formulaire :


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("Cancel"); // Will be translated even if "Cancel" is not in the plugin locale file
$request = App()->request;
Yii::app()->formExtensionService->applySave('globalsettings', $request);
</syntaxhighlight>
</syntaxhighlight>


If you are using views together with your plugin, you should use
C'est ça!
 
== Localisation {{NewIn|v=3}} ==
 
Il est possible pour les plugins d'ajouter leurs propres fichiers de paramètres régionaux. Le format de fichier utilisé est .mo, identique aux traductions principales. Les fichiers doivent être stockés dans
 
<plugin root folder>/lieu/<language> /<language> .mo
 
où "<language> " est un mot de deux lettres comme "de" ou "fr".
 
Pour utiliser le fichier de paramètres régionaux spécifique, utilisez la fonction plugin gT :


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$plugin->gT("Translate me");
$this->gT("Un texte de plugin à traduire");
</syntaxhighlight>
</syntaxhighlight>


to do plugin specific translation in your view.
Si la chaîne donnée ne peut pas être trouvée dans le fichier de paramètres régionaux spécifique au plugin, la fonction recherchera dans les fichiers de paramètres régionaux principaux. Il est donc prudent d'utiliser des chaînes telles que « Annuler » :
 
<syntaxhighlight lang="php">
$this->gT("Annuler"); // Sera traduit même si "Annuler" n'est pas dans le fichier de paramètres régionaux du plugin
</syntaxhighlight>
 
Si vous utilisez des vues avec votre plugin, vous devez utiliser
 
<syntaxhighlight lang="php">
$plugin->gT("Traduisez-moi");
</syntaxhighlight>
 
pour faire une traduction spécifique au plugin à votre avis.
 
Vous pouvez utiliser le fichier [https://github.com/LimeSurvey/LimeSurvey/blob/master/locale/_template/limesurvey.pot limesurvey.pot] comme exemple de ce à quoi peut ressembler un fichier pot. Celui-ci est importé dans votre outil de traduction.
 
=== Outils ===
 
Un outil open source pour éditer les fichiers po et mo est [https://poedit.net/ Poedit].


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


If you want to log something from your plugin, just write
Si vous souhaitez enregistrer quelque chose depuis votre plugin, écrivez simplement


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


The default logging level is trace, but you can give another log level as an optional second argument:
Le niveau de journalisation par défaut est trace, mais vous pouvez donner un autre niveau de journalisation comme deuxième argument facultatif :


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Something went wrong!", CLogger::LEVEL_ERROR);
$this->log("Quelque chose s'est mal passé !", CLogger::LEVEL_ERROR);
</syntaxhighlight>
</syntaxhighlight>


The log file can be found in folder
Le fichier journal se trouve dans le dossier


  <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):
Le nom de votre plugin est automatiquement utilisé comme catégorie. Une bonne façon de voir uniquement les erreurs de votre plugin consiste à utiliser grep (sous 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]].
Plus d'informations sur la configuration de la journalisation dans Yii : [[Optional_settings#Logging_settings]].


== Extension updates {{NewIn|v=4}} ==
== Mises à jour de l'extension {{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.
Depuis la version 4.0.0 de LimeSurvey, un système est en place pour gérer les mises à jour des plugins et autres extensions. Pour utiliser ce système, votre fichier d'extension config.xml doit inclure la configuration du programme de mise à jour.


<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<updaters>
<updaters>  
    <updater>
<updater>  
        <stable>1</stable>
<stable> 1</stable>  
        <type>rest</type>
<type> repos</type>  
        <source>https://comfortupdate.limesurvey.org/index.php?r=limestorerest</source>
<source> https://comfortupdate.limesurvey.org/index.php?r=limestorest</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.)
(La balise source ci-dessus pointe vers l'API REST LimeStore, qui sera utilisée pour toutes les extensions disponibles dans notre LimeStore.)


{| class="wikitable"
{| class="wikitable"
|+ Updater tag descriptions
|+ Descriptions des balises du programme de mise à jour
|-
|-
! Tag
! Marquez
! Description
! Description
|-
|-
| stable  
| stable  
| "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" si cette source ne vous donne que des numéros de version stables ; "0" si la source fournira également des versions instables, comme <code>0.3.3-beta</code> .
|-
|-
| type
| tapez
| For now, only type <code>rest</code> is supported. It's easy to add new updater types (version checkers), like git, wget, etc.
| Pour l’instant, seul le type <code>rest</code> est pris en charge. Il est facile d'ajouter de nouveaux types de programmes de mise à jour (vérificateurs de versions), comme git, wget, etc.
|-
|-
| source  
| source  
| The URL to fetch new versions from.
| L'URL à partir de laquelle récupérer les nouvelles versions.
|-
|-
| manualUpdateUrl  
| manualUpdateUrl  
| URL which the user can go to to update the latest version of the extension.
| URL vers laquelle l'utilisateur peut accéder pour mettre à jour la dernière version de l'extension.
|-
|-
| automaticUpdateUrl
| URL de mise à jour automatique
| TODO
| À FAIRE
|}
|}


If you don't want to supply an updater, you should put the following text in your config XML file:
Si vous ne souhaitez pas fournir de programme de mise à jour, vous devez mettre le texte suivant dans votre fichier XML de configuration :


<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.
De cette façon, vous indiquez au système que vous avez délibérément désactivé le système de mise à jour et que vous n'avez pas simplement oublié de l'ajouter.


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.
Le nouveau plugin '''UpdateCheck''' - installé et activé par défaut - vérifie les nouvelles mises à jour pour ''toutes'' les extensions installées lorsqu'un super administrateur se connecte, de manière asynchrone, au maximum une fois toutes les 24 heures. Si de nouvelles versions sont trouvées, une notification est envoyée.


[[File:availableupdates.png||Available updates]]
[[File:availableupdates.png||Mises à jour disponibles]]


If a new security update is found, the notification will open automatically and be styled in "danger" class.
Si une nouvelle mise à jour de sécurité est trouvée, la notification s'ouvrira automatiquement et sera classée en classe « danger ».


[[File:availablesecurityupdates.png||Available security updates]]
[[File:availablesecurityupdates.png||Mises à jour de sécurité disponibles]]


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.
Vous pouvez vérifier manuellement les mises à jour en accédant à la vue du gestionnaire de plugins et en cliquant sur « Vérifier les mises à jour ». Notez que ce bouton n'est visible que si le plugin UpdateCheck est activé.


[[File:manuallycheckforupdates.png||Manually check for updates]]
[[File:manuallycheckforupdates.png||Vérifier manuellement les mises à jour]]


=== Under the hood ===
=== Sous le capot ===


This section provides a brief overview over the extension updater implementation.
Cette section fournit un bref aperçu de l'implémentation du programme de mise à jour de l'extension.


The extension updater is part of the ExtensionInstaller library. Below is a UML diagram for the classes related to the updater process.
Le programme de mise à jour de l'extension fait partie de la bibliothèque ExtensionInstaller. Vous trouverez ci-dessous un diagramme UML pour les classes liées au processus de mise à jour.


[[File:extensionupdateruml.png||Extension updater UML diagram]]
[[File:extensionupdateruml.png||Diagramme UML du programme de mise à jour d'extension]]


Program flow when Yii starts:
Déroulement du programme au démarrage de Yii :


<pre>
<pre>
  Yii init
  Yii init
  VersionFetcherServiceLocator->init()
VersionFetcherServiceLocator->init()
    Add REST version fetcher
Ajoutez un outil de récupération de version REST ExtensionUpdaterServiceLocator->init()
  ExtensionUpdaterServiceLocator->init()
Ajoutez PluginUpdater
    Add PluginUpdater
TODO : Ajouter un updater pour chaque type d'extension (thème, modèle de question, ...)
    TODO: Add an updater for each extension type (theme, question template, ...)
</pre>
</pre>


Program flow when running the UpdaterCheck plugin:
Déroulement du programme lors de l'exécution du plugin UpdaterCheck :


<pre>
<pre>
Get all updaters from ExtensionUpdaterServiceLocator
Obtenez toutes les mises à jour de ExtensionUpdaterServiceLocator
Loop each updater
Bouclez chaque programme de mise à jour
  For each updater, loop through version fetchers configured by <updater> XML
Pour chaque programme de mise à jour, parcourez les récupérateurs de versions configurés par<updater> XML
    For each version fetcher, contact remote source and get version information
Pour chaque outil de récupération de version, contactez la source distante et obtenez des informations sur la version
Compose all versions into a notification
Composez toutes les versions dans une notification
</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.
La méthode [https://github.com/LimeSurvey/LimeSurvey/blob/develop/application/core/plugins/UpdateCheck/UpdateCheck.php#L130 checkAll] du plugin UpdateCheck fournit un exemple de la façon d'interroger toutes les extensions pour les nouvelles versions.


==== Adding new version fetchers ====
==== Ajout de nouveaux récupérateurs de version ====


To add a new custom version fetcher, run this during Yii initialization:
Pour ajouter un nouveau récupérateur de version personnalisé, exécutez ceci lors de l'initialisation de Yii :


<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>.
Bien entendu, la classe <code>MyNewVersionFetcher</code> doit sous-classer <code>VersionFetcher</code> .


To use your new version fetcher, configure the <code>type</code> tag in the updater XML to use
Pour utiliser votre nouveau récupérateur de version, configurez la balise <code>type</code> dans le XML du programme de mise à jour pour utiliser
<code>myNewVersionFetcherType</code> (instead of e.g. <code>rest</code>).
<code>myNewVersionFetcherType</code> (au lieu par exemple <code>rest</code> ).


==== Adding new extension updaters ====
==== Ajout de nouveaux programmes de mise à jour d'extension ====


To add a new custom extension updater, run this during Yii initialization:
Pour ajouter un nouveau programme de mise à jour d'extension personnalisé, exécutez ceci lors de l'initialisation de Yii :


<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>.
La classe <code>MyNewExtensionUpdater</code> doit sous-classer <code>ExtensionUpdater</code> .


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.
La balise <code>type</code> supérieure dans config.xml (« plugin », « thème », ...) contrôlera quel programme de mise à jour d'extension est utilisé pour cette extension. Le système n'est pas encore entièrement personnalisable, puisque vous devez également ajouter un ExtensionInstaller personnalisé, des éléments de menu, etc. Mais en théorie, et peut-être dans le futur, il devrait être possible d'ajouter un nouveau type d'extension de cette façon.


== Extension installer ==
== Installateur d'extensions ==


The extension installer library consists of two abstract classes:
La bibliothèque d'installation d'extension se compose de deux classes abstraites :


* ExtensionInstaller
* ExtensionInstaller
* FileFetcher
* FileFetcher


The ExtensionInstaller is subclassed for each extension type, like PluginInstaller, QuestionThemeInstaller, etc.
ExtensionInstaller est une sous-classe pour chaque type d'extension, comme PluginInstaller, QuestionThemeInstaller, etc.


The FileFetcher is subclassed for each different way to fetch files. Currently, only uploaded zip files are supported, but in the future, there could be a Github or LimeStore fetcher too.
Le FileFetcher est sous-classé pour chaque manière différente de récupérer des fichiers. Actuellement, seuls les fichiers zip téléchargés sont pris en charge, mais à l'avenir, il pourrait également y avoir un outil de récupération Github ou LimeStore.


[[File: extensioninstalleruml.png]]
[[File: extensioninstalleruml.png]]


== Special plugins ==
== Plugins spéciaux ==


* [[Authentication plugin development]]
* [[Développement de plugin d'authentification]]
* [[Export plugin development]]
* [[Développement de plugin d'exportation]]


== Available plugins ==
<div class="mw-translate-fuzzy">
* [[Authentication plugins]]
== Plugins disponibles ==
* [[Audit log]]
* [[Plugins d'authentification]]
* [[Journal d'audit]]
* [[CintLink]]
* [[CintLink]]
* [[Available third party plugins]]
* [[Plugins tiers disponibles]]
</div>


== Tutorial ==
== Tutoriel ==
[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 Ce] tutoriel étape par étape montre comment créer un plugin qui envoie une demande de publication à chaque réponse à une enquête soumission. Le didacticiel vous montre comment créer et enregistrer des paramètres globaux et par enquête, comment enregistrer des événements et bien plus encore.


[[Category:Development]]
[[Catégorie:Développement]]
[[Category:Plugins]]
[[Catégorie:Plugins]]

Latest revision as of 16:58, 2 April 2024

Vue d'ensemble

À partir de LimeSurvey 2.05, LimeSurvey prendra officiellement en charge les plugins. Certains plugins seront supportés par l'équipe LimeSurvey et entreront dans le noyau. Certains seront soutenus par d'autres en dehors de l'équipe LimeSurvey. Pour vous aider à les trouver, consultez les Plugins tiers disponibles et ajoutez-y votre propre plugin !

Les plugins permettent aux utilisateurs de personnaliser les fonctionnalités de leur installation tout en bénéficiant de mises à jour logicielles régulières.

Cette documentation est destinée aux développeurs qui étendent LimeSurvey pour leur propre usage ou pour leurs clients ; les utilisateurs finaux ne seront pas aidés par cette documentation.

Les plugins doivent implémenter l'interface iPlugin. Nous vous recommandons d'étendre votre classe de plugin à partir de la classe PluginBase.

Les plugins sont développés autour d'un mécanisme event.

Paramètres du plugin

En étendant, vous bénéficiez des fonctionnalités communes requises par les plugins que nous avons déjà implémentés pour vous. L'une de ces fonctions est l'implémentation de la fonction getPluginSettings. Cette fonction doit renvoyer un tableau décrivant les options de configuration pour l'utilisateur.

L'exemple de plugin expose un seul paramètre configurable, le message qu'il affichera.

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

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

Le tableau contient un nom pour chaque paramètre sous forme de clé. Les valeurs sont des tableaux contenant les métadonnées requises.

Les types pris en charge sont :

  • logo
  • int (nombre entier)
  • chaîne (alphanumérique)
  • texte
  • html
  • pertinence
  • info
  • mot de passe
  • date!
  • sélectionner

Outre le type, un certain nombre d'autres clés sont disponibles :

  • label, définit une étiquette
  • par défaut, définit une valeur à afficher si aucune valeur n'est spécifiée (uniquement pour les paramètres globaux, pas pour les paramètres d'enquête)
  • current, définit la valeur actuelle.
  • readOnly : affiché les paramètres en lecture seule
  • htmlOptions, les htmlOptions de la partie d'entrée (voir le manuel Yii [[1]])
  • pluginOptions, pour quelques paramètres (html ou select) : définissez l'option du widget
  • labelOptions : htmlOptions du label
  • controlOptions : htmlOptions du wrapper de label et input

Vous pouvez trouver un exemple de plugin utilisant tous les paramètres réels sur exampleSettings

Lire et écrire les paramètres du plugin

Il est possible de lire et d'écrire les paramètres du plugin directement à partir du code de votre plugin.

Exemple:

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

Vous pouvez obtenir une valeur par défaut si le paramètre est nul :

$mySetting = $this->get('mySetting', null, null, 10); // 10 est la valeur par défaut

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);
    }

Événements

Les plugins s'abonnent aux événements et peuvent interagir avec LimeSurvey lorsque l'événement est déclenché. Pour une liste des événements actuellement disponibles, consultez Événements du plugin.

API

Les plugins ne doivent étendre LimeSurvey que via son API "publique". Cela signifie qu’utiliser directement les classes trouvées dans le code source est une mauvaise pratique. Bien que nous ne puissions pas vous y obliger, vous risquez d'avoir un plugin défectueux à chaque mise à jour mineure que nous effectuons.

Dans la mesure du possible, interagissez avec LimeSurvey uniquement via les méthodes décrites ici. Idem pour les événements.

L'objet API est disponible via $this->api lors de l'extension depuis PluginBase, sinon vous pouvez l'obtenir à partir de l'instance PluginManager qui est transmise au constructeur de vos plugins.

De nouvelles fonctions peuvent être ajoutées à l'objet API sur demande.

Extension de formulaire (New in 6 )

Présentation

Le système d'extension de formulaire est un moyen plus général d'étendre les formulaires dans le noyau de LimeSurvey sans ajouter de nouvel événement pour chaque formulaire.

Il se compose des éléments suivants :

  • Un module global appelé FormExtensionService
  • Une bibliothèque de classes d'entrée que les plugins peuvent ajouter à l'initialisation du module ci-dessus
  • Un widget, ainsi que moteurs de rendu personnalisés, utilisés dans les fichiers de vue LimeSurvey

Chaque formulaire est identifié par une chaîne de position, comme<form name><dot><tab name> . Exemple : globalsettings.general ou globalsettings.security .

L'objectif d'un système basé sur des classes sans HTML est de libérer les auteurs de plugins de l'œuvre pour qu'ils mettent à jour le code HTML lorsque le code HTML principal change. Néanmoins, l'auteur peut utiliser le type RawHtmlInput si nécessaire.

Une chose que vous ne pouvez pas faire dans ce système est d'ajouter de « nouveaux onglets de formulaire ».

Exemple

Pour ajouter une nouvelle entrée à un formulaire à partir d'un plugin, utilisez le code suivant de votre fonction init() :

TODO : Enregistrer dans les paramètres du plugin au lieu de global

// En haut du fichier
utilisez LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
utilisez LimeSurvey\Libraries\FormExtension\SaveFailedException;

// À l'intérieur de init()
Yii::app()->formExtensionService->add(
 'globalsettings.general',
 new TextInput([
 'name' => 'myinput', 
 'label' => 'Label',
 'disabled' => true,
 'tooltip' => 'Moo moo moo',
 'help' => 'Un texte d'aide', 
 'save' => function($request, $connection) {
 $value = $request->getPost('myinput');
 if ($value === 'une valeur invalide') {
 throw new SaveFailedException("Impossible d'enregistrer l'entrée personnalisée 'myinput'");
 } else {
 SettingGlobal::setSetting('myinput', $value);
 }
 } ,
 'load' => function () {
 return getGlobalSetting('myinput');
 }
 ])
);

Validation

La validation de la saisie se fait dans la fonction save (voir exemple ci-dessus). Si la valeur publiée n'est pas valide, lancez une SaveFailedException et un message flash d'avertissement sera affiché à l'utilisateur.

Formulaires pris en charge

Les formulaires suivants peuvent être étendus :

  • globalsettings.general (New in 6.0.0 )

Si vous souhaitez ajouter la prise en charge d'un autre formulaire principal, vous devez appliquer la modification suivante dans une pull-request :

Dans le fichier de vue, ajoutez :

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

Vous devrez peut-être créer une nouvelle classe de rendu basée sur DefaultBaseRenderer , si le formulaire HTML est différent des autres formulaires. Vous devrez peut-être également étendre la classe de rendu par défaut avec des types d'entrée non encore ajoutés.

La deuxième modification que vous devez effectuer est d'ajouter un appel à la classe de service d'extension de formulaire dans l'action du contrôleur qui enregistre le formulaire :

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

C'est ça!

Localisation (New in 3 )

Il est possible pour les plugins d'ajouter leurs propres fichiers de paramètres régionaux. Le format de fichier utilisé est .mo, identique aux traductions principales. Les fichiers doivent être stockés dans

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

où "<language> " est un mot de deux lettres comme "de" ou "fr".

Pour utiliser le fichier de paramètres régionaux spécifique, utilisez la fonction plugin gT :

$this->gT("Un texte de plugin à traduire");

Si la chaîne donnée ne peut pas être trouvée dans le fichier de paramètres régionaux spécifique au plugin, la fonction recherchera dans les fichiers de paramètres régionaux principaux. Il est donc prudent d'utiliser des chaînes telles que « Annuler » :

$this->gT("Annuler"); // Sera traduit même si "Annuler" n'est pas dans le fichier de paramètres régionaux du plugin

Si vous utilisez des vues avec votre plugin, vous devez utiliser

$plugin->gT("Traduisez-moi");

pour faire une traduction spécifique au plugin à votre avis.

Vous pouvez utiliser le fichier limesurvey.pot comme exemple de ce à quoi peut ressembler un fichier pot. Celui-ci est importé dans votre outil de traduction.

Outils

Un outil open source pour éditer les fichiers po et mo est Poedit.

Journalisation (New in 3 )

Si vous souhaitez enregistrer quelque chose depuis votre plugin, écrivez simplement

$this->log("Votre message");

Le niveau de journalisation par défaut est trace, mais vous pouvez donner un autre niveau de journalisation comme deuxième argument facultatif :

$this->log("Quelque chose s'est mal passé !", CLogger::LEVEL_ERROR);

Le fichier journal se trouve dans le dossier

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

Le nom de votre plugin est automatiquement utilisé comme catégorie. Une bonne façon de voir uniquement les erreurs de votre plugin consiste à utiliser grep (sous Linux) :

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

Plus d'informations sur la configuration de la journalisation dans Yii 1 : Optional_settings#Logging_settings.

Mises à jour de l'extension (New in 4 )

Depuis la version 4.0.0 de LimeSurvey, un système est en place pour gérer les mises à jour des plugins et autres extensions. Pour utiliser ce système, votre fichier d'extension config.xml doit inclure la configuration du programme de mise à jour.

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

(La balise source ci-dessus pointe vers l'API REST LimeStore, qui sera utilisée pour toutes les extensions disponibles dans notre LimeStore.)

Descriptions des balises du programme de mise à jour
Marquez Description
stable "1" si cette source ne vous donne que des numéros de version stables ; "0" si la source fournira également des versions instables, comme 0.3.3-beta .
tapez Pour l’instant, seul le type rest est pris en charge. Il est facile d'ajouter de nouveaux types de programmes de mise à jour (vérificateurs de versions), comme git, wget, etc.
source L'URL à partir de laquelle récupérer les nouvelles versions.
manualUpdateUrl URL vers laquelle l'utilisateur peut accéder pour mettre à jour la dernière version de l'extension.
URL de mise à jour automatique À FAIRE

Si vous ne souhaitez pas fournir de programme de mise à jour, vous devez mettre le texte suivant dans votre fichier XML de configuration :

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

De cette façon, vous indiquez au système que vous avez délibérément désactivé le système de mise à jour et que vous n'avez pas simplement oublié de l'ajouter.

Le nouveau plugin UpdateCheck - installé et activé par défaut - vérifie les nouvelles mises à jour pour toutes les extensions installées lorsqu'un super administrateur se connecte, de manière asynchrone, au maximum une fois toutes les 24 heures. Si de nouvelles versions sont trouvées, une notification est envoyée.

Mises à jour disponibles

Si une nouvelle mise à jour de sécurité est trouvée, la notification s'ouvrira automatiquement et sera classée en classe « danger ».

Mises à jour de sécurité disponibles

Vous pouvez vérifier manuellement les mises à jour en accédant à la vue du gestionnaire de plugins et en cliquant sur « Vérifier les mises à jour ». Notez que ce bouton n'est visible que si le plugin UpdateCheck est activé.

Vérifier manuellement les mises à jour

Sous le capot

Cette section fournit un bref aperçu de l'implémentation du programme de mise à jour de l'extension.

Le programme de mise à jour de l'extension fait partie de la bibliothèque ExtensionInstaller. Vous trouverez ci-dessous un diagramme UML pour les classes liées au processus de mise à jour.

Diagramme UML du programme de mise à jour d'extension

Déroulement du programme au démarrage de Yii :

 Yii init
 VersionFetcherServiceLocator->init()
 Ajoutez un outil de récupération de version REST ExtensionUpdaterServiceLocator->init()
 Ajoutez PluginUpdater
 TODO : Ajouter un updater pour chaque type d'extension (thème, modèle de question, ...)

Déroulement du programme lors de l'exécution du plugin UpdaterCheck :

Obtenez toutes les mises à jour de ExtensionUpdaterServiceLocator
Bouclez chaque programme de mise à jour
Pour chaque programme de mise à jour, parcourez les récupérateurs de versions configurés par<updater> XML
 Pour chaque outil de récupération de version, contactez la source distante et obtenez des informations sur la version
Composez toutes les versions dans une notification

La méthode checkAll du plugin UpdateCheck fournit un exemple de la façon d'interroger toutes les extensions pour les nouvelles versions.

Ajout de nouveaux récupérateurs de version

Pour ajouter un nouveau récupérateur de version personnalisé, exécutez ceci lors de l'initialisation de Yii :

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

Bien entendu, la classe MyNewVersionFetcher doit sous-classer VersionFetcher .

Pour utiliser votre nouveau récupérateur de version, configurez la balise type dans le XML du programme de mise à jour pour utiliser

myNewVersionFetcherType (au lieu par exemple rest ).

Ajout de nouveaux programmes de mise à jour d'extension

Pour ajouter un nouveau programme de mise à jour d'extension personnalisé, exécutez ceci lors de l'initialisation de Yii :

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

La classe MyNewExtensionUpdater doit sous-classer ExtensionUpdater .

La balise type supérieure dans config.xml (« plugin », « thème », ...) contrôlera quel programme de mise à jour d'extension est utilisé pour cette extension. Le système n'est pas encore entièrement personnalisable, puisque vous devez également ajouter un ExtensionInstaller personnalisé, des éléments de menu, etc. Mais en théorie, et peut-être dans le futur, il devrait être possible d'ajouter un nouveau type d'extension de cette façon.

Installateur d'extensions

La bibliothèque d'installation d'extension se compose de deux classes abstraites :

  • ExtensionInstaller
  • FileFetcher

ExtensionInstaller est une sous-classe pour chaque type d'extension, comme PluginInstaller, QuestionThemeInstaller, etc.

Le FileFetcher est sous-classé pour chaque manière différente de récupérer des fichiers. Actuellement, seuls les fichiers zip téléchargés sont pris en charge, mais à l'avenir, il pourrait également y avoir un outil de récupération Github ou LimeStore.

Plugins spéciaux

Tutoriel

Ce tutoriel étape par étape montre comment créer un plugin qui envoie une demande de publication à chaque réponse à une enquête soumission. Le didacticiel vous montre comment créer et enregistrer des paramètres globaux et par enquête, comment enregistrer des événements et bien plus encore.

Catégorie:Développement Catégorie:Plugins