x

Bab utama

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Panduan permulaan pantas - LimeSurvey 3.0+
  3. Pemasangan - LimeSurvey CE
  4. Cara mereka bentuk tinjauan yang baik (panduan)
  5. Bermula
  6. Mentadbir LimeSurvey
  7. Tinjauan - pengenalan
  8. Tetapan tinjauan
  9. Menu tinjauan
  10. Struktur tinjauan
  11. Soalan - pengenalan
  12. Kumpulan soalan - pengenalan
  13. Tinjauan - pengurusan
  14. Pilihan bar alat tinjauan
  15. Tinjauan berbilang bahasa
  16. Enjin ExpressionScript - Panduan mula pantas
  17. Ciri tidak dikategorikan dan ciri lanjutan
  18. Soalan Lazim Umum
  19. Penyelesaian Masalah
  20. Penyelesaian sementara
  21. Lesen
  22. Tukar log versi
  23. Pemalam
 Actions

Pemalam

From LimeSurvey Manual

Halaman ini mungkin telah diterjemahkan oleh mesin dan mungkin mengandungi ralat. Papar teks asal bahasa Inggeris · Perbaiki terjemahan ini
This page is a translated version of the page Plugins and the translation is 100% complete.

Gambaran keseluruhan

LimeSurvey mempunyai keupayaan untuk menambah fungsi melalui pemalam. LimeSurvey sudah dilengkapi dengan sejumlah besar pemalam teras. Selain itu, lihat juga senarai pemalam pihak ketiga kami dan mungkin pada masa hadapan anda boleh menambah pemalam anda sendiri ke dalamnya!

Pemalam membolehkan pengguna menyesuaikan fungsi pemasangan mereka sambil terus mendapat manfaat daripada kemas kini perisian yang tetap.

Dokumentasi ini ditujukan kepada pembangun yang memperluas LimeSurvey untuk kegunaan sendiri atau untuk pelanggan mereka; pengguna akhir tidak akan terbantu dengan dokumentasi ini.

Pemalam mesti melaksanakan antara muka iPlugin. Kami mengesyorkan agar kelas pemalam anda diperluas daripada kelas PluginBase.

Pemalam dibangunkan berdasarkan mekanisme peristiwa.

Tetapan pemalam

Dengan memperluas kelas tersebut, anda mendapat manfaat daripada fungsi biasa yang diperlukan oleh pemalam yang telah kami laksanakan untuk anda. Salah satu fungsi tersebut ialah pelaksanaan fungsi getPluginSettings. Fungsi ini mesti mengembalikan tatasusunan yang menerangkan pilihan konfigurasi untuk pengguna.

Pemalam contoh hanya mendedahkan 1 tetapan yang boleh dikonfigurasi, iaitu mesej yang akan dipaparkan.

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

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

Tatasusunan ini mengandungi nama bagi setiap tetapan sebagai kunci. Nilainya ialah tatasusunan yang mengandungi metadata yang diperlukan.

Jenis yang disokong ialah:

  • logo
  • int (nombor integer)
  • string (abjad angka)
  • text
  • html
  • relevance
  • info
  • password
  • date
  • select

Selain type, beberapa kunci lain turut tersedia:

  • label, menentukan label
  • default, menentukan nilai yang dipaparkan jika tiada nilai ditetapkan (hanya untuk tetapan global, bukan untuk tetapan tinjauan)
  • current, menentukan nilai semasa.
  • readOnly : memaparkan tetapan sebagai baca sahaja
  • htmlOptions, htmlOptions bagi bahagian input ( lihat manual Yii [[1]])
  • pluginOptions, untuk sesetengah tetapan (html atau select) : menetapkan pilihan widget
  • labelOptions : htmlOptions bagi label
  • controlOptions : htmlOptions bagi pembungkus label dan input
  • localized : jika true, nilai disimpan mengikut bahasa. Input dihantar sebagai name[language] dan current mestilah tatasusunan yang diindeks mengikut kod bahasa.
  • language : digunakan bersama localized. Sama ada satu kod bahasa, atau (New in X.Y.Z ) tatasusunan kod bahasa untuk memaparkan satu input bagi setiap bahasa (lihat Tetapan pemalam setempat)

Anda boleh mendapati contoh pemalam yang menggunakan semua tetapan sebenar di exampleSettings

Membaca dan menulis tetapan pemalam

Anda boleh membaca dan menulis tetapan pemalam terus daripada kod pemalam anda.

Contoh:

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

