x

Hovedkapitler

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. LimeSurvey Cloud - Hurtig startguide
  3. LimeSurvey CE - Installation
  4. Sådan designes en god undersøgelse (guide)
  5. Kom godt i gang
  6. LimeSurvey konfiguration
  7. Introduktion - Undersøgelser
  8. Se undersøgelsesindstillinger
  9. Se undersøgelsesmenuen
  10. Se undersøgelsens struktur
  11. Introduktion - Spørgsmål
  12. Introduktion - Spørgegrupper
  13. Introduktion - Undersøgelser - Ledelse
  14. Indstillinger for undersøgelsesværktøjslinje
  15. Flersproget undersøgelse
  16. Hurtig startguide - ExpressionScript
  17. Avancerede egenskaber
  18. Generelle FAQ
  19. Fejlfinding
  20. Løsninger
  21. Licens
  22. Versionsændringslog
  23. Plugins - Avanceret
 Actions

Plugins - advanced/da: Difference between revisions

From LimeSurvey Manual

Maren.fritz (talk | contribs)
Created page with "Plugins - avanceret"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(93 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages />
<languages />
<span id="Overview"></span>
== Oversigt ==
== Oversigt ==


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!
Fra LimeSurvey 2.05 vil LimeSurvey officielt understøtte plugins. Nogle plugins vil blive understøttet af LimeSurvey-teamet og vil gå ind i kernen. Nogle vil blive støttet af andre uden for LimeSurvey-teamet. For at hjælpe med at finde dem, tjek [[Tilgængelige tredjeparts plugins]] og tilføj dit eget plugin til det!


Plugins allow users to customize the functionality of their installation while still being able to benefit from regular software updates.
Plugins giver brugerne mulighed for at tilpasse funktionaliteten af deres installation, mens de stadig kan drage fordel af regelmæssige softwareopdateringer.


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.
Denne dokumentation er beregnet til udviklere, der udvider LimeSurvey til eget brug eller til deres kunder; slutbrugere vil ikke blive hjulpet af denne dokumentation.


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 skal implementere grænsefladen [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/iPlugin.php iPlugin]. Vi anbefaler at udvide din plugin-klasse fra [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/PluginBase.php PluginBase]-klassen.  


Plugins are developed around an [http://manual.limesurvey.org/Plugin_events event] mechanism.
<div class="mw-translate-fuzzy">
Plugins er udviklet omkring en [https://manual.limesurvey.org/Plugin_events event]-mekanisme.
</div>


== Plugin settings ==
<span id="Plugin_settings"></span>
== Plugin-indstillinger ==


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.
Ved at udvide drager du fordel af den fælles funktionalitet, der kræves af plugins, som vi allerede har implementeret for dig. En af disse funktioner er implementeringen af funktionen getPluginSettings. Denne funktion skal returnere et array, der beskriver konfigurationsmulighederne for brugeren.


The example plugin exposes just 1 configurable setting, the message it'll show.
Eksemplet plugin afslører kun 1 konfigurerbar indstilling, meddelelsen det vil vise.


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
protected $settings = array(
beskyttede $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' => 'streng',
          'label' => 'Message'
'label' => 'Besked'
     )
)
);
);
</syntaxhighlight>
</syntaxhighlight>


The array contains a name for each setting as a key. The values are arrays containing the required meta data.
Arrayet indeholder et navn for hver indstilling som en nøgle. Værdierne er arrays, der indeholder de nødvendige metadata.


Supported types are:
Understøttede typer er:


* logo
* logo
* int (integer number)
* int (heltal)
* string (alphanumeric)
* streng (alfanumerisk)
* text
* tekst
* html
* html
* relevance
* relevans
* info
* info
* password
* adgangskode
* date
* dato
* select
* vælg


Besides type a number of other keys are available:
Udover type er en række andre nøgler tilgængelige:


