x

Capitolele principale

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. LimeSurvey Cloud - Ghid de inițiere rapidă
  3. LimeSurvey CE - Instalare
  4. Cum să proiectați un sondaj bun (Ghid)
  5. Noțiuni de bază
  6. Configurați LimeSurvey
  7. Sondaje - Introducere
  8. Setările sondajului
  9. Vizualizați meniul sondajului
  10. Vedeți structura sondajului
  11. Introducere - Întrebări
  12. Introducere - Grupuri de întrebări
  13. Introducere - Managementul Sondajelor
  14. Opțiunile barei de instrumente pentru sondaj
  15. Sondaj multilingv
  16. Ghid de inițiere rapidă - ExpressionScript
  17. Caracteristici avansate
  18. Întrebări generale frrecvente
  19. Depanare
  20. Soluții alternative
  21. Licență
  22. Jurnal de modificare a versiunii
  23. Pluginuri - Avansat
 Actions

Plugins - advanced/ro: Difference between revisions

From LimeSurvey Manual

Maren.fritz (talk | contribs)
Created page with "Pluginuri - avansate"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(87 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages />
<languages />
== Overview ==
<span id="Overview"></span>
== Prezentare generală ==


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!
Începând cu LimeSurvey 2.05, LimeSurvey va accepta oficial plugin-uri. Unele plugin-uri vor fi susținute de echipa LimeSurvey și vor intra în core. Unii vor fi sprijiniți de alții din afara echipei LimeSurvey. Pentru a le găsi, consultați [[Pluginurile terțe disponibile]] și adăugați-i propriul plugin!


Plugins allow users to customize the functionality of their installation while still being able to benefit from regular software updates.
Pluginurile permit utilizatorilor să personalizeze funcționalitatea instalării lor, putând, în același timp, să beneficieze de actualizări regulate de software.


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.
Această documentație este destinată dezvoltatorilor care extind LimeSurvey pentru uz propriu sau pentru clienții lor; utilizatorii finali nu vor fi ajutați de această documentație.


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.  
Pluginurile trebuie să implementeze interfața [https://github.com/LimeSurvey/LimeSurvey/blob/master/application/libraries/PluginManager/iPlugin.php iPlugin]. Vă recomandăm să vă extindeți clasa de plugin din clasa [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.
<div class="mw-translate-fuzzy">
Pluginurile sunt dezvoltate în jurul unui mecanism [https://manual.limesurvey.org/Plugin_events event].
</div>


== Plugin settings ==
<span id="Plugin_settings"></span>
== Setări 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.
Prin extindere, beneficiați de funcționalitatea comună cerută de pluginurile pe care le-am implementat deja pentru dvs. Una dintre aceste funcții este implementarea funcției getPluginSettings. Această funcție trebuie să returneze o matrice care descrie opțiunile de configurare pentru utilizator.


The example plugin exposes just 1 configurable setting, the message it'll show.
Exemplul de plugin expune doar 1 setare configurabilă, mesajul pe care îl va afișa.


<syntaxhighlight lang="php">
<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' => 'șir',
          'label' => 'Message'
'label' => 'Mesaj'
     )
)
);
);
</syntaxhighlight>
</syntaxhighlight>


The array contains a name for each setting as a key. The values are arrays containing the required meta data.
Matricea conține un nume pentru fiecare setare ca cheie. Valorile sunt matrice care conțin metadatele necesare.


Supported types are:
Tipurile acceptate sunt:


* logo
* logo
* int (integer number)
* int (număr întreg)
* string (alphanumeric)
* șir (alfanumeric)
* text
* text
* html
* html
* relevance
* relevanță
* info
* info
* password
* parolă
* date
* dată
* select
* selectați


Besides type a number of other keys are available:
Pe lângă tip, sunt disponibile o serie de alte chei:


* label, defines a label
* etichetă, definește o etichetă
* default, defines a value to show if no value is specified (only for global settings, not for survey settings)
* implicită, definește o valoare care să arate dacă nu este specificată nicio valoare (doar pentru setările globale, nu pentru setările sondajului)
* current, defines the current value.
* curent, definește valoarea curentă.
* readOnly : shown the settings as readonly
* readOnly : setările sunt afișate ca doar în citire
* htmlOptions, the htmlOptions of the input part ( see Yii manual [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* htmlOptions, htmlOptions ale părții de intrare (vezi manualul Yii [[https://www.yiiframework.com/doc/api/1.1/CHtml]])
* pluginOptions, for some settings (html or select) : set the widget option
* pluginOptions, pentru unele setări (html sau select) : setați opțiunea widget
* labelOptions : htmlOptions of the label
* labelOptions : htmlOpțiuni ale etichetei
* controlOptions : htmlOptions of the wrapper of label and input
* controlOptions : htmlOpțiuni ale pachetului de etichete și de intrare


You can find a plugin example using all actual settings at [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
Puteți găsi un exemplu de plugin folosind toate setările reale la [https://gitlab.com/SondagesPro/SampleAndDemo/exampleSettings exampleSettings]  
=== Read and write plugin settings ===
=== Citiți și scrieți setările pluginului ===


It's possible to read and write plugin settings directly from your plugin code.
Este posibil să citiți și să scrieți setările pluginului direct din codul dvs. de plugin.


Example:
Exemplu:


<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:
Puteți obține o valoare implicită dacă setarea se întâmplă să fie nulă:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$mySetting = $this->get('mySetting', null, null, 10); // 10 is default
$mySetting = $this->get('mySetting', null, null, 10); // 10 este implicit
</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>
== Evenimente ==
 
Pluginurile se abonează la evenimente și pot interacționa cu LimeSurvey atunci când evenimentul este declanșat. Pentru o listă a evenimentelor disponibile în prezent, verificați [[Evenimente 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.
Pluginurile ar trebui să extindă LimeSurvey numai prin intermediul API-ului său „public”. Aceasta înseamnă că utilizarea directă a claselor găsite în codul sursă este o practică proastă. Deși nu vă putem forța să nu o faceți, riști să ai un plugin rupt cu fiecare actualizare minoră pe care o facem.


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.
Pe cât posibil, interacționați cu LimeSurvey numai prin metodele descrise [http://api.limesurvey.org/classes/LimeSurvey.PluginManager.LimesurveyApi.html aici]. La fel ca pentru evenimente.


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.
Obiectul API este disponibil prin <code>$this->api</code> atunci când se extinde din PluginBase, altfel îl puteți obține de la instanța PluginManager care este transmisă constructorului pluginurilor dumneavoastră.


New functions can be added to the API object upon request.
La cerere, pot fi adăugate noi funcții la obiectul API.


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


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


The form extension system is a more general way to extend forms in core LimeSurvey without adding a new event for each form.
Sistemul de extensie a formularelor este o modalitate mai generală de a extinde formularele din LimeSurvey de bază fără a adăuga un nou eveniment pentru fiecare formular.


It consists of the following components:
Se compune din următoarele componente:


* A global module called '''FormExtensionService'''
* Un modul global numit '''FormExtensionService'''
* A library of '''input classes''' that plugins can add to above module initialization
* O bibliotecă de '''clase de intrare''' pe care pluginurile le pot adăuga la inițializarea modulului de mai sus
* A '''widget''', together with custom renderers, that are used in the LimeSurvey view files
* Un '''widget''', împreună cu randare personalizate, care sunt utilizate în fișierele de vizualizare LimeSurvey


Each form is identified by a '''position string''', like <form name><dot><tab name>. Example: <code>globalsettings.general</code> or <code>globalsettings.security</code>.
Fiecare formular este identificat printr-un „șir de poziție”, cum ar fi<form name><dot><tab name> . Exemplu: <code>globalsettings.general</code> sau <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.
Ideea din spatele unui sistem bazat pe clasă fără HTML este de a elibera autorii pluginurilor lucrării pentru a actualiza HTML-ul atunci când HTML-ul de bază se schimbă. Totuși, autorul poate folosi tipul <code>RawHtmlInput</code> dacă este necesar.


One thing you cannot do in this system is to add ''new form tabs''.
Un lucru pe care nu îl puteți face în acest sistem este să adăugați „file noi de formulare”.


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


To add a new input to a form from a plugin, use the following code from your <code>init()</code> function:
Pentru a adăuga o nouă intrare la un formular dintr-un plugin, utilizați următorul cod din funcția <code>init()</code> :


TODO: Save in plugin settings instead of global
TODO: Salvați în setările pluginului în loc de global


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
// At top of file
// În partea de sus a fișierului
use LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
utilizați LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
use LimeSurvey\Libraries\FormExtension\SaveFailedException;
utilizați LimeSurvey\Libraries\FormExtension\SaveFailedException;


// Inside init()
// În interiorul init()
Yii::app()->formExtensionService->add(
Yii::app()->formExtensionService->add(
    'globalsettings.general',
'globalsettings.general',
    new TextInput([
new TextInput([
        'name' => 'myinput',
'name' => 'myinput',  
        'label' => 'Label',
'label' => 'Etichetă',
        'disabled' => true,
'disabled' => adevărat,
        'tooltip' => 'Moo moo moo',
'tooltip' => 'Moo moo moo',
        'help' => 'Some help text',
'help' => 'Un text de ajutor',  
        'save' => function($request, $connection) {
„salvare” => funcție($cerere, $conexiune) {
            $value = $request->getPost('myinput');
$valoare = $cerere->getPost('inputul meu');
            if ($value === 'some invalid value') {
dacă ($valoare === 'o valoare nevalidă') {
                throw new SaveFailedException("Could not save custom input 'myinput'");
throw new SaveFailedException("Nu s-a putut salva intrarea personalizată 'myinput'");
            } else {
} altfel {
                SettingGlobal::setSetting('myinput', $value);
SettingGlobal::setSetting('myinput', $value);
            }
}
        },
} ,
        'load' => function () {
'încărcare' => funcție () {
            return getGlobalSetting('myinput');
return getGlobalSetting('myinput');
        }
}
    ])
])
);
);
</syntaxhighlight>
</syntaxhighlight>


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


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.
Validarea intrării se face în funcția <code>save</code> (vezi exemplul de mai sus). Dacă valoarea postată este nevalidă, aruncați o <code>SaveFailedException</code> și utilizatorului va fi afișat un mesaj flash de avertizare.


=== Supported forms ===
<span id="Supported_forms"></span>
=== Forme acceptate ===


The following forms can be extended:
Următoarele forme pot fi extinse:


* 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:
Dacă doriți să adăugați suport pentru un alt formular de bază, trebuie să aplicați următoarea modificare într-o cerere de extragere:


In the view file, add:
În fișierul de vizualizare, adăugați:


<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
... mai mult HTML
<?= FormExtensionWidget::render(
<?= FormExtensionWidget::render(
     App()->formExtensionService->getAll('globalsettings.security'),
     App()-> formExtensionService->getAll('globalsettings.security'),
    new DefaultBaseRenderer()
nou 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.
Este posibil să trebuiască să creați o nouă clasă de redare bazată pe <code>DefaultBaseRenderer</code> , dacă formularul HTML este diferit de alte forme. De asemenea, ar putea fi necesar să extindeți clasa de redare implicită cu tipuri de intrare care nu sunt încă adăugate.


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:
A doua modificare pe care trebuie să o faceți este să adăugați un apel la clasa de serviciu de extensie de formular în acțiunea controlerului care salvează formularul:


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


That's it!
Asta este!


== Localization {{NewIn|v=3}} ==
<span id="Localization_{{NewIn|v=3}}"></span>
== Localizare {{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
Este posibil ca pluginurile să adauge propriile fișiere locale. Formatul de fișier utilizat este .mo, la fel ca și traducerile de bază. Fișierele trebuie să fie stocate în


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


where "<language>" is a two letter word like "de" or "fr".
Unde "<language> „ este un cuvânt de două litere precum „de” sau „fr”.


To use the specific locale file, use the plugin function gT:
Pentru a utiliza fișierul local specific, utilizați funcția plugin gT:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("A plugin text that needs to be translated");
$this->gT(„Un text plugin care trebuie tradus”);
</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":
Dacă șirul dat nu poate fi găsit în fișierul local specific pluginului, funcția va căuta în fișierele locale de bază. Deci, este sigur să folosiți șiruri precum „Anulare”:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->gT("Cancel"); // Will be translated even if "Cancel" is not in the plugin locale file
$this->gT(„Anulează”); // Va fi tradus chiar dacă „Anulare” nu se află în fișierul local al pluginului
</syntaxhighlight>
</syntaxhighlight>


If you are using views together with your plugin, you should use
Dacă utilizați vizualizări împreună cu pluginul dvs., ar trebui să utilizați


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$plugin->gT("Translate me");
$plugin->gT(„Traduceți-mă”);
</syntaxhighlight>
</syntaxhighlight>


to do plugin specific translation in your view.
pentru a face traducere specifică pentru plugin în viziunea dvs.


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.
Puteți utiliza fișierul [https://github.com/LimeSurvey/LimeSurvey/blob/master/locale/_template/limesurvey.pot limesurvey.pot] ca exemplu despre cum poate arăta un fișier pot. Acesta este importat în instrumentul dvs. de traducere.


=== Tools ===
<span id="Tools"></span>
=== Instrumente ===


One open-source tool to edit po- and mo-files is [https://poedit.net/ Poedit].
Un instrument open-source pentru editarea fișierelor po și mo este [https://poedit.net/ Poedit].


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


If you want to log something from your plugin, just write
Dacă doriți să conectați ceva din pluginul dvs., scrieți


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Your message");
$this->log(„Mesajul tău”);
</syntaxhighlight>
</syntaxhighlight>


The default logging level is trace, but you can give another log level as an optional second argument:
Nivelul implicit de înregistrare este urmă, dar puteți da un alt nivel de jurnal ca al doilea argument opțional:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
$this->log("Something went wrong!", CLogger::LEVEL_ERROR);
$this->log(„Ceva a mers prost!, CLogger::LEVEL_ERROR);
</syntaxhighlight>
</syntaxhighlight>


The log file can be found in folder
Fișierul jurnal poate fi găsit în folder


  <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):
Numele dvs. de plugin este folosit automat ca categorie. Un mod frumos de a vedea numai erorile de la plugin-ul tău este folosirea grep (pe 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]].
Mai multe informații despre configurarea logării în Yii 1: [[Optional_settings#Logging_settings]].


== Extension updates {{NewIn|v=4}} ==
<span id="Extension_updates_{{NewIn|v=4}}"></span>
== Actualizări de extensie {{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.
De la versiunea LimeSurvey 4.0.0, există un sistem care să se ocupe de actualizări de plugin și alte extensii. Pentru a utiliza acest sistem, fișierul dvs. de extensie config.xml trebuie să includă configurația de actualizare.


<syntaxhighlight lang="xml">
<syntaxhighlight lang="xml">
<updaters>
<updaters>  
    <updater>
<updater>  
        <stable>1</stable>
<stable> 1</stable>  
        <type>rest</type>
<type> odihnă</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.)
(Eticheta sursă de mai sus indică API-ul REST LimeStore, care va fi folosit pentru toate extensiile disponibile în LimeStore.)


{| class="wikitable"
{| class="wikitable"
|+ Updater tag descriptions
|+ Descrierile etichetelor de actualizare
|-
|-
! Tag
! Eticheta
! Description
! Descriere
|-
|-
| 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” dacă această sursă vă oferă doar numere de versiune stabile; „0” dacă sursa va furniza și versiuni instabile, cum ar fi <code>0.3.3-beta</code> .
|-
|-
| type
| tip
| For now, only type <code>rest</code> is supported. It's easy to add new updater types (version checkers), like git, wget, etc.
| Deocamdată, este acceptat doar tipul <code>rest</code> . Este ușor să adăugați noi tipuri de actualizare (verificatoare de versiuni), cum ar fi git, wget etc.
|-
|-
| source
| sursa
| The URL to fetch new versions from.
| Adresa URL pentru a prelua versiunile noi de la.
|-
|-
| manualUpdateUrl  
| manualUpdateUrl  
| URL which the user can go to to update the latest version of the extension.
| URL la care utilizatorul poate accesa pentru a actualiza cea mai recentă versiune a extensiei.
|-
|-
| automaticUpdateUrl
| automatUpdateUrl
| TODO
| TODO
|}
|}


If you don't want to supply an updater, you should put the following text in your config XML file:
Dacă nu doriți să furnizați un program de actualizare, ar trebui să puneți următorul text în fișierul XML de configurare:


<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.
În acest fel, îi spuneți sistemului că ați dezactivat în mod intenționat sistemul de actualizare și că nu ați uitat să îl adăugați.


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.
Noul plugin '''UpdateCheck''' - instalat și activat implicit - verifică dacă există noi actualizări pentru ''toate'' extensiile instalate atunci când un super-administrator se conectează, asincron, maximum o dată la fiecare 24 de ore. Dacă se găsesc versiuni noi, este trimisă o notificare.


[[File:availableupdates.png||Available updates]]
[[File:availableupdates.png||Actualizări disponibile]]


If a new security update is found, the notification will open automatically and be styled in "danger" class.
Dacă se găsește o nouă actualizare de securitate, notificarea se va deschide automat și va fi stilată în clasa „pericol”.


[[File:availablesecurityupdates.png||Available security updates]]
[[File:availablesecurityupdates.png||Actualizări de securitate disponibile]]


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.
Puteți verifica manual actualizările accesând vizualizarea managerului de pluginuri și faceți clic pe „Verificați actualizările”. Rețineți că acest buton este vizibil numai dacă pluginul UpdateCheck este activat.


[[File:manuallycheckforupdates.png||Manually check for updates]]
[[File:manuallycheckforupdates.png||Verificați manual pentru actualizări]]


=== Under the hood ===
<span id="Under_the_hood"></span>
=== Sub capotă ===


This section provides a brief overview over the extension updater implementation.
Această secțiune oferă o scurtă prezentare generală asupra implementării programului de actualizare a extensiilor.


The extension updater is part of the ExtensionInstaller library. Below is a UML diagram for the classes related to the updater process.
Actualizatorul extensiei face parte din biblioteca ExtensionInstaller. Mai jos este o diagramă UML pentru clasele legate de procesul de actualizare.


[[File:extensionupdateruml.png||Extension updater UML diagram]]
[[File:extensionupdateruml.png||Diagrama UML pentru actualizarea extensiilor]]


Program flow when Yii starts:
Fluxul programului când pornește Yii:


<pre>
<pre>
  Yii init
  Yii init
  VersionFetcherServiceLocator->init()
VersionFetcherServiceLocator->init()
    Add REST version fetcher
Adăugați un element de preluare a versiunii REST
  ExtensionUpdaterServiceLocator->init()
ExtensionUpdaterServiceLocator->init()
    Add PluginUpdater
Adăugați PluginUpdater
    TODO: Add an updater for each extension type (theme, question template, ...)
TODO: Adăugați un update pentru fiecare tip de extensie (temă, șablon de întrebare, ...)
</pre>
</pre>


Program flow when running the UpdaterCheck plugin:
Fluxul programului când rulați pluginul UpdaterCheck:


<pre>
<pre>
  Get all updaters from ExtensionUpdaterServiceLocator
  Obțineți toate actualizările de la ExtensionUpdaterServiceLocator
  Loop each updater
  Buclă fiecare actualizare
  For each updater, loop through version fetchers configured by <updater> XML
Pentru fiecare program de actualizare, parcurgeți versiunile de preluare a versiunilor configurate de<updater> XML
    For each version fetcher, contact remote source and get version information
Pentru fiecare preluare de versiuni, contactați sursa de la distanță și obțineți informații despre versiune
  Compose all versions into a notification
  Compune toate versiunile într-o notificare
</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.
Metoda [https://github.com/LimeSurvey/LimeSurvey/blob/develop/application/core/plugins/UpdateCheck/UpdateCheck.php#L130 checkAll] din pluginul UpdateCheck oferă un exemplu de interogare a tuturor extensiilor pentru versiuni noi.


==== Adding new version fetchers ====
<span id="Adding_new_version_fetchers"></span>
==== Adăugarea unor noi versiuni de preluare ====


To add a new custom version fetcher, run this during Yii initialization:
Pentru a adăuga o nouă versiune personalizată de preluare, rulați aceasta în timpul inițializării Yii:


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


Of course, the class <code>MyNewVersionFetcher</code> has to subclass <code>VersionFetcher</code>.
Desigur, clasa <code>MyNewVersionFetcher</code> trebuie să fie subclasa <code>VersionFetcher</code> .


To use your new version fetcher, configure the <code>type</code> tag in the updater XML to use
Pentru a utiliza noua versiune de preluare, configurați eticheta <code>type</code> în XML-ul de actualizare pentru a utiliza
<code>myNewVersionFetcherType</code> (instead of e.g. <code>rest</code>).
<code>myNewVersionFetcherType</code> (în loc de ex. <code>rest</code> ).


==== Adding new extension updaters ====
<span id="Adding_new_extension_updaters"></span>
==== Adăugarea de noi actualizări de extensii ====


To add a new custom extension updater, run this during Yii initialization:
Pentru a adăuga un nou program de actualizare a extensiilor personalizate, rulați acest lucru în timpul inițializării Yii:


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


Class <code>MyNewExtensionUpdater</code> has to subclass <code>ExtensionUpdater</code>.
Clasa <code>MyNewExtensionUpdater</code> trebuie să fie subclasa <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.
Eticheta <code>type</code> superior din config.xml („plugin”, „temă”, ...) va controla ce program de actualizare a extensiilor este utilizat pentru această extensie. Sistemul nu este încă complet personalizabil, deoarece trebuie să adăugați și un ExtensionInstaller personalizat, elemente de meniu etc. Dar, în teorie, și poate în viitor, ar trebui să fie posibil să adăugați un nou tip de extensie în acest fel.


== Extension installer ==
<span id="Extension_installer"></span>
== Instalator extensie ==


The extension installer library consists of two abstract classes:
Biblioteca de instalare a extensiilor constă din două clase abstracte:


* ExtensionInstaller
* ExtensionInstaller
* FileFetcher
* FileFetcher


The ExtensionInstaller is subclassed for each extension type, like PluginInstaller, QuestionThemeInstaller, etc.
ExtensionInstaller este subclasat pentru fiecare tip de extensie, cum ar fi 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.
FileFetcher este subclasat pentru fiecare modalitate diferită de a prelua fișiere. În prezent, sunt acceptate doar fișierele zip încărcate, dar în viitor, ar putea exista și un program de preluare Github sau LimeStore.


[[File: extensioninstalleruml.png]]
[[Fișier: extensioninstalleruml.png]]


== Special plugins ==
<span id="Special_plugins"></span>
== Pluginuri speciale ==


* [[Authentication plugin development]]
* [[Dezvoltare plugin de autentificare]]
* [[Export plugin development]]
* [[Dezvoltare plugin pentru export]]


== Available plugins ==
<div class="mw-translate-fuzzy">
* [[Authentication plugins]]
== Pluginuri disponibile ==
* [[Audit log]]
* [[Plugin-uri de autentificare]]
* [[Jurnal de audit]]
* [[CintLink]]
* [[CintLink]]
* [[Available third party plugins]]
* [[Pluginuri terțe disponibile]]
</div>


== Tutorial ==
== Tutorial ==
[https://medium.com/@evently/creating-limesurvey-plugins-adcdf8d7e334 This] step-by-step tutorial shows how to create a plugin that sends a post request on every survey response submission. The tutorial shows you how to create and save global and per-survey settings, how to register events and more.
[https://medium.com/@evently/creating-limesurvey-plugins-adcdf8d7e334 Acest] tutorial pas cu pas arată cum să creați un plugin care trimite o solicitare de postare la fiecare răspuns la sondaj supunere. Tutorialul vă arată cum să creați și să salvați setări globale și per sondaj, cum să înregistrați evenimente și multe altele.


[[Category:Development]]
[[Category:Development]]
[[Category:Plugins]]
[[Category:Plugins]]

Latest revision as of 16:30, 12 August 2025

Prezentare generală

Începând cu LimeSurvey 2.05, LimeSurvey va accepta oficial plugin-uri. Unele plugin-uri vor fi susținute de echipa LimeSurvey și vor intra în core. Unii vor fi sprijiniți de alții din afara echipei LimeSurvey. Pentru a le găsi, consultați Pluginurile terțe disponibile și adăugați-i propriul plugin!

Pluginurile permit utilizatorilor să personalizeze funcționalitatea instalării lor, putând, în același timp, să beneficieze de actualizări regulate de software.

Această documentație este destinată dezvoltatorilor care extind LimeSurvey pentru uz propriu sau pentru clienții lor; utilizatorii finali nu vor fi ajutați de această documentație.

Pluginurile trebuie să implementeze interfața iPlugin. Vă recomandăm să vă extindeți clasa de plugin din clasa PluginBase.

Pluginurile sunt dezvoltate în jurul unui mecanism event.

Setări plugin

Prin extindere, beneficiați de funcționalitatea comună cerută de pluginurile pe care le-am implementat deja pentru dvs. Una dintre aceste funcții este implementarea funcției getPluginSettings. Această funcție trebuie să returneze o matrice care descrie opțiunile de configurare pentru utilizator.

Exemplul de plugin expune doar 1 setare configurabilă, mesajul pe care îl va afișa.

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

'message' => array(
 'type' => 'șir',
 'label' => 'Mesaj'
 )
);

Matricea conține un nume pentru fiecare setare ca cheie. Valorile sunt matrice care conțin metadatele necesare.

Tipurile acceptate sunt:

  • logo
  • int (număr întreg)
  • șir (alfanumeric)
  • text
  • html
  • relevanță
  • info
  • parolă
  • dată
  • selectați

Pe lângă tip, sunt disponibile o serie de alte chei:

  • etichetă, definește o etichetă
  • implicită, definește o valoare care să arate dacă nu este specificată nicio valoare (doar pentru setările globale, nu pentru setările sondajului)
  • curent, definește valoarea curentă.
  • readOnly : setările sunt afișate ca doar în citire
  • htmlOptions, htmlOptions ale părții de intrare (vezi manualul Yii [[1]])
  • pluginOptions, pentru unele setări (html sau select) : setați opțiunea widget
  • labelOptions : htmlOpțiuni ale etichetei
  • controlOptions : htmlOpțiuni ale pachetului de etichete și de intrare

Puteți găsi un exemplu de plugin folosind toate setările reale la exampleSettings

Citiți și scrieți setările pluginului

Este posibil să citiți și să scrieți setările pluginului direct din codul dvs. de plugin.

Exemplu:

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

Puteți obține o valoare implicită dacă setarea se întâmplă să fie nulă:

$mySetting = $this->get('mySetting', null, null, 10); // 10 este implicit

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

Evenimente

Pluginurile se abonează la evenimente și pot interacționa cu LimeSurvey atunci când evenimentul este declanșat. Pentru o listă a evenimentelor disponibile în prezent, verificați Evenimente plugin.

API

Pluginurile ar trebui să extindă LimeSurvey numai prin intermediul API-ului său „public”. Aceasta înseamnă că utilizarea directă a claselor găsite în codul sursă este o practică proastă. Deși nu vă putem forța să nu o faceți, riști să ai un plugin rupt cu fiecare actualizare minoră pe care o facem.

Pe cât posibil, interacționați cu LimeSurvey numai prin metodele descrise aici. La fel ca pentru evenimente.

Obiectul API este disponibil prin $this->api atunci când se extinde din PluginBase, altfel îl puteți obține de la instanța PluginManager care este transmisă constructorului pluginurilor dumneavoastră.

La cerere, pot fi adăugate noi funcții la obiectul API.

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

Extensie formular (New in 6 )

Introducere

Sistemul de extensie a formularelor este o modalitate mai generală de a extinde formularele din LimeSurvey de bază fără a adăuga un nou eveniment pentru fiecare formular.

Se compune din următoarele componente:

  • Un modul global numit FormExtensionService
  • O bibliotecă de clase de intrare pe care pluginurile le pot adăuga la inițializarea modulului de mai sus
  • Un widget, împreună cu randare personalizate, care sunt utilizate în fișierele de vizualizare LimeSurvey

Fiecare formular este identificat printr-un „șir de poziție”, cum ar fi<form name><dot><tab name> . Exemplu: globalsettings.general sau globalsettings.security .

Ideea din spatele unui sistem bazat pe clasă fără HTML este de a elibera autorii pluginurilor lucrării pentru a actualiza HTML-ul atunci când HTML-ul de bază se schimbă. Totuși, autorul poate folosi tipul RawHtmlInput dacă este necesar.

Un lucru pe care nu îl puteți face în acest sistem este să adăugați „file noi de formulare”.

Exemplu

Pentru a adăuga o nouă intrare la un formular dintr-un plugin, utilizați următorul cod din funcția init() :

TODO: Salvați în setările pluginului în loc de global

// În partea de sus a fișierului
utilizați LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
utilizați LimeSurvey\Libraries\FormExtension\SaveFailedException;

// În interiorul init()
Yii::app()->formExtensionService->add(
 'globalsettings.general',
 new TextInput([
 'name' => 'myinput', 
 'label' => 'Etichetă',
 'disabled' => adevărat,
 'tooltip' => 'Moo moo moo',
 'help' => 'Un text de ajutor', 
 „salvare” => funcție($cerere, $conexiune) {
 $valoare = $cerere->getPost('inputul meu');
 dacă ($valoare === 'o valoare nevalidă') {
 throw new SaveFailedException("Nu s-a putut salva intrarea personalizată 'myinput'");
 } altfel {
 SettingGlobal::setSetting('myinput', $value);
 }
 } ,
 'încărcare' => funcție () {
 return getGlobalSetting('myinput');
 }
 ])
);

Validare

Validarea intrării se face în funcția save (vezi exemplul de mai sus). Dacă valoarea postată este nevalidă, aruncați o SaveFailedException și utilizatorului va fi afișat un mesaj flash de avertizare.

Forme acceptate

Următoarele forme pot fi extinse:

  • globalsettings.general (New in 6.0.0 )

Dacă doriți să adăugați suport pentru un alt formular de bază, trebuie să aplicați următoarea modificare într-o cerere de extragere:

În fișierul de vizualizare, adăugați:

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

Este posibil să trebuiască să creați o nouă clasă de redare bazată pe DefaultBaseRenderer , dacă formularul HTML este diferit de alte forme. De asemenea, ar putea fi necesar să extindeți clasa de redare implicită cu tipuri de intrare care nu sunt încă adăugate.

A doua modificare pe care trebuie să o faceți este să adăugați un apel la clasa de serviciu de extensie de formular în acțiunea controlerului care salvează formularul:

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

Asta este!

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

Localizare (New in 3 )

Este posibil ca pluginurile să adauge propriile fișiere locale. Formatul de fișier utilizat este .mo, la fel ca și traducerile de bază. Fișierele trebuie să fie stocate în

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

Unde "<language> „ este un cuvânt de două litere precum „de” sau „fr”.

Pentru a utiliza fișierul local specific, utilizați funcția plugin gT:

$this->gT(„Un text plugin care trebuie tradus”);

Dacă șirul dat nu poate fi găsit în fișierul local specific pluginului, funcția va căuta în fișierele locale de bază. Deci, este sigur să folosiți șiruri precum „Anulare”:

$this->gT(„Anulează”); // Va fi tradus chiar dacă „Anulare” nu se află în fișierul local al pluginului

Dacă utilizați vizualizări împreună cu pluginul dvs., ar trebui să utilizați

$plugin->gT(„Traduceți-mă”);

pentru a face traducere specifică pentru plugin în viziunea dvs.

Puteți utiliza fișierul limesurvey.pot ca exemplu despre cum poate arăta un fișier pot. Acesta este importat în instrumentul dvs. de traducere.

Instrumente

Un instrument open-source pentru editarea fișierelor po și mo este Poedit.

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

Înregistrare (New in 3 )

Dacă doriți să conectați ceva din pluginul dvs., scrieți

$this->log(„Mesajul tău”);

Nivelul implicit de înregistrare este urmă, dar puteți da un alt nivel de jurnal ca al doilea argument opțional:

$this->log(„Ceva a mers prost!, CLogger::LEVEL_ERROR);

Fișierul jurnal poate fi găsit în folder

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

Numele dvs. de plugin este folosit automat ca categorie. Un mod frumos de a vedea numai erorile de la plugin-ul tău este folosirea grep (pe 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
                )

Mai multe informații despre configurarea logării în Yii 1: Optional_settings#Logging_settings.

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

Actualizări de extensie (New in 4 )

De la versiunea LimeSurvey 4.0.0, există un sistem care să se ocupe de actualizări de plugin și alte extensii. Pentru a utiliza acest sistem, fișierul dvs. de extensie config.xml trebuie să includă configurația de actualizare.

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

(Eticheta sursă de mai sus indică API-ul REST LimeStore, care va fi folosit pentru toate extensiile disponibile în LimeStore.)

Descrierile etichetelor de actualizare
Eticheta Descriere
stabil „1” dacă această sursă vă oferă doar numere de versiune stabile; „0” dacă sursa va furniza și versiuni instabile, cum ar fi 0.3.3-beta .
tip Deocamdată, este acceptat doar tipul rest . Este ușor să adăugați noi tipuri de actualizare (verificatoare de versiuni), cum ar fi git, wget etc.
sursa Adresa URL pentru a prelua versiunile noi de la.
manualUpdateUrl URL la care utilizatorul poate accesa pentru a actualiza cea mai recentă versiune a extensiei.
automatUpdateUrl TODO

Dacă nu doriți să furnizați un program de actualizare, ar trebui să puneți următorul text în fișierul XML de configurare:

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

În acest fel, îi spuneți sistemului că ați dezactivat în mod intenționat sistemul de actualizare și că nu ați uitat să îl adăugați.

Noul plugin UpdateCheck - instalat și activat implicit - verifică dacă există noi actualizări pentru toate extensiile instalate atunci când un super-administrator se conectează, asincron, maximum o dată la fiecare 24 de ore. Dacă se găsesc versiuni noi, este trimisă o notificare.

Actualizări disponibile

Dacă se găsește o nouă actualizare de securitate, notificarea se va deschide automat și va fi stilată în clasa „pericol”.

Actualizări de securitate disponibile

Puteți verifica manual actualizările accesând vizualizarea managerului de pluginuri și faceți clic pe „Verificați actualizările”. Rețineți că acest buton este vizibil numai dacă pluginul UpdateCheck este activat.

Verificați manual pentru actualizări

Sub capotă

Această secțiune oferă o scurtă prezentare generală asupra implementării programului de actualizare a extensiilor.

Actualizatorul extensiei face parte din biblioteca ExtensionInstaller. Mai jos este o diagramă UML pentru clasele legate de procesul de actualizare.

Diagrama UML pentru actualizarea extensiilor

Fluxul programului când pornește Yii:

 Yii init
 VersionFetcherServiceLocator->init()
 Adăugați un element de preluare a versiunii REST
 ExtensionUpdaterServiceLocator->init()
 Adăugați PluginUpdater
 TODO: Adăugați un update pentru fiecare tip de extensie (temă, șablon de întrebare, ...)

Fluxul programului când rulați pluginul UpdaterCheck:

 Obțineți toate actualizările de la ExtensionUpdaterServiceLocator
 Buclă fiecare actualizare
 Pentru fiecare program de actualizare, parcurgeți versiunile de preluare a versiunilor configurate de<updater> XML
 Pentru fiecare preluare de versiuni, contactați sursa de la distanță și obțineți informații despre versiune
 Compune toate versiunile într-o notificare

Metoda checkAll din pluginul UpdateCheck oferă un exemplu de interogare a tuturor extensiilor pentru versiuni noi.

Adăugarea unor noi versiuni de preluare

Pentru a adăuga o nouă versiune personalizată de preluare, rulați aceasta în timpul inițializării Yii:

$service = \Yii::app()->versionFetcherServiceLocator
$service->addVersionFetcherType(
 'myNewVersionFetcherType',
 funcţie (\SimpleXMLElement $updaterXml) {
 returnează nou MyNewVersionFetcher( $updaterXml);
 }
);

Desigur, clasa MyNewVersionFetcher trebuie să fie subclasa VersionFetcher .

Pentru a utiliza noua versiune de preluare, configurați eticheta type în XML-ul de actualizare pentru a utiliza

myNewVersionFetcherType (în loc de ex. rest ).

Adăugarea de noi actualizări de extensii

Pentru a adăuga un nou program de actualizare a extensiilor personalizate, rulați acest lucru în timpul inițializării Yii:

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

Clasa MyNewExtensionUpdater trebuie să fie subclasa ExtensionUpdater .

Eticheta type superior din config.xml („plugin”, „temă”, ...) va controla ce program de actualizare a extensiilor este utilizat pentru această extensie. Sistemul nu este încă complet personalizabil, deoarece trebuie să adăugați și un ExtensionInstaller personalizat, elemente de meniu etc. Dar, în teorie, și poate în viitor, ar trebui să fie posibil să adăugați un nou tip de extensie în acest fel.

Instalator extensie

Biblioteca de instalare a extensiilor constă din două clase abstracte:

  • ExtensionInstaller
  • FileFetcher

ExtensionInstaller este subclasat pentru fiecare tip de extensie, cum ar fi PluginInstaller, QuestionThemeInstaller etc.

FileFetcher este subclasat pentru fiecare modalitate diferită de a prelua fișiere. În prezent, sunt acceptate doar fișierele zip încărcate, dar în viitor, ar putea exista și un program de preluare Github sau LimeStore.

Fișier: extensioninstalleruml.png

Pluginuri speciale

Tutorial

Acest tutorial pas cu pas arată cum să creați un plugin care trimite o solicitare de postare la fiecare răspuns la sondaj supunere. Tutorialul vă arată cum să creați și să salvați setări globale și per sondaj, cum să înregistrați evenimente și multe altele.