Anda boleh mendapatkan nilai lalai jika tetapan tersebut kebetulan bernilai null:

$mySetting = $this->get('mySetting', null, null, 10);  // 10 is default

Tetapan pemalam khusus tinjauan

Dua peristiwa digunakan untuk mencipta tetapan pemalam khusus tinjauan:

  • newSurveySettings
  • beforeSurveySettings

Contoh untuk menyahaktifkan pemalam bagi tinjauan tertentu:

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

<span id="Localized_plugin_settings_ (New in 7.4 )">

Tetapan pemalam setempat (New in 7.4 )

Untuk memaparkan satu input bagi setiap bahasa tinjauan untuk tetapan yang sama, tetapkan localized kepada true dan berikan senarai bahasa dalam language. Nama bahasa akan ditambah pada label setiap input.

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

        $event->set(
            "surveysettings.{$this->id}",
            [
                'name' => get_class($this),
                'settings' => [
                    'errorText' => [
                        'type' => 'text',
                        'label' => $this->gT('Error text'),
                        'localized' => true,
                        'language' => $survey->getAllLanguages(),
                        // Tatasusunan diindeks mengikut kod bahasa, cth. ['en' => '...', 'de' => '...']
                        'current' => $this->get('errorText', 'Survey', $surveyId, []),
                    ],
                ]
            ]
        );
    }

Nilai yang dihantar ialah tatasusunan yang diindeks mengikut kod bahasa, jadi fungsi newSurveySettings daripada contoh di atas menyimpannya tanpa sebarang perubahan. Untuk membaca teks bagi bahasa semasa:

$errorTexts = $this->get('errorText', 'Survey', $surveyId, []);
$errorText = $errorTexts[App()->getLanguage()] ?? '';

Peristiwa

Pemalam melanggan peristiwa dan boleh berinteraksi dengan LimeSurvey apabila peristiwa tersebut dicetuskan. Untuk senarai peristiwa yang tersedia pada masa ini, rujuk Peristiwa pemalam.

API

Pemalam hanya boleh memperluas LimeSurvey melalui API "awam"nya. Ini bermakna menggunakan kelas yang terdapat dalam kod sumber secara terus ialah amalan yang kurang baik. Walaupun kami tidak boleh menghalang anda, anda berisiko mempunyai pemalam yang rosak pada setiap kemas kini kecil yang kami lakukan.

Sebanyak mungkin, berinteraksilah dengan LimeSurvey hanya melalui kaedah yang diterangkan di sini. Perkara yang sama berlaku untuk peristiwa.

Objek API boleh diakses melalui $this->api apabila memperluas daripada PluginBase. Jika tidak, anda boleh mendapatkannya daripada instans PluginManager yang dihantar kepada konstruktor pemalam anda.

Fungsi baharu boleh ditambah pada objek API atas permintaan.

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

Pelanjutan borang (New in 6 )

Pengenalan

Sistem pelanjutan borang ialah cara yang lebih umum untuk memperluas borang dalam teras LimeSurvey tanpa menambah peristiwa baharu bagi setiap borang.

Ia terdiri daripada komponen berikut:

  • Modul global bernama FormExtensionService
  • Pustaka kelas input yang boleh ditambah oleh pemalam pada permulaan modul di atas
  • Satu widget, bersama perender tersuai, yang digunakan dalam fail paparan LimeSurvey

Setiap borang dikenal pasti dengan rentetan kedudukan, seperti <form name><dot><tab name>. Contoh: globalsettings.general atau globalsettings.security.

Tujuan sistem berasaskan kelas tanpa HTML ialah untuk membebaskan pengarang pemalam daripada kerja mengemas kini HTML apabila HTML teras berubah. Namun, pengarang boleh menggunakan jenis RawHtmlInput jika perlu.

Satu perkara yang tidak boleh dilakukan dalam sistem ini ialah menambah tab borang baharu.

Contoh

Untuk menambah input baharu pada borang daripada pemalam, gunakan kod berikut daripada fungsi init() anda:

TODO: Simpan dalam tetapan pemalam dan bukannya global

// At top of file
use LimeSurvey\Libraries\FormExtension\Inputs\TextInput;
use LimeSurvey\Libraries\FormExtension\SaveFailedException;

// Inside init()
Yii::app()->formExtensionService->add(
    'globalsettings.general',
    new TextInput([
        'name' => 'myinput',
        'label' => 'Label',
        'disabled' => true,
        'tooltip' => 'Moo moo moo',
        'help' => 'Some help text',
        'save' => function($request, $connection) {
            $value = $request->getPost('myinput');
            if ($value === 'some invalid value') {
                throw new SaveFailedException("Could not save custom input 'myinput'");
            } else {
                SettingGlobal::setSetting('myinput', $value);
            }
        },
        'load' => function () {
            return getGlobalSetting('myinput');
        }
    ])
);