* label, defines a label
* label, definerer en etiket
* default, defines a value to show if no value is specified (only for global settings, not for survey settings)
* standard, definerer en værdi, der skal vise, hvis der ikke er angivet nogen værdi (kun for globale indstillinger, ikke for undersøgelsesindstillinger)
* current, defines the current value.
* aktuelle, definerer den aktuelle værdi.
* readOnly : shown the settings as readonly
* readOnly : vist indstillingerne som skrivebeskyttet
* htmlOptions, the htmlOptions of the input part ( see Yii manual [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* htmlOptions, htmlOptions for inputdelen (se Yii manual [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* pluginOptions, for some settings (html or select) : set the widget option
* pluginOptions, for nogle indstillinger (html eller vælg) : indstil widget-indstillingen
* labelOptions : htmlOptions of the label
* labelOptions : htmlOptions of the label
* controlOptions : htmlOptions of the wrapper of label and input
* controlOptions : htmlOptions of wrapper of label and input


You can find a plugin example using all actual settings at [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
Du kan finde et plugin-eksempel ved at bruge alle faktiske indstillinger på [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
=== Read and write plugin settings ===
=== Læs og skriv plugin-indstillinger ===


It's possible to read and write plugin settings directly from your plugin code.
Det er muligt at læse og skrive plugin-indstillinger direkte fra din plugin-kode.


Example:
Eksempel:


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


You can get a default value if the setting happens to be null:
Du kan få en standardværdi, hvis indstillingen tilfældigvis er null:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$mySetting = $this->get('mySetting', null, null, 10); // 10 is default
$mySetting = $this->get('mySetting', null, null, 10); // 10 er standard
</syntaxhighlight>
</syntaxhighlight>


== Events ==
=== Survey specific plugin settings ===


Plugins subscribe to events and can interact with LimeSurvey when the event is fired. For a list of currently available events check [[Plugin events]].
Two events are used to create survey specific plugin settings:
 
* newSurveySettings
* beforeSurveySettings
 
Example to disable a plugin for a specific survey:
 
<syntaxhighlight lang="php">
 
    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>
 
<span id="Events"></span>
== Begivenheder ==
 
Plugins abonnerer på begivenheder og kan interagere med LimeSurvey, når begivenheden udløses. Se [[Plugin-begivenheder]] for en liste over tilgængelige begivenheder.


== 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 bør kun udvide LimeSurvey via dets "offentlige" API. Det betyder, at direkte brug af klasser fundet i kildekoden er en dårlig praksis. Selvom vi ikke kan tvinge dig til at lade være, risikerer du at have et ødelagt plugin med hver mindre opdatering, vi laver.


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.
Så meget som muligt interagerer kun med LimeSurvey via metoder beskrevet [http://api.limesurvey.org/classes/LimeSurvey.PluginManager.LimesurveyApi.html her]. Samme som for arrangementer.


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.
API-objektet er tilgængeligt via <code>$this->api</code> , når det udvides fra PluginBase, ellers kan du hente det fra PluginManager-instansen, der sendes til dine plugins' konstruktør.


New functions can be added to the API object upon request.
Nye funktioner kan tilføjes til API-objektet efter anmodning.


== Form extension{{NewIn|v=6}} ==
<span id="Form_extension{{NewIn|v=6}}"></span>
== Formularudvidelse{{NewIn|v=6}} ==


=== Introduction ===
<span id="Introduction"></span>
=== Introduktion ===


The form extension system is a more general way to extend forms in core LimeSurvey without adding a new event for each form.
Formudvidelsessystemet er en mere generel måde at udvide formularer i kerne LimeSurvey uden at tilføje en ny begivenhed for hver formular.


It consists of the following components:
Den består af følgende komponenter:


* A global module called '''FormExtensionService'''
* Et globalt modul kaldet '''FormExtensionService'''
* A library of '''input classes''' that plugins can add to above module initialization
* Et bibliotek af '''inputklasser''', som plugins kan tilføje til ovenstående modulinitialisering
* A '''widget''', together with custom renderers, that are used in the LimeSurvey view files
* En '''widget''' sammen med brugerdefinerede renderere, der bruges i LimeSurvey-visningsfilerne


Each form is identified by a '''position string''', like <form name><dot><tab name>. Example: <code>globalsettings.general</code> or <code>globalsettings.security</code>.
Hver form er identificeret med en '''positionsstreng''', f.eks<form name><dot><tab name> . Eksempel: <code>globalsettings.general</code> eller <code>globalsettings.security</code> .


The point behind a class-based system without HTML is to free the plugin authors of the work to update the HTML when the core HTML changes. Still, the author can use the <code>RawHtmlInput</code> type if needed.
Pointen bag et klassebaseret system uden HTML er at frigøre plugin-forfatterne af arbejdet til at opdatere HTML'en, når kerne-HTML'en ændres. Alligevel kan forfatteren bruge <code>RawHtmlInput</code> typen, hvis det er nødvendigt.


One thing you cannot do in this system is to add ''new form tabs''.
En ting, du ikke kan gøre i dette system, er at tilføje ''nye formularfaner''.


=== Example ===
<span id="Example"></span>
=== Eksempel ===


To add a new input to a form from a plugin, use the following code from your <code>init()</code> function:
For at tilføje et nyt input til en formular fra et plugin skal du bruge følgende kode fra din <code>init()</code> funktion:


TODO: Save in plugin settings instead of global
TODO: Gem i plugin-indstillinger i stedet for globalt


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
// At top of file
// Øverst i filen
use LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
brug LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
use LimeSurvey\Libraries\FormExtension\SaveFailedException;
brug LimeSurvey\Libraries\FormExtension\SaveFailedException;


// Inside init()
// Inside init()
Yii::app()->formExtensionService->add(
Yii::app()->formExtensionService->add(
    'globalsettings.general',
'globalsettings.general',
    new TextInput([
new TextInput([
        'name' => 'myinput',
'name' => 'myinput',  
        'label' => 'Label',
'label' => 'Etiket',
        'disabled' => true,
'disabled' => sand,
        'tooltip' => 'Moo moo moo',
'tooltip' => 'Moo moo moo',
        'help' => 'Some help text',
'help' => 'Noget hjælpetekst',  
        'save' => function($request, $connection) {
'save' => funktion($request, $connection) {
            $value = $request->getPost('myinput');
$value = $request->getPost('myinput');
            if ($value === 'some invalid value') {
if ($value === 'en eller anden ugyldig værdi') {
                throw new SaveFailedException("Could not save custom input 'myinput'");
throw new SaveFailedException("Kunne ikke gemme brugerdefineret input 'myinput'");
            } else {
} ellers {
                SettingGlobal::setSetting('myinput', $value);
SettingGlobal::setSetting('myinput', $value);
            }
}
        },
} ,
        'load' => function () {
'load' => funktion () {
            return getGlobalSetting('myinput');
return getGlobalSetting('myinput');
        }
}
    ])
])
);
);
</syntaxhighlight>
</syntaxhighlight>


=== Validation ===
<span id="Validation"></span>
=== Validering ===


Validation of the input is done in the <code>save</code> function (see example above). If the posted value is invalid, throw a <code>SaveFailedException</code>, and a warning flash message will be shown to the user.
Validering af input udføres i <code>save</code> funktionen (se eksemplet ovenfor). Hvis den bogførte værdi er ugyldig, smid en <code>SaveFailedException</code> , og en advarselsmeddelelse vil blive vist til brugeren.


=== Supported forms ===
<span id="Supported_forms"></span>
=== Understøttede formularer ===


The following forms can be extended:
Følgende formularer kan udvides:


* globalsettings.general{{NewIn|v=6.0.0}}
* globalsettings.general{{NewIn|v=6.0.0}}


If you want to add support for another core form, you need to apply the following change in a pull-request:
Hvis du vil tilføje support til en anden kerneformular, skal du anvende følgende ændring i en pull-anmodning:


In the view file, add:
Tilføj i visningsfilen:


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


You might have to create a new renderer class based on <code>DefaultBaseRenderer</code>, if the form HTML is different than other forms. You might also need to extend the default renderer class with input types not yet added.
Du skal muligvis oprette en ny gengivelsesklasse baseret på <code>DefaultBaseRenderer</code> , hvis formen HTML er anderledes end andre formularer. Du skal muligvis også udvide standardrendererklassen med inputtyper, der endnu ikke er tilføjet.


The second change you have to do is add a call to the form extension service class in the controller action that saves the form:
Den anden ændring, du skal gøre, er at tilføje et opkald til formularudvidelsesserviceklassen i controllerhandlingen, der gemmer formularen:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
Line 178: Line 242:
</syntaxhighlight>
</syntaxhighlight>


That's it!
Det er det!


== Localization {{NewIn|v=3}} ==
<span id="Localization_{{NewIn|v=3}}"></span>
== Lokalisering {{NewIn|v=3}} ==


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
Det er muligt for plugins at tilføje deres egne lokalitetsfiler. Det anvendte filformat er .mo, det samme som kerneoversættelser. Filerne skal gemmes i


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


where "<language>" is a two letter word like "de" or "fr".
hvor "<language> " er et ord på to bogstaver som "de" eller "fr".


To use the specific locale file, use the plugin function gT:
For at bruge den specifikke lokalitetsfil, brug plugin-funktionen gT:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("A plugin text that needs to be translated");
$this->gT("En plugin-tekst, der skal oversættes");
</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":
Hvis den givne streng ikke kan findes i den plugin-specifikke lokalitetsfil, vil funktionen se i de centrale lokalitetsfiler. Så det er sikkert at bruge strenge som "Annuller":


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("Cancel"); // Will be translated even if "Cancel" is not in the plugin locale file
$this->gT("Annuller"); // Vil blive oversat, selvom "Annuller" ikke er i plugin-lokalitetsfilen
</syntaxhighlight>
</syntaxhighlight>


If you are using views together with your plugin, you should use
Hvis du bruger visninger sammen med dit plugin, skal du bruge


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$plugin->gT("Translate me");
$plugin->gT("Oversæt mig");
</syntaxhighlight>
</syntaxhighlight>


to do plugin specific translation in your view.
at lave plugin-specifik oversættelse i din visning.


You can use the [https://github.com/LimeSurvey/LimeSurvey/blob/master/locale/_template/limesurvey.pot limesurvey.pot] file as an example of how a pot file can look like. This is imported into your translation tool.
Du kan bruge filen [https://github.com/LimeSurvey/LimeSurvey/blob/master/locale/_template/limesurvey.pot limesurvey.pot] som et eksempel på, hvordan en pot-fil kan se ud. Dette importeres til dit oversættelsesværktøj.


=== Tools ===
<span id="Tools"></span>
=== Værktøj ===


One open-source tool to edit po- and mo-files is [https://poedit.net/ Poedit].
Et open source-værktøj til at redigere po- og mo-filer er [https://poedit.net/ Poedit].


== Logging {{NewIn|v=3}} ==
<span id="Logging_{{NewIn|v=3}}"></span>
== Logger {{NewIn|v=3}} ==


If you want to log something from your plugin, just write
Hvis du vil logge noget fra dit plugin, skal du bare skrive


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


The default logging level is trace, but you can give another log level as an optional second argument:
Standardlogningsniveauet er sporing, men du kan give et andet logniveau som et valgfrit andet argument:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Something went wrong!", CLogger::LEVEL_ERROR);
$this->log("Noget gik galt!", CLogger::LEVEL_ERROR);
</syntaxhighlight>
</syntaxhighlight>


The log file can be found in folder
Logfilen kan findes i mappen


  <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):
Dit plugin-navn bruges automatisk som kategori. En god måde kun at se fejlene fra dit plugin er at bruge grep (Linux):
 
$ tail -f tmp/runtime/plugin.log | grep<your plugin name>
 
=== Logging plugin deactivation due to error  {{NewIn|v=6.13.3}} ===
 
Since version 5 of Limesurvey: a plugin can be automatically deactivated in the event of a PHP error.


  $ tail -f tmp/runtime/plugin.log | grep <your plugin name>
An email was sent automatically to LimeSurvey administrator. You can use the log system to generate an alert to the other server administrators.
 
For example: to send an alert message
 
<syntaxhighlight lang="php">
                // Plugin error happen, plugin was disable : send email using CLogRoute
                'pluginError' => array(
                    'class' => 'CEmailLogRoute', // https://www.yiiframework.com/doc/api/1.1/CEmailLogRoute
                    'categories' => 'application.model.plugin.setLoadError', // A plugin was disable
                    'subject' => '[ERROR] Plugin deactivated',
                    'emails' => ['webmaster@example.org'],
                    'sentFrom' => 'noreply@example.org',
                    'enabled' => 1, // enabled here
                )
</syntaxhighlight>


More info about configuring logging in Yii 1: [[Optional_settings#Logging_settings]].
Mere info om konfiguration af logning i Yii 1: [[Optional_settings#Logging_settings]].


== Extension updates {{NewIn|v=4}} ==
<span id="Extension_updates_{{NewIn|v=4}}"></span>
== Udvidelsesopdateringer {{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.
Siden LimeSurvey version 4.0.0, er der et system på plads til at håndtere plugin og andre udvidelsesopdateringer. For at bruge dette system skal din filtypenavn config.xml inkludere opdateringskonfiguration.


<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<updaters>
<updaters>  
    <updater>
<updater>  
        <stable>1</stable>
<stable> 1</stable>  
        <type>rest</type>
<type> hvile</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.)
(Kildetagget ovenfor peger på LimeStore REST API, som vil blive brugt til alle tilgængelige udvidelser i vores LimeStore.)


{| class="wikitable"
{| class="wikitable"
|+ Updater tag descriptions
|+ Opdateringstagbeskrivelser
|-
|-
! Tag  
! Tag  
! Description
! Beskrivelse
|-
|-
| 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", hvis denne kilde kun giver dig stabile versionsnumre; "0", hvis kilden også vil give ustabile versioner, såsom <code>0.3.3-beta</code> .
|-
|-
| type  
| type  
| For now, only type <code>rest</code> is supported. It's easy to add new updater types (version checkers), like git, wget, etc.
| Indtil videre understøttes kun type <code>rest</code> . Det er nemt at tilføje nye opdateringstyper (version checkers), som git, wget osv.
|-
|-
| source
| kilde
| The URL to fetch new versions from.
| URL'en til at hente nye versioner fra.
|-
|-
| manualUpdateUrl  
| manualUpdateUrl  
| URL which the user can go to to update the latest version of the extension.
| URL, som brugeren kan gå til for at opdatere den seneste version af udvidelsen.
|-
|-
| automaticUpdateUrl  
| automaticUpdateUrl  
Line 277: Line 365:
|}
|}


If you don't want to supply an updater, you should put the following text in your config XML file:
Hvis du ikke ønsker at levere et opdateringsprogram, skal du indsætte følgende tekst i din config XML-fil:


<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.
På denne måde fortæller du systemet, at du målrettet har deaktiveret opdateringssystemet og ikke bare har glemt at tilføje det.


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.
Det nye plugin '''UpdateCheck''' - installeret og aktiveret som standard - søger efter nye opdateringer til ''alle'' installerede udvidelser, når en superadministrator logger på, asynkront, maks. én gang hver 24. time. Hvis der findes nye versioner, sendes en meddelelse.


[[File:availableupdates.png||Available updates]]
[[File:availableupdates.png||Tilgængelige opdateringer]]


If a new security update is found, the notification will open automatically and be styled in "danger" class.
Hvis der findes en ny sikkerhedsopdatering, åbnes meddelelsen automatisk og stiles i "fare"-klassen.


[[File:availablesecurityupdates.png||Available security updates]]
[[File:availablesecurityupdates.png||Tilgængelige sikkerhedsopdateringer]]


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.
Du kan manuelt søge efter opdateringer ved at gå til plugin-managervisningen og klikke på "Kontroller opdateringer". Bemærk, at denne knap kun er synlig, hvis UpdateCheck-pluginnet er aktiveret.


[[File:manuallycheckforupdates.png||Manually check for updates]]
[[File:manuallycheckforupdates.png||Søg manuelt for opdateringer]]


=== Under the hood ===
<span id="Under_the_hood"></span>
=== Under hætten ===


This section provides a brief overview over the extension updater implementation.
Dette afsnit giver et kort overblik over implementeringen af udvidelsesopdateringen.


The extension updater is part of the ExtensionInstaller library. Below is a UML diagram for the classes related to the updater process.
Udvidelsesopdateringen er en del af ExtensionInstaller-biblioteket. Nedenfor er et UML-diagram for klasserne relateret til opdateringsprocessen.


[[File:extensionupdateruml.png||Extension updater UML diagram]]
[[Fil:extensionupdateruml.png||UML-diagram for udvidelsesopdatering]]


Program flow when Yii starts:
Programflow, når Yii starter:


<pre>
<pre>
  Yii init
  Yii init
  VersionFetcherServiceLocator->init()
VersionFetcherServiceLocator->init()
    Add REST version fetcher
Tilføj REST version fetcher
  ExtensionUpdaterServiceLocator->init()
ExtensionUpdaterServiceLocator->init()
    Add PluginUpdater
Tilføj PluginUpdater
    TODO: Add an updater for each extension type (theme, question template, ...)
TODO: Tilføj en opdatering til hver udvidelsestype (tema, spørgsmålskabelon, ...)
</pre>
</pre>


Program flow when running the UpdaterCheck plugin:
Programflow, når du kører UpdaterCheck-pluginnet:


<pre>
<pre>
  Get all updaters from ExtensionUpdaterServiceLocator
  Hent alle opdateringer fra ExtensionUpdaterServiceLocator
  Loop each updater
  Loop hver opdatering
  For each updater, loop through version fetchers configured by <updater> XML
For hver opdatering skal du gå gennem versionshentere konfigureret af<updater> XML
    For each version fetcher, contact remote source and get version information
For hver versionshenter skal du kontakte fjernkilden og få versionsoplysninger
  Compose all versions into a notification
  Komponer alle versioner til en notifikation
</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.
Metoden [https://github.com/LimeSurvey/LimeSurvey/blob/develop/application/core/plugins/UpdateCheck/UpdateCheck.php#L130 checkAll] i UpdateCheck-pluginnet giver et eksempel på, hvordan man forespørger alle udvidelser for nye versioner .


==== Adding new version fetchers ====
<span id="Adding_new_version_fetchers"></span>
==== Tilføjelse af nye versionshentere ====


To add a new custom version fetcher, run this during Yii initialization:
For at tilføje en ny brugerdefineret versionshenter skal du køre dette under Yii-initialisering:


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


Of course, the class <code>MyNewVersionFetcher</code> has to subclass <code>VersionFetcher</code>.
Selvfølgelig skal klassen <code>MyNewVersionFetcher</code> underklasse <code>VersionFetcher</code> .


To use your new version fetcher, configure the <code>type</code> tag in the updater XML to use
For at bruge din nye versionshenter skal du konfigurere <code>type</code> i opdateringsprogrammet XML til at bruge
<code>myNewVersionFetcherType</code> (instead of e.g. <code>rest</code>).
<code>myNewVersionFetcherType</code> (i stedet for f.eks. <code>rest</code> ).


==== Adding new extension updaters ====
<span id="Adding_new_extension_updaters"></span>
==== Tilføjelse af nye udvidelsesopdateringer ====


To add a new custom extension updater, run this during Yii initialization:
For at tilføje en ny brugerdefineret udvidelsesopdatering skal du køre denne under Yii-initialisering:


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


Class <code>MyNewExtensionUpdater</code> has to subclass <code>ExtensionUpdater</code>.
Class <code>MyNewExtensionUpdater</code> skal underklasse <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.
Den øverste <code>type</code> tag i config.xml ('plugin', 'theme', ...) vil kontrollere, hvilken udvidelsesopdatering der bruges til denne udvidelse. Systemet er endnu ikke helt tilpasseligt, da du også skal tilføje en tilpasset ExtensionInstaller, menupunkter osv. Men i teorien, og måske i fremtiden, skulle det være muligt at tilføje en ny type udvidelse på denne måde.


== Extension installer ==
<span id="Extension_installer"></span>
== Udvidelsesinstallationsprogram ==


The extension installer library consists of two abstract classes:
Udvidelsesinstallationsbiblioteket består af to abstrakte klasser:


* ExtensionInstaller
* ExtensionInstaller
* FileFetcher
* FileFetcher


The ExtensionInstaller is subclassed for each extension type, like PluginInstaller, QuestionThemeInstaller, etc.
ExtensionInstaller er underklassificeret for hver udvidelsestype, såsom PluginInstaller, QuestionThemeInstaller osv.


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.
FileFetcher er underklassificeret for hver anden måde at hente filer på. I øjeblikket understøttes kun uploadede zip-filer, men i fremtiden kan der også være en Github- eller LimeStore-henter.


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


== Special plugins ==
<span id="Special_plugins"></span>
== Særlige plugins ==


* [[Authentication plugin development]]
* [[Authentication plugin-udvikling]]
* [[Export plugin development]]
* [[Export plugin-udvikling]]


== Available plugins ==
<div class="mw-translate-fuzzy">
== Tilgængelige plugins ==
* [[Authentication plugins]]
* [[Authentication plugins]]
* [[Audit log]]
* [[Revisionslog]]
* [[CintLink]]
* [[CintLink]]
* [[Available third party plugins]]
* [[Tilgængelige tredjeparts plugins]]
</div>


== Tutorial ==
== Selvstudium ==
[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 Denne] trinvise selvstudie viser, hvordan man opretter et plugin, der sender en postanmodning ved hvert spørgeskemasvar indsendelse. Selvstudiet viser dig, hvordan du opretter og gemmer globale og per-survey-indstillinger, hvordan du registrerer begivenheder og mere.


[[Category:Development]]
[[Kategori:Udvikling]]
[[Category:Plugins]]
[[Kategori:Plugins]]

Latest revision as of 16:30, 12 August 2025

Oversigt

Fra LimeSurvey 2.05 vil LimeSurvey officielt understøtte plugins. Nogle plugins vil blive understøttet af LimeSurvey-teamet og vil gå ind i kernen. Nogle vil blive støttet af andre uden for LimeSurvey-teamet. For at hjælpe med at finde dem, tjek Tilgængelige tredjeparts plugins og tilføj dit eget plugin til det!

Plugins giver brugerne mulighed for at tilpasse funktionaliteten af deres installation, mens de stadig kan drage fordel af regelmæssige softwareopdateringer.

Denne dokumentation er beregnet til udviklere, der udvider LimeSurvey til eget brug eller til deres kunder; slutbrugere vil ikke blive hjulpet af denne dokumentation.

Plugins skal implementere grænsefladen iPlugin. Vi anbefaler at udvide din plugin-klasse fra PluginBase-klassen.

Plugins er udviklet omkring en event-mekanisme.

Plugin-indstillinger

Ved at udvide drager du fordel af den fælles funktionalitet, der kræves af plugins, som vi allerede har implementeret for dig. En af disse funktioner er implementeringen af funktionen getPluginSettings. Denne funktion skal returnere et array, der beskriver konfigurationsmulighederne for brugeren.

Eksemplet plugin afslører kun 1 konfigurerbar indstilling, meddelelsen det vil vise.

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

'message' => array(
 'type' => 'streng',
 'label' => 'Besked'
 )
);

Arrayet indeholder et navn for hver indstilling som en nøgle. Værdierne er arrays, der indeholder de nødvendige metadata.

Understøttede typer er:

  • logo
  • int (heltal)
  • streng (alfanumerisk)
  • tekst
  • html
  • relevans
  • info
  • adgangskode
  • dato
  • vælg

Udover type er en række andre nøgler tilgængelige:

  • label, definerer en etiket
  • standard, definerer en værdi, der skal vise, hvis der ikke er angivet nogen værdi (kun for globale indstillinger, ikke for undersøgelsesindstillinger)
  • aktuelle, definerer den aktuelle værdi.
  • readOnly : vist indstillingerne som skrivebeskyttet
  • htmlOptions, htmlOptions for inputdelen (se Yii manual [[1]])
  • pluginOptions, for nogle indstillinger (html eller vælg) : indstil widget-indstillingen
  • labelOptions : htmlOptions of the label
  • controlOptions : htmlOptions of wrapper of label and input

Du kan finde et plugin-eksempel ved at bruge alle faktiske indstillinger på exampleSettings

Læs og skriv plugin-indstillinger

Det er muligt at læse og skrive plugin-indstillinger direkte fra din plugin-kode.

Eksempel:

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

Du kan få en standardværdi, hvis indstillingen tilfældigvis er null:

$mySetting = $this->get('mySetting', null, null, 10); // 10 er 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);
    }

Begivenheder

Plugins abonnerer på begivenheder og kan interagere med LimeSurvey, når begivenheden udløses. Se Plugin-begivenheder for en liste over tilgængelige begivenheder.

API

Plugins bør kun udvide LimeSurvey via dets "offentlige" API. Det betyder, at direkte brug af klasser fundet i kildekoden er en dårlig praksis. Selvom vi ikke kan tvinge dig til at lade være, risikerer du at have et ødelagt plugin med hver mindre opdatering, vi laver.

Så meget som muligt interagerer kun med LimeSurvey via metoder beskrevet her. Samme som for arrangementer.

API-objektet er tilgængeligt via $this->api , når det udvides fra PluginBase, ellers kan du hente det fra PluginManager-instansen, der sendes til dine plugins' konstruktør.

Nye funktioner kan tilføjes til API-objektet efter anmodning.

<span id="Form_extension (New in 6 )">

Formularudvidelse (New in 6 )

Introduktion

Formudvidelsessystemet er en mere generel måde at udvide formularer i kerne LimeSurvey uden at tilføje en ny begivenhed for hver formular.

Den består af følgende komponenter:

  • Et globalt modul kaldet FormExtensionService
  • Et bibliotek af inputklasser, som plugins kan tilføje til ovenstående modulinitialisering
  • En widget sammen med brugerdefinerede renderere, der bruges i LimeSurvey-visningsfilerne

Hver form er identificeret med en positionsstreng, f.eks<form name><dot><tab name> . Eksempel: globalsettings.general eller globalsettings.security .

Pointen bag et klassebaseret system uden HTML er at frigøre plugin-forfatterne af arbejdet til at opdatere HTML'en, når kerne-HTML'en ændres. Alligevel kan forfatteren bruge RawHtmlInput typen, hvis det er nødvendigt.

En ting, du ikke kan gøre i dette system, er at tilføje nye formularfaner.

Eksempel

For at tilføje et nyt input til en formular fra et plugin skal du bruge følgende kode fra din init() funktion:

TODO: Gem i plugin-indstillinger i stedet for globalt

// Øverst i filen
brug LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
brug LimeSurvey\Libraries\FormExtension\SaveFailedException;

// Inside init()
Yii::app()->formExtensionService->add(
 'globalsettings.general',
 new TextInput([
 'name' => 'myinput', 
 'label' => 'Etiket',
 'disabled' => sand,
 'tooltip' => 'Moo moo moo',
 'help' => 'Noget hjælpetekst', 
 'save' => funktion($request, $connection) {
 $value = $request->getPost('myinput');
 if ($value === 'en eller anden ugyldig værdi') {
 throw new SaveFailedException("Kunne ikke gemme brugerdefineret input 'myinput'");
 } ellers {
 SettingGlobal::setSetting('myinput', $value);
 }
 } ,
 'load' => funktion () {
 return getGlobalSetting('myinput');
 }
 ])
);

Validering

Validering af input udføres i save funktionen (se eksemplet ovenfor). Hvis den bogførte værdi er ugyldig, smid en SaveFailedException , og en advarselsmeddelelse vil blive vist til brugeren.

Understøttede formularer

Følgende formularer kan udvides:

  • globalsettings.general (New in 6.0.0 )

Hvis du vil tilføje support til en anden kerneformular, skal du anvende følgende ændring i en pull-anmodning:

Tilføj i visningsfilen:

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

Du skal muligvis oprette en ny gengivelsesklasse baseret på DefaultBaseRenderer , hvis formen HTML er anderledes end andre formularer. Du skal muligvis også udvide standardrendererklassen med inputtyper, der endnu ikke er tilføjet.

Den anden ændring, du skal gøre, er at tilføje et opkald til formularudvidelsesserviceklassen i controllerhandlingen, der gemmer formularen:

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

Det er det!

<span id="Localization_ (New in 3 )">

Lokalisering (New in 3 )

Det er muligt for plugins at tilføje deres egne lokalitetsfiler. Det anvendte filformat er .mo, det samme som kerneoversættelser. Filerne skal gemmes i

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

hvor "<language> " er et ord på to bogstaver som "de" eller "fr".

For at bruge den specifikke lokalitetsfil, brug plugin-funktionen gT:

$this->gT("En plugin-tekst, der skal oversættes");

Hvis den givne streng ikke kan findes i den plugin-specifikke lokalitetsfil, vil funktionen se i de centrale lokalitetsfiler. Så det er sikkert at bruge strenge som "Annuller":

$this->gT("Annuller"); // Vil blive oversat, selvom "Annuller" ikke er i plugin-lokalitetsfilen

Hvis du bruger visninger sammen med dit plugin, skal du bruge

$plugin->gT("Oversæt mig");

at lave plugin-specifik oversættelse i din visning.

Du kan bruge filen limesurvey.pot som et eksempel på, hvordan en pot-fil kan se ud. Dette importeres til dit oversættelsesværktøj.

Værktøj

Et open source-værktøj til at redigere po- og mo-filer er Poedit.

<span id="Logging_ (New in 3 )">

Logger (New in 3 )

Hvis du vil logge noget fra dit plugin, skal du bare skrive

$this->log("Din besked");

Standardlogningsniveauet er sporing, men du kan give et andet logniveau som et valgfrit andet argument:

$this->log("Noget gik galt!", CLogger::LEVEL_ERROR);

Logfilen kan findes i mappen

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

Dit plugin-navn bruges automatisk som kategori. En god måde kun at se fejlene fra dit plugin er at bruge grep (på Linux):

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

Logging plugin deactivation due to error (New in 6.13.3 )

Since version 5 of Limesurvey: a plugin can be automatically deactivated in the event of a PHP error.

An email was sent automatically to LimeSurvey administrator. You can use the log system to generate an alert to the other server administrators.

For example: to send an alert message

                // Plugin error happen, plugin was disable : send email using CLogRoute
                'pluginError' => array(
                    'class' => 'CEmailLogRoute', // https://www.yiiframework.com/doc/api/1.1/CEmailLogRoute
                    'categories' => 'application.model.plugin.setLoadError', // A plugin was disable
                    'subject' => '[ERROR] Plugin deactivated',
                    'emails' => ['webmaster@example.org'],
                    'sentFrom' => 'noreply@example.org',
                    'enabled' => 1, // enabled here
                )

Mere info om konfiguration af logning i Yii 1: Optional_settings#Logging_settings.

<span id="Extension_updates_ (New in 4 )">

Udvidelsesopdateringer (New in 4 )

Siden LimeSurvey version 4.0.0, er der et system på plads til at håndtere plugin og andre udvidelsesopdateringer. For at bruge dette system skal din filtypenavn config.xml inkludere opdateringskonfiguration.

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

(Kildetagget ovenfor peger på LimeStore REST API, som vil blive brugt til alle tilgængelige udvidelser i vores LimeStore.)

Opdateringstagbeskrivelser
Tag Beskrivelse
stabil "1", hvis denne kilde kun giver dig stabile versionsnumre; "0", hvis kilden også vil give ustabile versioner, såsom 0.3.3-beta .
type Indtil videre understøttes kun type rest . Det er nemt at tilføje nye opdateringstyper (version checkers), som git, wget osv.
kilde URL'en til at hente nye versioner fra.
manualUpdateUrl URL, som brugeren kan gå til for at opdatere den seneste version af udvidelsen.
automaticUpdateUrl TODO

Hvis du ikke ønsker at levere et opdateringsprogram, skal du indsætte følgende tekst i din config XML-fil:

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

På denne måde fortæller du systemet, at du målrettet har deaktiveret opdateringssystemet og ikke bare har glemt at tilføje det.

Det nye plugin UpdateCheck - installeret og aktiveret som standard - søger efter nye opdateringer til alle installerede udvidelser, når en superadministrator logger på, asynkront, maks. én gang hver 24. time. Hvis der findes nye versioner, sendes en meddelelse.

Tilgængelige opdateringer

Hvis der findes en ny sikkerhedsopdatering, åbnes meddelelsen automatisk og stiles i "fare"-klassen.

Tilgængelige sikkerhedsopdateringer

Du kan manuelt søge efter opdateringer ved at gå til plugin-managervisningen og klikke på "Kontroller opdateringer". Bemærk, at denne knap kun er synlig, hvis UpdateCheck-pluginnet er aktiveret.

Søg manuelt for opdateringer

Under hætten

Dette afsnit giver et kort overblik over implementeringen af udvidelsesopdateringen.

Udvidelsesopdateringen er en del af ExtensionInstaller-biblioteket. Nedenfor er et UML-diagram for klasserne relateret til opdateringsprocessen.

|UML-diagram for udvidelsesopdatering

Programflow, når Yii starter:

 Yii init
 VersionFetcherServiceLocator->init()
 Tilføj REST version fetcher
 ExtensionUpdaterServiceLocator->init()
 Tilføj PluginUpdater
 TODO: Tilføj en opdatering til hver udvidelsestype (tema, spørgsmålskabelon, ...)

Programflow, når du kører UpdaterCheck-pluginnet:

 Hent alle opdateringer fra ExtensionUpdaterServiceLocator
 Loop hver opdatering
 For hver opdatering skal du gå gennem versionshentere konfigureret af<updater> XML
 For hver versionshenter skal du kontakte fjernkilden og få versionsoplysninger
 Komponer alle versioner til en notifikation

Metoden checkAll i UpdateCheck-pluginnet giver et eksempel på, hvordan man forespørger alle udvidelser for nye versioner .

Tilføjelse af nye versionshentere

For at tilføje en ny brugerdefineret versionshenter skal du køre dette under Yii-initialisering:

$service = \Yii::app()->versionFetcherServiceLocator
$service->addVersionFetcherType(
 'myNewVersionFetcherType',
 funktion (\SimpleXMLElement $updaterXml) {
 returner ny MyNewVersionFetcher( $updaterXml);
 }
);

Selvfølgelig skal klassen MyNewVersionFetcher underklasse VersionFetcher .

For at bruge din nye versionshenter skal du konfigurere type i opdateringsprogrammet XML til at bruge

myNewVersionFetcherType (i stedet for f.eks. rest ).

Tilføjelse af nye udvidelsesopdateringer

For at tilføje en ny brugerdefineret udvidelsesopdatering skal du køre denne under Yii-initialisering:

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

Class MyNewExtensionUpdater skal underklasse ExtensionUpdater .

Den øverste type tag i config.xml ('plugin', 'theme', ...) vil kontrollere, hvilken udvidelsesopdatering der bruges til denne udvidelse. Systemet er endnu ikke helt tilpasseligt, da du også skal tilføje en tilpasset ExtensionInstaller, menupunkter osv. Men i teorien, og måske i fremtiden, skulle det være muligt at tilføje en ny type udvidelse på denne måde.

Udvidelsesinstallationsprogram

Udvidelsesinstallationsbiblioteket består af to abstrakte klasser:

  • ExtensionInstaller
  • FileFetcher

ExtensionInstaller er underklassificeret for hver udvidelsestype, såsom PluginInstaller, QuestionThemeInstaller osv.

FileFetcher er underklassificeret for hver anden måde at hente filer på. I øjeblikket understøttes kun uploadede zip-filer, men i fremtiden kan der også være en Github- eller LimeStore-henter.

Særlige plugins

Selvstudium

Denne trinvise selvstudie viser, hvordan man opretter et plugin, der sender en postanmodning ved hvert spørgeskemasvar indsendelse. Selvstudiet viser dig, hvordan du opretter og gemmer globale og per-survey-indstillinger, hvordan du registrerer begivenheder og mere.

Kategori:Udvikling Kategori:Plugins