Pengesahan

Pengesahan input dilakukan dalam fungsi save (lihat contoh di atas). Jika nilai yang dihantar tidak sah, lemparkan SaveFailedException, dan mesej kilat amaran akan dipaparkan kepada pengguna.

Borang yang disokong

Borang berikut boleh dilanjutkan:

  • globalsettings.general (New in 6.0.0 )

Jika anda ingin menambah sokongan untuk borang teras yang lain, anda perlu menggunakan perubahan berikut dalam pull-request:

Dalam fail paparan, tambahkan:

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

Anda mungkin perlu mencipta kelas renderer baharu berdasarkan DefaultBaseRenderer, jika HTML borang berbeza daripada borang lain. Anda juga mungkin perlu memperluas kelas renderer lalai dengan jenis input yang belum ditambah.

Perubahan kedua yang perlu anda lakukan ialah menambah panggilan kepada kelas perkhidmatan sambungan borang dalam tindakan pengawal yang menyimpan borang tersebut:

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

Itu sahaja!

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

Penyetempatan (New in 3 )

Pemalam boleh menambah fail locale mereka sendiri. Format fail yang digunakan ialah .mo, sama seperti terjemahan teras. Fail tersebut mesti disimpan dalam

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

di mana "<language>" ialah perkataan dua huruf seperti "de" atau "fr".

Untuk menggunakan fail locale tertentu, gunakan fungsi pemalam gT:

$this->gT("A plugin text that needs to be translated");

Jika rentetan yang diberikan tidak ditemui dalam fail locale khusus pemalam, fungsi ini akan mencarinya dalam fail locale teras. Jadi, selamat untuk menggunakan rentetan seperti "Batal":

$this->gT("Cancel");  // Will be translated even if "Cancel" is not in the plugin locale file

Jika anda menggunakan paparan bersama pemalam anda, anda hendaklah menggunakan

$plugin->gT("Translate me");

untuk melakukan terjemahan khusus pemalam dalam paparan anda.

Anda boleh menggunakan fail limesurvey.pot sebagai contoh rupa fail pot. Fail ini diimport ke dalam alat terjemahan anda.

Alat

Satu alat sumber terbuka untuk mengedit fail po dan mo ialah Poedit.

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

Pengelogan (New in 3 )

Jika anda ingin merekodkan sesuatu daripada pemalam anda, cukup tulis

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

Tahap pengelogan lalai ialah trace, tetapi anda boleh memberikan tahap log lain sebagai argumen kedua pilihan:

$this->log("Something went wrong!", CLogger::LEVEL_ERROR);

Fail log boleh ditemui dalam folder

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

Nama pemalam anda digunakan secara automatik sebagai kategori. Cara yang baik untuk melihat ralat daripada pemalam anda sahaja ialah menggunakan grep (pada Linux):

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

<span id="Logging_plugin_deactivation_due_to_error_ (New in 6.13.3 )">

Pengelogan penyahaktifan pemalam disebabkan ralat (New in 6.13.3 )

Sejak LimeSurvey versi 5: pemalam boleh dinyahaktifkan secara automatik sekiranya berlaku ralat PHP.

E-mel dihantar secara automatik kepada pentadbir LimeSurvey. Anda boleh menggunakan sistem log untuk menjana amaran kepada pentadbir pelayan yang lain.

Contohnya: untuk menghantar mesej amaran

                // 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
                )

Maklumat lanjut tentang mengkonfigurasi pengelogan dalam Yii 1: Tetapan pengelogan.

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

Kemas kini sambungan (New in 4 )

Sejak LimeSurvey versi 4.0.0, terdapat sistem untuk mengendalikan kemas kini pemalam dan sambungan lain. Untuk menggunakan sistem ini, fail config.xml sambungan anda perlu menyertakan konfigurasi pengemas kini.

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

(Teg sumber di atas menunjuk kepada API REST LimeStore, yang akan digunakan untuk semua sambungan yang terdapat dalam LimeStore kami.)

Keterangan teg updater
Teg Keterangan
stable "1" jika sumber ini hanya memberikan nombor versi stabil; "0" jika sumber ini turut menyediakan versi tidak stabil, seperti 0.3.3-beta.
type Buat masa ini, hanya jenis rest disokong. Jenis updater baharu (penyemak versi) mudah ditambah, seperti git, wget dan sebagainya.
source URL untuk mendapatkan versi baharu.
manualUpdateUrl URL yang boleh dilawati oleh pengguna untuk mengemas kini sambungan kepada versi terkini.
automaticUpdateUrl TODO

Jika anda tidak mahu menyediakan updater, anda perlu meletakkan teks berikut dalam fail XML konfigurasi anda:

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

Dengan cara ini, anda memaklumkan kepada sistem bahawa anda sengaja menyahdayakan sistem kemas kini, dan bukan sekadar terlupa menambahnya.

Pemalam baharu UpdateCheck - dipasang dan diaktifkan secara lalai - menyemak kemas kini baharu untuk semua sambungan yang dipasang apabila pentadbir super log masuk, secara tak segerak, maksimum sekali setiap 24 jam. Jika sebarang versi baharu ditemui, satu pemberitahuan dihantar.

Kemas kini tersedia

Jika Kemas kini keselamatan baharu ditemui, pemberitahuan akan dibuka secara automatik dan digayakan dalam kelas "danger".

Kemas kini keselamatan tersedia

Anda boleh menyemak kemas kini secara manual dengan pergi ke paparan pengurus pemalam dan klik "Check updates". Perhatikan bahawa butang ini hanya kelihatan jika pemalam UpdateCheck diaktifkan.

Semak kemas kini secara manual

Di sebalik tabir

Bahagian ini memberikan gambaran ringkas tentang pelaksanaan updater sambungan.

Updater sambungan merupakan sebahagian daripada pustaka ExtensionInstaller. Di bawah ialah gambar rajah UML bagi kelas yang berkaitan dengan proses updater.

Gambar rajah UML updater sambungan

Aliran program apabila Yii bermula:

 Yii init
   VersionFetcherServiceLocator->init()
     Add REST version fetcher
   ExtensionUpdaterServiceLocator->init()
     Add PluginUpdater
     TODO: Add an updater for each extension type (theme, question template, ...)

Aliran program apabila pemalam UpdaterCheck dijalankan:

 Get all updaters from ExtensionUpdaterServiceLocator
 Loop each updater
   For each updater, loop through version fetchers configured by <updater> XML
     For each version fetcher, contact remote source and get version information
 Compose all versions into a notification

Kaedah checkAll dalam pemalam UpdateCheck memberikan contoh cara membuat pertanyaan kepada semua sambungan untuk versi baharu.

Menambah pengambil versi baharu

Untuk menambah pengambil versi tersuai yang baharu, jalankan kod ini semasa permulaan Yii:

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

Sudah tentu, kelas MyNewVersionFetcher mesti mewarisi VersionFetcher.

Untuk menggunakan pengambil versi baharu anda, konfigurasikan teg type dalam XML updater supaya menggunakan myNewVersionFetcherType (dan bukannya contohnya rest).

Menambah updater sambungan baharu

Untuk menambah updater sambungan tersuai yang baharu, jalankan kod ini semasa permulaan Yii:

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

Kelas MyNewExtensionUpdater mesti mewarisi ExtensionUpdater.

Teg type peringkat atas dalam config.xml ('plugin', 'theme', ...) akan mengawal updater sambungan yang digunakan untuk sambungan ini. Sistem ini belum boleh disesuaikan sepenuhnya, kerana anda juga perlu menambah ExtensionInstaller tersuai, item menu dan sebagainya. Namun secara teori, dan mungkin pada masa hadapan, jenis sambungan baharu boleh ditambah dengan cara ini.

Pemasang sambungan

Pustaka pemasang sambungan terdiri daripada dua kelas abstrak:

  • ExtensionInstaller
  • FileFetcher

ExtensionInstaller diwarisi untuk setiap jenis sambungan, seperti PluginInstaller, QuestionThemeInstaller dan sebagainya.

FileFetcher diwarisi untuk setiap cara berbeza untuk mendapatkan fail. Buat masa ini, hanya fail zip yang dimuat naik disokong, tetapi pada masa hadapan, mungkin terdapat pengambil Github atau LimeStore juga.

Tutorial

Tutorial langkah demi langkah ini menunjukkan cara mencipta pemalam yang menghantar permintaan post pada setiap penyerahan jawapan tinjauan. Tutorial ini menunjukkan cara mencipta dan menyimpan tetapan global dan tetapan bagi setiap tinjauan, cara mendaftarkan peristiwa dan banyak lagi.