Expression Manager
From LimeSurvey Manual
Tutorial Mulai Cepat
Ikhtisar
Saat menyesuaikan survei Anda, biasanya Anda memerlukan cara untuk menentukan hal-hal berikut:
- Navigasi/Percabangan - membiarkan jawaban responden mengubah urutan pertanyaan yang diajukan
- Penyesuaian/Piping - cara menyusun kalimat pertanyaan (seperti merujuk pada jawaban sebelumnya, atau menyesuaikan kalimat berdasarkan jumlah atau jenis kelamin responden Anda), atau cara membuat laporan khusus (seperti skor penilaian atau saran yang disesuaikan).
- Validasi - memastikan bahwa jawaban memenuhi kriteria tertentu, seperti nilai minimum dan maksimum, atau sesuai dengan pola masukan
Expression Manager (EM) menyediakan cara yang intuitif untuk menentukan logika bagi setiap fitur tersebut. Hampir semua hal yang dapat Anda tulis sebagai persamaan matematika standar adalah ekspresi yang valid, bahkan jika Anda memanggil fungsi. Saat ini EM menyediakan akses ke 80 fungsi, dan dapat dengan mudah diperluas untuk mendukung lebih banyak lagi. EM juga memungkinkan Anda mengakses variabel menggunakan nama variabel yang mudah dibaca (bukan nama SGQA).
Bagian-bagian berikut menunjukkan tempat-tempat utama penggunaan Expression Manager
Beberapa survei menggunakan "Logika Goto", sehingga jika Anda menjawab Pertanyaan 1 dengan opsi C, maka lompat ke Pertanyaan 5. Pendekatan ini sangat membatasi, karena sulit divalidasi dan mudah rusak ketika Anda harus mengubah urutan pertanyaan. EM menggunakan persamaan relevansi Boolean untuk menentukan semua kondisi di mana sebuah pertanyaan dianggap valid. Jika pertanyaan relevan, maka pertanyaan ditampilkan, jika tidak maka pertanyaan Tidak Berlaku, dan nilai NULL disimpan di basis data. Ini mirip dengan apa yang dapat dilakukan melalui editor Kondisi, tetapi EM memungkinkan Anda menentukan kriteria yang jauh lebih kompleks dan canggih dengan mudah (dan memungkinkan Anda menggunakan nama variabel, bukan penamaan SGQA).
Gambar ini menunjukkan salah satu cara untuk meninjau logika relevansi sebuah survei. Survei ini menghitung Indeks Massa Tubuh. Persamaan relevansi ditampilkan dalam tanda kurung siku tepat setelah nama variabel (yang berwarna hijau). Jadi, relevansi weight, weight_units, height, dan height_units semuanya bernilai 1, artinya pertanyaan-pertanyaan tersebut selalu diajukan. Namun, relevansi untuk BMI adalah {!is_empty(height) and !is_empty(weight)}, yang berarti BMI hanya akan dihitung jika responden memasukkan nilai untuk height dan weight (sehingga menghindari risiko kesalahan pembagian dengan nol). Selain itu, pertanyaan Report hanya ditampilkan jika responden menjawab keempat pertanyaan utama (height, height_units, weight, weight_units).
Relevansi ditampilkan dan dapat diedit di tempat-tempat berikut:
Melihat / Mengedit Relevansi Tingkat Pertanyaan
Persamaan ini menghitung Indeks Massa Tubuh (BMI). Pertanyaan ini hanya diajukan jika orang tersebut terlebih dahulu memasukkan tinggi dan berat badannya.
Ini adalah layar edit untuk pertanyaan BMI.
Perhatikan bahwa Anda tidak menggunakan kurung kurawal saat memasukkan Persamaan yang berhubungan.
Melihat / Mengedit Relevansi Tingkat Grup
Ini adalah contoh survei sensus. Halaman pertama menanyakan berapa banyak orang yang tinggal bersama Anda dan menyimpannya dalam variabel "cohabs". Halaman ini hanya ditampilkan jika Anda memiliki lebih dari satu orang yang tinggal bersama (sehingga ditampilkan untuk orang kedua yang tinggal bersama Anda), dan juga hanya ditampilkan jika Anda menentukan hubungan Orang Pertama dengan Anda (p1_rel).
Seperti yang dapat Anda lihat, grup juga memiliki kriteria relevansi tingkat pertanyaan, sehingga setiap pertanyaan hanya muncul setelah Anda menjawab pertanyaan sebelumnya (misalnya {!is_empty(p1_sex)}). EM menggabungkan relevansi tingkat Grup dan Pertanyaan untuk Anda. Pertanyaan dalam sebuah grup hanya diajukan jika grup secara keseluruhan relevan. Kemudian, hanya subset pertanyaan dalam grup yang relevan yang diajukan.
Berikut adalah layar untuk mengedit relevansi tingkat grup untuk pertanyaan tersebut:
Perhatikan bahwa Anda tidak menggunakan kurung kurawal saat memasukkan Persamaan yang berhubungan.
Penyesuaian/Piping
EM memungkinkan Anda dengan mudah melakukan penyesuaian bersyarat yang sederhana maupun kompleks pada pertanyaan Anda. Terkadang Anda hanya memerlukan substitusi sederhana, seperti mengatakan, "Anda mengatakan bahwa Anda membeli [Produk]. Apa yang paling Anda sukai dari produk tersebut?". Terkadang Anda memerlukan substitusi bersyarat seperti "[Bapak/Ibu] [NamaBelakang], apakah Anda bersedia mengisi survei kami?". Dalam kasus ini, Anda ingin menggunakan Bapak atau Ibu berdasarkan jenis kelamin orang tersebut. Di lain waktu Anda memerlukan substitusi yang lebih kompleks lagi (seperti berdasarkan perhitungan matematika). EM mendukung semua jenis penyesuaian/piping ini.
Persamaan Bersyarat
Contoh Indeks Massa Tubuh menunjukkan kemampuan untuk menghitung BMI seseorang, bahkan ketika mereka dibiarkan memasukkan tinggi dan berat badan dalam satuan metrik atau non-metrik.
Di sini weight_kg adalah {if(weight_units == 'kg', weight, weight * .453592)}. Fungsi if() ini berarti jika responden memasukkan berat badan dalam kilogram, gunakan nilai tersebut. Jika tidak, kalikan nilai yang dimasukkan (yang dalam pon) dengan .453592 untuk mengonversinya ke kilogram. Variabel height_m menggunakan pendekatan serupa untuk menghitung tinggi badan dalam meter, meskipun tinggi badan dimasukkan dalam inci.
BMI menghitung rumus berat badan sebagai {weight_kg / (height_m * height_m)}.
Terakhir, laporan menyesuaikan pesan untuk responden secara bersyarat, dengan menyebutkan apa yang telah dimasukkannya. ("Anda mengatakan tinggi Anda 2 meter dan berat badan Anda 70 kg.")
Meskipun tidak terlihat jelas pada gambar di atas, weight_status menggunakan pernyataan if() bersarang untuk mengategorikan seseorang dari berat badan kurang hingga obesitas berat. Anda dapat melihat persamaannya di Show Logic View
Dari jendela edit pertanyaan ini, Anda dapat melihat dua hal:
- Penyesuaian (tailoring) harus mengapit ekspresi dengan kurung kurawal
- Ekspresi dapat terdiri dari beberapa baris jika, seperti dalam kasus ini, Anda ingin mempermudah pembacaan logika bersyarat yang bersarang.
Pertanyaan, Jawaban, dan Laporan yang Disesuaikan
Contoh ini menunjukkan laporan BMI.
Berikut adalah jendela edit untuk pertanyaan yang sama.
Seperti yang Anda lihat, apa pun di dalam kurung kurawal diperlakukan sebagai ekspresi, sehingga diberi penyorotan sintaks (kode warna) pada gambar sebelumnya. Jika ada kesalahan ketik (seperti nama variabel atau fungsi yang salah eja atau tidak terdefinisi), EM akan menampilkan kesalahan, seperti ini, yang menunjukkan bahwa height_unit adalah nama variabel yang tidak didefinisikan (seharusnya height_units), dan rnd() adalah fungsi yang tidak terdefinisikan (nama fungsi yang benar adalah round()). Pada kedua kasus, kesalahan dikelilingi kotak merah agar lebih mudah ditemukan dan diperbaiki.
Anda juga dapat melihat bahwa Anda dapat dengan cepat membuat laporan yang kompleks, seperti tabel nilai yang dimasukkan atau saran yang disesuaikan.
Ingat bahwa semua penyesuaian harus mengapit ekspresi dengan kurung kurawal, agar LimeSurvey mengetahui bagian mana dari pertanyaan yang merupakan teks bebas dan bagian mana yang harus diproses oleh Expression Manager.
Validasi
EM mengontrol cara kerja sebagian besar opsi pertanyaan lanjutan. Opsi ini mengatur aspek seperti jumlah jawaban minimum/maksimum; nilai individual minimum/maksimum; nilai jumlah minimum/maksimum; dan pemeriksaan apakah nilai yang dimasukkan cocok dengan pola string tertentu. Anda tetap memasukkan opsi pertanyaan lanjutan tersebut seperti biasa. Namun, sekarang setiap nilai pada kolom tersebut dianggap sebagai ekspresi, sehingga Anda dapat membuat kriteria minimum/maksimum dengan hubungan bersyarat yang kompleks terhadap pertanyaan lain.
Dalam semua kasus ini, karena opsi pertanyaan lanjutan selalu dianggap sebagai ekspresi, Anda tidak menggunakan kurung kurawal saat menuliskannya.
Halaman Contoh Survei menampilkan banyak contoh penggunaan ekspresi untuk validasi yang dapat langsung dipakai.
Pendahuluan
LimeSurvey menggunakan modul Expression Manager (EM) yang baru, yang memungkinkan LimeSurvey mendukung percabangan, penilaian, validasi, dan penyesuaian yang lebih kompleks. Modul ini akan menggantikan cara LimeSurvey mengelola Replacements, Conditions, dan Assessments di back-end. Modul ini juga akan mempercepat pemrosesan secara signifikan karena menghilangkan sebagian besar pembacaan basis data saat runtime. EM dikembangkan oleh Dr. Thomas White (TMSWhite).
Halaman wiki ini adalah referensi utama untuk sintaks dan fungsionalitas Expression Manager.
Definisi Utama
- Ekspresi: Apa pun yang diapit kurung kurawal
- Selama tidak ada spasi tepat setelah kurung buka atau sebelum kurung kurawal tutup
- Isi ekspresi dievaluasi oleh EM, sehingga dapat berisi rumus matematika, fungsi, serta pemrosesan string dan tanggal yang kompleks.
- Penyesuaian (Tailoring): Kadang disebut "piping", yaitu proses memodifikasi teks secara bersyarat
- Anda memiliki akses ke semua 'kolom pengganti', data peserta, dan data tanggapan.
- Anda juga memiliki akses yang lebih mudah ke pertanyaan, jawaban, dan propertinya.
- Persamaan yang berhubungan: Atribut pertanyaan baru yang mengontrol visibilitas pertanyaan
- Jika ada persamaan yang berhubungan, maka pertanyaan hanya ditampilkan jika relevansi bernilai benar.
- Secara internal, semua perintah array_filter dan array_filter_exclude menjadi relevansi tingkat subpertanyaan
- Persamaan Jenis Pertanyaan: Jenis pertanyaan baru yang menyimpan perhitungan atau laporan ke basis data
- Mirip dengan pertanyaan Boilerplate, tetapi isinya disimpan ke basis data meskipun Anda menetapkan "Selalu sembunyikan pertanyaan ini"
- Kode pertanyaan: Ini adalah nama variabel yang disarankan untuk EM
- Kode ini dapat berupa nama deskriptif yang menunjukkan tujuan pertanyaan, sehingga logika yang kompleks lebih mudah dibaca
- Kode pertanyaan yang valid TIDAK boleh diawali angka, jadi saat menggunakan kode pertanyaan untuk menomori pertanyaan, cukup gunakan "q1", atau "q1a" atau "g1q2".
- Kode ini saat ini menjadi nama variabel jika Anda mengekspor data ke SPSS atau R, jadi jika Anda melakukan analisis statistik, kemungkinan Anda sudah membuatnya unik.
Apakah saya harus menggunakan EM?
Jawaban singkatnya adalah Tidak (tetapi juga Ya).
EM sepenuhnya kompatibel dengan survei yang sudah ada. Jadi, jika Anda puas menggunakan Conditions dan Assessments dengan gaya yang digunakan LimeSurvey pada versi <= 1.91+, Anda dapat terus menggunakannya.
Namun, EM sepenuhnya menggantikan cara LimeSurvey menangani Conditions secara internal. Meskipun Anda masih dapat menggunakan Conditions Editor untuk membuat dan mengelola kondisi, LimeSurvey 1.92 akan mengonversinya menjadi persamaan yang berhubungan yang setara. Sebagai bagian dari pembaruan, LimeSurvey 1.92 akan mengonversi otomatis semua Conditions yang ada menjadi persamaan yang berhubungan.
Ini akan memberi Anda yang terbaik dari kedua dunia - Anda dapat terus menggunakan LimeSurvey seperti biasa, tetapi akan melihat persamaan yang berhubungan yang setara sehingga Anda dapat beralih secara bertahap ke persamaan yang berhubungan secara langsung kapan pun Anda mau.
Bisakah saya menggabungkan penggunaan Kondisi dan Relevansi?
Ya. Anda dapat menggunakan editor Kondisi untuk beberapa pertanyaan dan editor Relevansi untuk pertanyaan lainnya. Kondisi akan dikonversi otomatis menjadi Relevansi saat Anda menyimpan pertanyaan.
Perlu diperhatikan, kami berasumsi bahwa jika Anda menggunakan editor Kondisi, Anda ingin Kondisi tersebut menimpa persamaan Relevansi yang dimasukkan secara manual. Jadi, jika Anda memiliki Kondisi dan ingin mengedit Relevansi secara manual, hapus dahulu Kondisi untuk pertanyaan tersebut. Secara spesifik, salin persamaan relevansi yang dihasilkan ke editor teks, gunakan menu Kondisi untuk menghapus semua kondisi untuk pertanyaan tersebut (yang juga akan menghapus relevansinya), lalu edit pertanyaan dan tempelkan persamaan relevansi yang dihasilkan dari editor teks kembali ke kolom relevansi untuk pertanyaan tersebut (lalu simpan pertanyaan). Jika ada cukup banyak permintaan untuk menghapus kondisi tanpa menghapus persamaan relevansi yang dihasilkan, kami dapat menambahkan proses konversi massal.
Bagaimana saya memilih antara Kondisi dan Relevansi?
Berikut daftar kelebihan dan kekurangan dari masing-masing gaya:
| Gaya | Kelebihan | Kekurangan |
|---|---|---|
| Kondisi | 1. GUI yang bagus untuk membuat kondisi sederhana 2. GUI terdokumentasi dengan baik dan dipahami oleh tim dukungan |
1. Hanya mendukung perbandingan sederhana dan kurang baik dalam kondisi AND/OR 2. Kondisi berjenjang bekerja secara tidak menentu 3. Lambat - intensif terhadap basis data, sehingga dapat memperlambat survei yang panjang 4. Ada beberapa masalah yang dilaporkan saat memuat ulang kondisi 5. GUI tidak cocok untuk puluhan, ratusan, atau ribuan pertanyaan 6. Bisa lambat untuk mengonversi survei berbasis kertas karena harus menggunakan nama SGQA 7. Sering memerlukan programmer untuk membuat kode logika khusus bagi percabangan yang kompleks |
| Relevansi | 1. Mendukung logika yang sangat kompleks, termasuk 80+ fungsi dan operator matematika/string 2. Dukungan sempurna untuk logika berjenjang 3. Cepat - tanpa panggilan basis data tambahan, sehingga mendukung survei dengan 1000+ pertanyaan 4. Tidak ada masalah saat memuat ulang logika karena tidak memerlukan kode SGQA 5. Penyorotan sintaks dapat digunakan untuk survei dengan 1000+ pertanyaan 6. Mudah dan cepat digunakan oleh kelompok yang ingin mengomputerisasi survei berbasis kertas yang sudah ada. 7. Mendukung wawancara semi-terstruktur dan survei epidemiologi dengan mudah tanpa memerlukan programmer |
1. Tidak ada GUI untuk kondisi sederhana - gunakan penyorotan sintaks sebagai gantinya 2. Baru, sehingga tim dukungan belum menguasai EM. |
Intinya, jika Anda sudah puas dengan cara kerja LimeSurvey 1.91+, tidak ada alasan untuk mengubah apa yang Anda lakukan.
Apa saja manfaat lain dari penggunaan EM?
Berikut beberapa alasan lain mengapa Anda mungkin ingin menggunakan EM.
- Perhitungan - Anda dapat membuat perhitungan apa pun yang terpikirkan:
- Anda memiliki akses ke semua operator dan fungsi matematika umum
- Anda memiliki akses ke 70+ fungsi pemrosesan matematika, tanggal, dan string
- Pengembang cukup mudah menambahkan fungsi baru jika pengguna membutuhkannya
- Menyimpan Perhitungan ke Basis Data
- Sekarang Anda dapat menghitung perhitungan sederhana maupun kompleks dan/atau skor skala DAN menyimpannya di basis data tanpa memerlukan JavaScript.
- Anda menggunakan jenis pertanyaan Persamaan untuk melakukannya.
- Penilaian
- Sekarang Anda dapat membuat penilaian atau skor skala dari jenis pertanyaan apa pun, tidak hanya sebagian kecil yang sebelumnya didukung
- Anda dapat menggunakan Tailoring untuk menampilkan skor penilaian berjalan atau total di mana pun diperlukan - bahkan di halaman yang sama
- Anda memiliki kontrol lebih besar atas laporan yang dihasilkan berdasarkan skor penilaian tersebut
- Anda dapat menyimpan skor penilaian di basis data tanpa memerlukan JavaScript
- Anda dapat menyembunyikan skor penilaian tanpa memerlukan JavaScript atau CSS
- Bidang Pengganti
- Gunakan Kode pertanyaan untuk menyisipkan nilai dari jawaban pertanyaan sebelumnya - ini membuatnya lebih mudah dibaca dan divalidasi.
- Tailoring - Anda dapat menampilkan teks secara bersyarat berdasarkan nilai lain
- Gunakan sebutan yang sesuai untuk subjek, misalnya (mis. "Halo [Bapak/Ibu] Smith")
- Hasilkan kalimat yang benar secara tata bahasa ketika bentuk tunggal/jamak berpengaruh: (mis. "Anda memiliki 1 anak" vs. "Anda memiliki 2 anak")
- Konjugasikan kata kerja dan tentukan bentuk kata benda secara tepat berdasarkan jenis kelamin dan jumlah subjek.
- Atribut Variabel Baru - Anda dapat mengakses hal berikut untuk melakukan tailoring:
- (tanpa sufiks) - alias untuk qcode.code
- .code - kode tanggapan yang dipilih untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode
- .NAOK - sama seperti .code, tetapi dapat menjadi bagian dari perhitungan atau daftar meskipun tidak relevan
- .value - nilai penilaian untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode -- tersedia jika penilaian diaktifkan untuk survei, jika tidak selalu nol
- .valueNAOK - sama seperti .value, tetapi dapat menjadi bagian dari perhitungan atau daftar meskipun tidak relevan
- .shown - jawaban sebagaimana ditampilkan kepada pengguna
- .qid - ID pertanyaan
- .gid - ID grup
- .sgqa - nilai SGQA untuk pertanyaan
- .jsName - nama variabel javascript yang benar untuk pertanyaan, terlepas dari apakah didefinisikan di halaman ini atau halaman lain
- .qseq - urutan pertanyaan (dimulai dari 0)
- .gseq - urutan grup (dimulai dari 0)
- .mandatory - apakah pertanyaan wajib (Y/N)
- .question - teks pertanyaan
- .relevance - persamaan yang berhubungan untuk pertanyaan
- .grelevance - persamaan yang berhubungan untuk grup
- .relevanceStatus - apakah pertanyaan saat ini relevan atau tidak (boolean (bisa berbeda di PHP dan JS))
- .type - jenis pertanyaan (kode satu karakter)
- Perubahan Dinamis di Halaman
- Semua Relevansi, Perhitungan, dan Tailoring bekerja secara dinamis di halaman - sehingga perubahan nilai langsung memperbarui halaman
- Jadi, pertanyaan muncul/hilang secara dinamis berdasarkan apakah pertanyaan tersebut relevan
- Pertanyaan juga disesuaikan secara dinamis berdasarkan tanggapan di halaman, sehingga Anda dapat melihat total berjalan, kalimat yang disesuaikan, dan laporan khusus.
- Layar Entri Data Baru
- Selain menggunakan sistem entri data saat ini, Anda dapat menggunakan Survey-All-In-One.
- Ini mendukung relevansi dan tailoring di halaman, sehingga petugas entri data dapat berpindah dengan cepat dan hanya perlu memasukkan tanggapan yang relevan
- Ini bisa sangat penting jika petugas entri data Anda perlu melihat tailoring, yang juga dinamis.
- Menghilangkan kebutuhan akan sebagian besar JavaScript khusus
- EM mendukung dengan mudah perhitungan yang rumit, penilaian skor, tailoring, dan logika bersyarat.
- Beberapa hal masih memerlukan JavaScript (seperti tata letak khusus dan penyembunyian sub-elemen pertanyaan secara bersyarat), tetapi JavaScript Anda dapat menggunakan fungsi EM sehingga Anda dapat mengakses pertanyaan melalui Qcode alih-alih SGQA, dan mengakses properti pertanyaan mana pun yang tercantum di atas.
Apa saja fitur baru bermanfaat lainnya yang diaktifkan oleh EM?
Terlepas dari apakah Anda tetap menggunakan Editor Kondisi atau menyusun Persamaan yang Berhubungan secara manual, Anda mendapatkan manfaat tambahan berikut:
- Anda dapat membuat kriteria validasi yang lebih kompleks
- Semua atribut pertanyaan lanjutan (seperti max_answers, min_num_value_n, max_num_value) dapat menggunakan ekspresi. Jadi, kriteria minimum/maksimum Anda dapat dengan mudah disesuaikan berdasarkan tanggapan sebelumnya, bahkan jika berada di halaman yang sama.
- EM juga menangani semua validasi berbasis ekspresi reguler, sehingga Anda dapat menggabungkan atribut pertanyaan berbasis preg dan berbasis persamaan secara andal.
- Pengurutan ulang (atau penghapusan) Pertanyaan dan Grup dengan mudah
- Sebelum versi 1.92, Anda tidak dapat mengurutkan ulang pertanyaan atau grup jika LimeSurvey menganggap pengurutan ulang tersebut dapat merusak kondisi yang menggunakannya. Demikian pula, Anda tidak dapat menghapus pertanyaan jika ada pertanyaan lain yang bergantung padanya.
- Dengan penyorotan sintaks EM, mudah untuk melihat dan memvalidasi apakah Anda mencoba menggunakan pertanyaan sebelum dideklarasikan. Jadi, kini Anda dapat mengurutkan ulang atau menghapus pertanyaan dan grup kapan pun Anda mau. EM akan memperbarui semua penyorotan sintaks untuk menunjukkan potensi kesalahan.
- Tampilan urutkan ulang pertanyaan telah ditingkatkan untuk membantu peninjauan tersebut. Kini tampilan ini menunjukkan persamaan relevansi dan tailoring pertanyaan, sehingga Anda langsung dapat melihat apakah ada variabel yang berubah menjadi merah muda (artinya digunakan sebelum dideklarasikan).
- Indeks Navigasi Pertanyaan/Grup selalu tersedia dan akurat
- Sebelum versi 1.92, indeks ini tidak tersedia jika ada kondisi yang kompleks
- Dengan EM, kami dapat menjamin bahwa indeks ini akurat.
- Responden bahkan dapat kembali ke pertanyaan sebelumnya, mengubah jawaban, lalu maju kembali (atau mengirim)
- Saat maju, EM akan memvalidasi ulang semua pertanyaan/grup di antaranya.
- Jika ada pertanyaan yang menjadi tidak relevan, nilainya akan diubah menjadi NULL di database agar data Anda konsisten secara internal
- Jika ada pertanyaan yang menjadi relevan atau baru gagal memenuhi aturan wajib atau validasi, EM akan berhenti di halaman tersebut dan meminta pengguna menjawab pertanyaan itu sebelum melompat ke tujuan akhirnya.
- Konversi otomatis Kondisi menjadi Relevansi
- Saat Anda meningkatkan versi database, semua survei yang sudah ada dan memiliki kondisi akan dibuatkan persamaan relevansi
- Setiap kali Anda mengimpor survei, persamaan relevansi akan dibuat sesuai kebutuhan
- Setiap kali Anda menambahkan, menghapus, atau mengubah kondisi, EM akan membuat persamaan relevansi yang sesuai.
- Penyorotan Sintaks yang Praktis
- Saat EM menampilkan persamaan relevansi, EM akan menampilkan Qcode, bahkan jika Anda memasukkan kode SGQA, karena kami menganggap hal ini lebih mudah dibaca.
- Semua variabel diberi kode warna untuk menunjukkan apakah variabel dideklarasikan sebelum atau sesudah pertanyaan saat ini (atau sebelum atau sesudah grup saat ini). Ini memungkinkan Anda dengan cepat mendeteksi dan memperbaiki kasus ketika Anda mencoba menggunakan variabel untuk relevansi (termasuk array_filter), tailoring, atau persamaan validasi sebelum dideklarasikan.
- Selain itu, jika Anda mengarahkan mouse ke variabel berkode warna tersebut, Anda akan melihat metadata terpenting tentang pertanyaan itu. Ini mencakup # Urutan Grup, # Urutan Pertanyaan, Qcode, Teks pertanyaan, dan semua pilihan jawaban yang tersedia (jika jenis pertanyaannya memiliki pilihan jawaban yang terenumerasi).
- Daftar pilihan jawaban menggunakan sintaks ini: 'answers':{key:val, ... }.
- key memiliki sintaks 'scale~code' dengan scale adalah skala jawaban (misalnya untuk skala ganda), dan code adalah kode jawaban.
- val memiliki sintaks 'value~shown' dengan value adalah nilai penilaian (jika menggunakan penilaian, jika tidak maka code) (misalnya Qcode.value), dan shown adalah nilai tampilan yang dilihat responden (misalnya Qcode.shown)
- Ini berarti banyak survei dapat menggunakan perhitungan tanpa memerlukan mode penilaian. Jika Anda memiliki opsi jawaban terenumerasi yang unik, non-desimal, dan non-negatif, Anda cukup melakukan perhitungan pada nilai Qcode.code.
- Peninjauan mudah atas seluruh logika dan konten survei
- Ada fitur baru Show Survey Logic yang memungkinkan Anda melihat semua hal tentang survei (atau grup atau pertanyaan) dalam satu halaman.
- Fitur ini menampilkan detail tingkat Grup, Pertanyaan, Subpertanyaan, dan Jawaban untuk cakupan yang dipilih (survei vs. grup vs. pertanyaan)
- Fitur ini juga menampilkan relevansi, relevansi tingkat subpertanyaan (untuk array_filter dan array_filter_exclude), dan persamaan validasi yang dihasilkan (untuk preg dan semua aturan validasi seperti jumlah/total nilai minimum/maksimum), serta semua atribut pertanyaan yang tidak kosong.
- Semuanya disorot sintaksnya sehingga Anda dapat melihat potensi kesalahan sintaks (seperti tanda kurung tidak seimbang atau penggunaan variabel sebelum dideklarasikan)
- Penyorotan sintaks mendukung navigasi dan pengeditan survei yang cepat.
- Jika Anda mengklik nama variabel, jendela (atau tab) browser akan terbuka yang menampilkan pertanyaan tersebut dan memungkinkan Anda mengeditnya.
- Jika Anda mengklik nama grup, jendela (atau tab) browser akan terbuka yang menampilkan tampilan urutkan ulang grup sehingga Anda dapat dengan mudah memindahkan pertanyaan.
- Semua atribut pertanyaan juga disorot sintaksnya. Ini memungkinkan Anda menetapkan dan melihat ekspresi di dalam opsi pertanyaan lanjutan (seperti mendasarkan jumlah/total nilai maksimum/minimum pada sebuah ekspresi)
- Penulis EM menggunakan tampilan serupa (sedikit lebih rapi) agar para Ahli Epidemiologi yang berkolaborasi dengannya dan Institutional Review Board dapat memvalidasi dan menyetujui survei dengan ribuan pertanyaan dalam wawancara terstruktur yang sangat bercabang dan ditailor
Memulai
Cara terbaik untuk memulai dengan EM adalah:
- Instal versi stabil terbaru dari http://www.limesurvey.org/en/download
- Impor dan jelajahi survei contoh.
- Jelajahi kasus penggunaan dan panduan cara serta contoh langkah demi langkah.
- Jelajahi dokumentasi EM (halaman ini)
- Periksa rangkaian pengujian EM bawaan
- Dari survei mana pun, di bawah alat, pilih opsi EM
- Fungsi yang tersedia mencantumkan 70+ fungsi beserta sintaksnya
- Unit Tests of Isolated Expressions
- menampilkan contoh penggunaan semua fungsi dan operator EM, serta hasil PHP dan JavaScript
- perhatikan ada beberapa fungsi yang menghasilkan hasil berbeda pada versi PHP dan JavaScript, sehingga halaman ini membantu Anda merencanakan logika EM Anda.
Fungsionalitas Apa yang Diperluas/Digantikan oleh Expression Manager? (LimeSurvey <= 1.91+)
Kondisi => Relevansi
Kondisi mengontrol pertanyaan mana yang terlihat. Sintaks umumnya adalah SGQA operator Nilai, seperti 111X2X3 == "Y". Kondisi dapat digabungkan dengan AND atau OR, tetapi mencampur AND dan OR sulit dilakukan. Kondisi itu sendiri disimpan dalam tabel terpisah, dan sebagian besar kode LimeSurvey didedikasikan untuk mengelola Kondisi. Karena akses database yang ekstensif, pemrosesan kondisi dalam jumlah besar dapat menyebabkan masalah performa yang nyata. Selain itu, setelah kondisi ditetapkan pada pertanyaan atau grup, Anda sering kali tidak diizinkan untuk mengurutkan ulang atau menghapusnya.
Penilaian => Persamaan dan Micro-Tailoring
Penilaian memungkinkan pengguna membuat skor skala dari kumpulan pertanyaan. Namun, penilaian tidak dapat berubah secara dinamis pada halaman saat ini, dan nilainya tidak disimpan ke database.
Penggantian => Micro-Tailoring
Pengguna dapat menyesuaikan beberapa pesan dan pertanyaan berdasarkan tanggapan sebelumnya. Misalnya, sebuah pertanyaan dapat berbunyi, {TOKEN:FIRSTNAME}, Anda mengatakan {SPORT.shown} adalah olahraga favorit Anda. Namun, tidak mungkin melakukan tailoring bersyarat (seperti mengatakan "Tn." atau "Ny." tergantung jenis kelamin orang tersebut), atau mengkonjugasikan kata kerja atau mendeklinasikan kata benda tanpa JavaScript yang rumit. Penulis dapat membuat survei yang tampaknya menyesuaikan pertanyaan, tetapi hal itu memerlukan pertanyaan terpisah untuk setiap permutasi, dan kondisi yang kompleks untuk menentukan pertanyaan mana yang ditampilkan.
Validasi
Pertanyaan dapat divalidasi dengan ekspresi reguler, atau nilai minimum/maksimum, atau membiarkan sebuah tanggapan berfungsi sebagai nilai minimum atau maksimum. Namun, validasi tidak dapat didasarkan pada perhitungan variabel lain tanpa JavaScript yang rumit.
Persamaan
Persamaan tidak didukung tanpa JavaScript yang rumit.
Jenis Pertanyaan Persamaan
Persamaan tidak dapat disimpan ke database (misalnya skor akhir untuk sebuah penilaian) tanpa JavaScript yang rumit.
Bagaimana Expression Manager Akan Menggantikan/Memperluas Fungsionalitas Tersebut?
Expression Manager adalah modul inti baru dalam LimeSurvey yang membuat jauh lebih mudah untuk mendukung jenis fungsionalitas kompleks yang dulu memerlukan JavaScript kustom. Modul ini juga menggantikan cara LimeSurvey saat ini mengelola Kondisi dan Penilaian.
Terminologi Baru Saat Merujuk pada Expression Manager (EM)
EM "memandang" fungsionalitasnya dalam istilah berikut:
- Percabangan berbasis Relevansi - jika sebuah pertanyaan relevan, maka tanyakan, jika tidak maka jangan (misalnya jadikan tidak terlihat, dan tandai sebagai NULL di database). Ada bidang Relevansi baru untuk semua jenis pertanyaan, dan juga untuk setiap Grup (sehingga Anda dapat menerapkan sekumpulan kondisi pada seluruh grup tanpa harus menyalin kondisi yang sama ke setiap pertanyaan, dan/atau menggabungkan logika bersyarat tingkat grup dan pertanyaan).
- Tailoring - Setelah Anda mengetahui pertanyaan mana yang harus ditanyakan, tailoring (kadang disebut piping) menentukan bagaimana pertanyaan harus ditanyakan. Ini memungkinkan Anda mendukung tidak hanya penggantian sederhana (seperti {TOKEN:FIRSTNAME}), tetapi juga konjugasi kata kerja dan deklinasi kata benda berdasarkan jenis kelamin atau jumlah responden Anda. Ini juga memungkinkan Anda mengubah pesan yang Anda sampaikan kepada responden berdasarkan apakah mereka menjawab (atau bagaimana mereka menjawab) pertanyaan lain.
- Persamaan - EM menambahkan jenis pertanyaan baru bernama Persamaan yang menyimpan hasil sebuah Ekspresi. Hasil persamaan ini dihitung dan ditulis ke database, bahkan jika Anda menyembunyikannya di halaman. Dengan demikian, persamaan berguna untuk perhitungan skor tersembunyi, navigasi berdasarkan persamaan yang kompleks, penilaian, dan laporan yang harus dihasilkan dan mudah tersedia di dalam database.
Relevansi dan Relevansi Berjenjang
Setiap jenis pertanyaan kini memiliki opsi Relevansi yang mengontrol apakah pertanyaan ditampilkan. EM memproses setiap Persamaan yang Berhubungan sesuai urutan kemunculannya dalam survei. Jika ekspresi bernilai benar (atau tidak ada - untuk mendukung survei lama), pertanyaan akan ditampilkan. Jika tidak relevan, pertanyaan akan disembunyikan, dan nilainya akan diubah menjadi NULL di database. Jika tidak ada pertanyaan yang relevan dalam sebuah grup, seluruh grup akan dilewati.
Selain itu, jika salah satu variabel dalam sebuah ekspresi tidak relevan, maka ekspresi tersebut selalu bernilai salah. Ini memungkinkan Relevansi Berjenjang sehingga Anda tidak perlu menulis persamaan relevansi yang sangat panjang untuk setiap pertanyaan.
Misalkan Anda memiliki 5 pertanyaan Q1-Q5, dan Anda hanya ingin menampilkan Q2 jika Q1 dijawab, dan Q3 jika Q2 dijawab, dan seterusnya. Persamaan relevansinya dapat berupa:
| Kode pertanyaan | Relevansi | Pertanyaan |
|---|---|---|
| Q1 | 1 | Siapa nama Anda? |
| Q2 | Q1 | {Q1}, berapa usia Anda? |
| Q3 | Q2 | Jadi, usia Anda {Q2} tahun. Apakah Anda sudah menikah? |
| Q4 | Q3 == "Y" | {Q1}, sudah berapa lama Anda menikah? |
| Q5 | Q4 | Berapa banyak anak yang Anda miliki, {Q1}? |
Perhitungan relevansi juga berfungsi di JavaScript - sehingga Anda dapat menempatkan semua pertanyaan di atas dalam satu halaman dan tetap berfungsi seperti yang diharapkan. Bahkan, EM sepenuhnya menggantikan cara EM memproses format survei Survei vs. Grup vs. Satu-Pertanyaan-per-Waktu. Semuanya kini menggunakan mesin navigasi yang persis sama sehingga bekerja identik terlepas dari gaya survei.
Selama Anda berada di halaman yang sama, data apa pun yang Anda masukkan akan tetap ada, hanya saja tersembunyi. Jadi, jika Anda memasukkan beberapa informasi, lalu memilih opsi yang membuatnya tidak relevan, kemudian membuatnya relevan kembali, jawaban Anda akan tetap tersedia. Namun, begitu Anda berpindah ke halaman lain, semua tanggapan yang tidak relevan akan hilang demi integritas set data.
Relevansi Tingkat Grup
Expression Manager juga mendukung relevansi tingkat grup. Hal ini memudahkan penerapan perulangan (looping). Misalkan Anda ingin mengumpulkan informasi tentang hingga 10 entitas (seperti produk atau anggota rumah tangga), di mana Anda terlebih dahulu menentukan berapa banyak entitas yang memerlukan pertanyaan lanjutan (misalnya dengan menanyakan berapa banyak orang yang tinggal dalam satu rumah tangga, atau meminta responden mencentang produk yang mereka sukai dari daftar panjang). Setelah mengetahui berapa banyak entitas yang memerlukan pertanyaan lanjutan, Anda dapat menggunakan relevansi tingkat grup seperti {count >= 1}, {count >=2}, ... {count >= 10} untuk masing-masing dari 10 grup pertanyaan lanjutan. Di dalam setiap grup, Anda dapat memiliki logika kondisional tingkat pertanyaan (misalnya pertanyaan lanjutan khusus jenis kelamin atau usia untuk setiap subjek). Persamaan relevansi tingkat pertanyaan dan tingkat grup digabungkan dengan AND untuk menentukan mana yang harus ditampilkan.
Penyesuaian / Piping
Apa pun di dalam kurung kurawal kini diperlakukan sebagai ekspresi (dengan satu pengecualian yang dijelaskan di bawah). Ekspresi memiliki akses ke semua LimeReplacementFields, semua variabel (melalui beberapa alias), semua operator persamaan yang umum (matematika, logika, dan perbandingan), dan puluhan fungsi (yang bahkan berfungsi secara dinamis di sisi klien).
Dengan persamaan ini, Anda dapat melakukan hal-hal seperti:
- Menampilkan pesan yang disesuaikan secara kondisional kepada responden berdasarkan tanggapan sebelumnya
- Membuat penilaian dan menampilkan hasil penilaian (atau membuat percabangan atau menampilkan pesan secara kondisional) berdasarkan hasil tersebut, semuanya tanpa menggunakan modul Penilaian itu sendiri
- Mengonjugasikan kata kerja dan menyesuaikan kata benda di dalam pertanyaan, jawaban, dan laporan.
- Menampilkan ringkasan tanggapan sebelum halaman "Tampilkan jawaban Anda" di akhir survei
Persamaan
Ada jenis pertanyaan baru bernama Persamaan. Jenis ini seperti pertanyaan Boilerplate, kecuali bahwa ia menyimpan nilai dari apa yang ditampilkan ke dalam database. Jadi, jika teks pertanyaan Persamaan berisi perhitungan penilaian, nilai tersebut akan disimpan di database dalam sebuah variabel yang dapat ditampilkan dalam statistik publik atau privat.
Hal ini menjawab permintaan umum untuk menyimpan skor penilaian di dalam database.
Sintaks
Apa pun yang berada di dalam kurung kurawal kini dianggap sebagai ekspresi (dengan satu pengecualian: tidak boleh ada spasi di awal atau di akhir - hal ini diperlukan agar Expression Manager tidak mencoba memproses JavaScript yang tertanam).
Perlu diperhatikan, ekspresi boleh terdiri dari beberapa baris, selama tidak ada spasi setelah kurung kurawal pembuka atau sebelum kurung kurawal penutup. Hal ini sangat membantu untuk pernyataan if() bersarang seperti berikut:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Very Soft',
if(PFTotals >= -3 && PFTotals <= -2,
'Soft',
if(PFTotals == -1,
'Somewhat Soft',
if(PFTotals == 0,
'Moderate',
if(PFTotals == 1,
'Somewhat Hard',
if(PFTotals >= 2 && PFTotals <= 3,
'Hard',
if(PFTotals >= 4 && PFTotals <= 5,
'Very Hard',
''
)
)
)
)
)
)
)
)}
- Semua operator matematika standar (misalnya +,-,*,/,!)
- Semua operator perbandingan standar (misalnya <,<=,==,!=,>,>=, ditambah padanannya: lt,le,eq,ne,gt,ge)
- Tanda kurung (sehingga Anda dapat mengelompokkan subekspresi)
- Operator kondisional (misalnya &&,| | dan padanannya: and,or)
- String dengan tanda kutip tunggal dan ganda (masing-masing dapat menyematkan string dengan jenis kutip lainnya)
- Operator koma (sehingga dapat memiliki daftar ekspresi dan hanya mengembalikan hasil akhir)
- Operator penugasan (=)
- Variabel yang telah ditentukan (untuk merujuk ke pertanyaan, atribut pertanyaan, dan tanggapan) - misalnya semua kode SGQA
- Fungsi yang telah ditentukan (sudah ada 70+, dan mudah untuk menambahkan lebih banyak)
Operator
Sintaks EM mengikuti prioritas operator yang normal:
| Tingkat | Operator | Deskripsi |
|---|---|---|
| 1 | () | tanda kurung untuk pengelompokan atau pemanggilan fungsi |
| 2 | ! - + | operator unary: not, negasi, unary-plus |
| 3 | * / | kali, bagi |
| 4 | + - | tambah, kurang |
| 5 | < <= > >= lt le gt ge | perbandingan relatif |
| 6 | == != eq ne | perbandingan kesamaan |
| 7 | and | AND logika |
| 8 | or | OR logika |
| 9 | = | operator penugasan |
| 10 | , | operator koma |
Peringatan tentang operator plus (+)
Demi konsistensi antara JavaScript dan PHP, operator plus (+) melakukan penjumlahan jika kedua operand berupa angka, tetapi melakukan penggabungan jika kedua bagian berupa string non-numerik. Namun, kami menyarankan penggunaan fungsi join() untuk penggabungan dan fungsi sum() untuk penjumlahan, karena hal itu membuat maksud Anda lebih jelas dan menghindari hasil yang tidak terduga jika Anda mengharapkan string tetapi mendapatkan angka (atau sebaliknya).
Peringatan tentang ketidakcocokan antara angka dan string serta perbandingan alfabetis
Saat Anda ingin membandingkan nilai dengan perbandingan relatif atau kesamaan, perhatikan ketidakcocokan jenis data. Nilai yang dimasukkan pengguna atau kode jawaban yang dipilih dapat digunakan sebagai angka jika jelas berupa angka.
Jika Anda mengapit salah satu nilai dengan ", perbandingan akan dipaksa sebagai teks (perbandingan alfabetis). Jika Anda ingin membandingkan secara numerik, jangan pernah mengapit angka dengan tanda kutip, ".
Misalnya Q0.NAOK > "50" bernilai benar jika Q0.NAOK adalah pertanyaan numerik dengan nilai 9. Hal ini karena operator > akan menganggapnya sebagai perbandingan alfabetis dan bukan numerik.
Untuk memastikan perbandingan nilai bilangan bulat, Anda dapat menggunakan intval(Q0.NAOK) > 50, hanya perlu diingat bahwa jika Q0.NAOK bukan angka (kosong atau berupa string), maka intval(Q0.NAOK) == 0. Untuk membandingkan nilai string ("A" < "B") gunakan strcmp secara langsung : strcmp(Q0.NAOK,"B") atau strcmp(Q0.NAOK,"A5").
Perhatian dalam menggunakan operator penugasan (=)
Perlu diperhatikan, sebaiknya hindari penggunaan operator penugasan kecuali benar-benar diperlukan, karena dapat menimbulkan efek samping yang tidak terduga. Misalnya, jika Anda mengubah nilai tanggapan sebelumnya, logika relevansi dan validasi berantai antara pertanyaan tersebut dan pertanyaan saat ini tidak dihitung ulang, sehingga Anda dapat berakhir dengan data yang tidak konsisten secara internal (misalnya pertanyaan yang tetap terjawab padahal seharusnya di-NULL-kan, atau pertanyaan yang dilewati padahal seharusnya dijawab). Secara umum, jika Anda ingin memberikan nilai ke sebuah variabel, sebaiknya buat pertanyaan berjenis Persamaan, lalu gunakan ekspresi untuk menetapkan nilainya. Namun, ada beberapa kasus langka ketika orang benar-benar membutuhkan operator ini, sehingga kami menyediakannya.
Sebagai peringatan terhadap operator ini, operator tersebut ditampilkan dengan huruf merah di dalam persamaan sintaks (agar Anda tidak menyamakannya dengan "==").
Menggunakan operator penugasan
Alasan utama Anda mungkin ingin menggunakan penugasan:
- Anda perlu menetapkan nilai default untuk pertanyaan yang tidak menerima nilai default melalui persamaan (seperti daftar radio, di mana antarmuka pengguna memungkinkan Anda memilih salah satu opsi jawaban, tetapi tidak memungkinkan Anda memasukkan persamaan). Namun, berhati-hatilah, karena LimeSurvey tidak dapat memvalidasi bahwa persamaan Anda menghasilkan salah satu jawaban yang diperbolehkan untuk pertanyaan tersebut.
- Anda perlu secara paksa mengubah tanggapan pada pertanyaan sebelumnya berdasarkan tanggapan yang muncul kemudian
- Anda membutuhkan kuota yang kompleks : menggunakan satu pilihan tunggal tersembunyi untuk kuota dan menetapkannya menggunakan penugasan
- dan lain-lain...
Anda dapat menggunakan seluruh sistem Expression Manager untuk tujuan ini.
Beberapa contoh:
- Mengatur jawaban pada pertanyaan Teks pendek menjadi huruf kecil :
{QCODE=strtolower(QCODE.NAOK)} - Mengatur jawaban standar pada jenis pertanyaan larik di awal survei :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Mengatur jawaban standar pada jenis pertanyaan larik teks di awal survei :
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - Mengatur jawaban dengan kondisi :
{QCODE=if(YesNo="Y","A1","")}
Keamanan XSS
Dengan XSS diaktifkan, beberapa sistem Expression Manager tidak dapat digunakan:
- memulai tag HTML dalam satu ekspresi tetapi menutupnya di ekspresi lain
- menggunakan ekspresi kompleks dalam URL.
Contoh dan solusi sementara
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}tidak berfungsi dengan keamanan XSS, di sini Anda dapat menggunakan{if(1,"<strong>information</strong>","information")}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, di sini Anda dapat menggunakan pertanyaan persamaan karena penggunaan kode pertanyaan lengkap diperbolehkan:<a href="/script.php?value={EQUATION.NAOK}">next</a>
Akses ke Variabel
Expression Manager menyediakan akses hanya-baca ke variabel apa pun yang mungkin kita butuhkan. Demi kompatibilitas mundur, akses disediakan untuk hal-hal berikut:
- TOKEN:xxx - nilai sebuah TOKEN (mis. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Hanya untuk survei yang TIDAK anonim).
- QCODE.shown - nilai tampilan sebuah jawaban (mis. "Ya") menggunakan Expression Manager.
- Semua nilai {XXX} yang digunakan oleh templat.
- Dalam teks pertanyaan, Anda dapat menggunakan {QID} yang diganti dengan ID pertanyaan dan {SGQ} yang diganti dengan SGQA pertanyaan tersebut
Selain itu, Expression Manager memungkinkan Anda merujuk variabel menggunakan Kode pertanyaan (kolom 'title' pada tabel pertanyaan di dalam basis data). Ini juga merupakan label variabel yang digunakan saat Anda mengekspor data ke SPSS, R, atau SAS. Misalnya, jika Anda memiliki pertanyaan tentang nama, usia, dan jenis kelamin, Anda dapat menamai variabel tersebut name, age, dan gender sebagai ganti 12345X13X22, 12345X13X23, dan 12345X13X24. Hal ini membuat persamaan lebih mudah dibaca dan logikanya lebih mudah divalidasi oleh siapa pun, serta memungkinkan Anda mengubah urutan pertanyaan tanpa harus melacak nomor grup atau pertanyaan.
Penting: Hanya aman untuk merujuk variabel yang muncul pada halaman atau pertanyaan sebelumnya.
Selain itu, Expression Manager memungkinkan Anda mengakses banyak properti dari pertanyaan:
| Sintaks | Arti | Contoh | Hasil contoh |
|---|---|---|---|
| Qcode | alias untuk Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | kode tanggapan yang dipilih untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | sama dengan Qcode - lihat pembahasan tentang NAOK | {gender.NAOK} | 'M' |
| Qcode.value | nilai penilaian untuk pertanyaan jika relevan (jika tidak, kosong), atau nilai teks jika bukan pertanyaan berkode | {gender.value} | '1' |
| Qcode.valueNAOK | sama dengan Qcode.value - lihat pembahasan tentang NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | nilai tampilan untuk pertanyaan | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | teks pertanyaan | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | apakah pertanyaan wajib diisi (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | nomor pertanyaan internal (bukan nomor urut) | {gender.qid} | 337 |
| Qcode.type | jenis pertanyaan | {gender.type} | 'G' |
| Qcode.jsName | nama javascript yang benar untuk pertanyaan, terlepas dari apakah dideklarasikan di halaman ini atau di luarnya | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | nomor grup internal (bukan nomor urut) | {gender.gid} | 3 |
| Qcode.qseq | nomor urut pertanyaan, dimulai dari 0 | {gender.qseq} | 5 |
| Qcode.gseq | nomor urut grup, dimulai dari 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | apakah pertanyaan saat ini relevan (0 atau 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | persamaan relevansi tingkat pertanyaan | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | persamaan relevansi tingkat grup | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | nilai SGQA untuk pertanyaan ini | {gender.sgqa} | '1827X3X337' |
Masalah editor HTML
Jika Anda menggunakan editor HTML, beberapa karakter diganti dengan entitas HTML.
- & menjadi &
- < menjadi <
- > menjadi >
Jika Anda menggunakan editor HTML, Anda perlu menggunakan:
- and untuk &
- lt untuk <
- le untuk <=
- gt untuk >
- ge untuk >=
Penamaan Variabel Qcode
Berikut rincian cara menyusun Qcode (dan mengakses beberapa properti) berdasarkan jenis pertanyaan. Secara umum, Qcode disusun sebagai:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Kode subpertanyaan & ID skala perlu digunakan atau tidak, tergantung pada jenis pertanyaan - lihat tabel di bawah. Untuk comment dan other, kode pertanyaannya adalah QuestionCode_comment dan QuestionCode_other
| Jenis | Deskripsi | Kode | Subpertanyaan | Opsi jawaban | Skala | Kode jawaban | Jawaban ditampilkan | Relevansi |
|---|---|---|---|---|---|---|---|---|
| 5 | Pilihan 5 poin, tombol radio | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Larik (pilihan 10 poin), tombol radio | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Larik (pilihan 5 poin), tombol radio | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Larik (label fleksibel) skala ganda | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Larik (fleksibel) - format kolom | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Larik (fleksibel) - format baris | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Larik (Meningkat/Sama/Menurun), tombol radio | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Larik (multi fleksi) 1 sampai 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Larik (multi fleksi) teks | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Larik (Ya/Tidak pasti/Tidak), tombol radio | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Pertanyaan boilerplate | Q11 | {Q11.shown} | |||||
| D | Tanggal | Q12 | {Q12} | {Q12.shown} | ||||
| * | Persamaan | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Unggahan berkas (mencatat jumlah berkas yang diunggah) | Q14 | {Q14} | {Q14>0} | ||||
| G | Daftar tarik-turun jenis kelamin | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Teks bebas besar | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Pertanyaan bahasa | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Daftar - tarik-turun | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Daftar tarik-turun/tombol radio | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Daftar dengan komentar, tarik-turun/tombol radio + area teks | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Teks bebas panjang | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Pilihan ganda, kotak centang | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Pilihan ganda dengan komentar, kotak centang + teks | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Pertanyaan numerik ganda | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Beberapa teks pendek | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Jenis pertanyaan numerik | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Gaya peringkat | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Teks bebas singkat | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Ya/Tidak, tombol radio | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Variabel khusus 'this', 'self', dan 'that'
Sering kali Anda ingin mengevaluasi semua bagian dari sebuah pertanyaan, misalnya menghitung berapa banyak subpertanyaan yang telah dijawab, atau menjumlahkan skor. Di lain waktu, Anda hanya ingin memproses baris atau kolom tertentu dari sebuah pertanyaan (misalnya mendapatkan jumlah baris atau kolom dan menyimpannya di basis data). Variabel khusus ini membuat proses tersebut relatif mudah.
Variabel 'this' digunakan khusus dalam opsi lanjutan pertanyaan "Persamaan validasi seluruh pertanyaan" dan "Persamaan validasi subpertanyaan". Variabel ini diperluas menjadi nama variabel dari setiap sel dalam pertanyaan tersebut. Jadi, jika Anda ingin memastikan bahwa setiap entri lebih besar dari tiga, Anda akan mengatur "Persamaan validasi subpertanyaan" menjadi (this > 3).
Variabel 'self' dan 'that' lebih andal, dan berfungsi sebagai makro yang diperluas sebelum persamaan diproses. Pilihan sintaksnya adalah:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix adalah salah satu sufiks qcode normal (mis. NAOK, value, shown)
sub-selector adalah salah satu dari:
- comments - hanya subpertanyaan yang berupa komentar (mis. dari pilihan ganda dengan komentar dan daftar dengan komentar)
- nocomments - hanya subpertanyaan yang bukan komentar
- sq_X - dengan X adalah pengenal baris atau kolom. Hanya subpertanyaan yang cocok dengan pola X yang dipilih. Perhatikan bahwa pencarian dilakukan pada pengenal kode lengkap, lalu sq_X mencocokkan dan menyertakan subpertanyaan nX, X, Xn (mis. jika Anda menggunakan sq_1, subpertanyaan a1, 1a, 1, 11 atau 001 akan disertakan). Berhati-hatilah pada jenis pertanyaan skala ganda, yang kode subpertanyaannya adalah QCODE_SQCODE_1 dan QCODE_SQCODE_1, dan pada jenis pertanyaan peringkat, yang kode subpertanyaannya adalah QCODE_1,QCODE_2 ....
- nosq_X - dengan X adalah pengenal baris atau kolom. Hanya subpertanyaan yang tidak cocok dengan pola X yang dipilih. Perhatikan bahwa pencarian dilakukan pada pengenal kode lengkap, lalu nosq_X mencocokkan dan tidak menyertakan subpertanyaan nX, X, Xn
Contoh:
- Apakah ada bagian dari pertanyaan yang telah dijawab? {count(self.NAOK)>0}
- Berapa skor penilaian untuk pertanyaan ini? {sum(self.value)}
Anda juga dapat menggunakannya untuk mendapatkan total baris dan kolom. Misalkan Anda memiliki larik angka dengan baris A-E dan kolom 1-5.
- Berapa total keseluruhan? {sum(self.NAOK)}
- Berapa total baris B? {sum(self.sq_B.NAOK)}
- Berapa total kolom 3? {sum(self.sq_3.NAOK)}
Variabel 'that' seperti variabel 'self', tetapi memungkinkan Anda merujuk pertanyaan lain. Sintaksnya adalah:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname adalah nama pertanyaan tanpa ekstensi subpertanyaan apa pun. Jadi, jika Anda membuat pertanyaan 'q1', itulah qname-nya
Contoh:
- Apakah ada bagian dari pertanyaan q1 yang telah dijawab? {count(that.q1.NAOK)>0}
- Berapa skor penilaian untuk q2? {sum(that.q2.NAOK)}
- Berapa total keseluruhan q3? {sum(that.q3.NAOK)}
- Berapa total baris C di q4? {sum(that.q4.sq_C.NAOK)}
- Berapa total kolom 2 di q4? {sum(that.q4.sq_2.NAOK)}
Variabel 'self' dan 'that' dapat digunakan dalam relevansi, validasi, atau penyesuaian (tailoring) apa pun.
Satu catatan: saat Anda menggunakan fitur Tampilkan berkas logika, fitur tersebut akan menampilkan nilai 'self' dan 'that' yang telah diperluas. Dengan begitu Anda dapat melihat persamaan sebenarnya yang akan dihasilkan sehingga Anda (dan Expression Manager) dapat memvalidasi bahwa variabel tersebut ada. Hal ini mungkin membingungkan karena Anda dapat melihat persamaan yang cukup panjang. Namun, jika Anda mengedit pertanyaan, Anda akan melihat persamaan asli yang menggunakan 'self' dan/atau 'that'
Perhatikan juga bahwa Anda sebaiknya tidak menggunakan variabel-variabel ini jika (a) Anda ingin menyebutkan secara eksplisit setiap variabel yang digunakan dalam sebuah persamaan, atau (b) menggunakan variabel yang tidak memiliki subpertanyaan (misalnya pertanyaan dengan satu jawaban). Dalam kasus tersebut, menambahkan awalan 'that' pada variabel berlebihan, dan Anda berisiko mendapatkan hasil yang tidak diharapkan.
Penggunaan NAOK
NAOK --> "Not Applicable" (NA) is alright (OK), artinya "Tidak Berlaku" (NA) tidak masalah (OK)
Menggunakan NAOK berarti bahwa seluruh atau sebagian variabel tidak relevan (misalnya "Not Applicable" (NA) is alright (OK), yaitu "Tidak Berlaku" tidak masalah).
Jika Anda memasukkan variabel dari sebuah pertanyaan ke dalam persamaan apa pun: apabila pertanyaan (atau subpertanyaan) tersebut disembunyikan oleh kondisi, maka seluruh persamaan akan dinonaktifkan.
Misalnya: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) selalu menghasilkan string kosong jika salah satu subpertanyaan dari Q1 difilter. Untuk menghitung jumlah subpertanyaan yang dicentang pada pertanyaan seperti itu, Anda dapat menggunakan count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Jika subpertanyaan disembunyikan: Expression Manager mengembalikan string kosong.
Tanpa NAOK: jika satu pertanyaan atau satu subpertanyaan disembunyikan, Expression Manager selalu mengembalikan string kosong, sama seperti mengembalikan false.
.shown selalu menggunakan sistem NAOK (string kosong jika disembunyikan), tetapi jika Anda membutuhkan kode jawaban: sebaiknya selalu tambahkan .NAOK setelah kode pertanyaan, kecuali jika Anda memang membutuhkannya dan tahu apa yang Anda lakukan.
Contoh dan informasi lainnya tersedia di Mengesampingkan kondisi berjenjang
Akses ke Fungsi
Expression Manager menyediakan akses ke fungsi matematika, string, dan fungsi buatan pengguna, seperti ditunjukkan di bawah ini. Fungsi-fungsi ini memiliki padanan di PHP dan JavaScript sehingga bekerja secara identik di sisi server (PHP) maupun sisi klien (JavaScript). Menambahkan fungsi baru juga mudah.
Fungsi yang Diimplementasikan
Fungsi-fungsi berikut saat ini tersedia:
| Fungsi | Arti | Sintaks |
|---|---|---|
| abs | Nilai mutlak | number abs(number) |
| acos | Arc cosinus | number acos(number) |
| addslashes | Beri garis miring pada string (quote) | string addslashes(string) |
| asin | Arc sinus | number asin(number) |
| atan | Arc tangen | number atan(number) |
| atan2 | Arc tangen dari dua varibel | number atan2(number, number) |
| ceil | Bulatkan pecahan ke atas | number ceil(number) |
| checkdate | Mengembalikan benar (1) jika tanggal valid dalam kalender Gregorian | bool checkdate(month,day,year) |
| convert_value | Mengonversi nilai numerik menggunakan inputTable dan outputTable berisi nilai numerik | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Cosinus | number cos(number) |
| count | Menghitung jumlah pertanyaan yang dijawab (tidak kosong) dalam daftar | number count(arg1, arg12, ..., argN) |
| countif | Menghitung jumlah pertanyaan yang dijawab dalam daftar yang sama dengan argumen pertama | number countif(matches, arg1, arg2, ... argN) |
| countifop | Menghitung jumlah pertanyaan yang dijawab dalam daftar yang memenuhi kriteria (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Format tanggal/waktu lokal | string date(format [, timestamp=time()]) |
| exp | Menghitung eksponen dari e | number exp(number) |
| fixnum | Menampilkan angka dengan koma sebagai pemisah desimal, jika diperlukan | string fixnum(number) |
| floor | Bulatkan pecahan ke bawah | number floor(number) |
| gmdate | Format tanggal/waktu GMT | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Mengonversi semua entitas HTML menjadi karakter yang sesuai (selalu menggunakan ENT_QUOTES dan UTF-8) | string html_entity_decode(string) |
| htmlentities | Mengonversi semua karakter yang sesuai menjadi entitas HTML (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Mengonversi karakter khusus menjadi entitas HTML (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Mengonversi entitas HTML khusus kembali menjadi karakter (selalu menggunakan ENT_QUOTES dan UTF-8) | string htmlspecialchars_decode(string) |
| idate | Bentuk tanggal/waktu lokal sebagai angka | string idate(string [, timestamp=time()]) |
| if (Updated in 3.0.2 ) | if gaya Excel(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
| implode | Sambungkan elemen array dengan rangkaian karakter | string implode(glue,arg1,arg2,...,argN) |
| intval | Dapatkan nilai angka dari variabel | int intval(number [, base=10]) |
| is_empty | Menentukan apakah sebuah variabel dianggap kosong | bool is_empty(var) |
| is_float | Mencari tahu apakah tipe variabel adalah float | bool is_float(var) |
| is_int | Mencari tahu apakah tipe variabel adalah integer | bool is_int(var) |
| is_nan | Mencari tahu apakah sebuah nilai bukan sebuah angka | bool is_nan(var) |
| is_null | Cari tahu apakah variabel adalah NULL | bool is_null(var) |
| is_numeric | Mencari tahu apakah sebuah variabel adalah angka atau string numerik | bool is_numeric(var) |
| is_string | Mencari tahu apakah tipe variabel adalah string | bool is_string(var) |
| join (New in 2.0 build 130129) | Menggabungkan elemen menjadi string baru | join(arg1, arg2, ... argN) |
| list | Mengembalikan daftar nilai tidak kosong yang dipisahkan koma | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Mengembalikan daftar yang dipisahkan 'glue' dari properti pertanyaan tertentu (retProp) dari pertanyaan dalam daftar yang memenuhi kriteria (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | Logaritma dari angka dengan basis tertentu, jika diberikan, atau logaritma natural. | number log(number,base=e) |
| ltrim | Hapus spasi kosong (atau karakter lain) dari awal string | string ltrim(string [, charlist]) |
| max | Cari nilai tertinggi | number max(arg1, arg2, ... argN) |
| min | Cari nilai terendah | number min(arg1, arg2, ... argN) |
| mktime | Ambil timestamp UNIX untuk sebuah tanggal (masing-masing dari 6 argumen bersifat opsional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Fungsi modulo belum didukung. Anda dapat menggunakan fungsi floor() sebagai gantinya | floor(x/y)==(x/y) |
| nl2br | Menyisipkan jeda baris HTML sebelum semua baris baru dalam string | string nl2br(string) |
| number_format | Bentuk angka dengan mengelompokkan ribuan | string number_format(number) |
| pi | Ambil nilai dari pi | number pi() |
| pow | Lambang eksponen | number pow(base, exp) |
| quoted_printable_decode | Mengonversi string quoted-printable menjadi string 8 bit | string quoted_printable_decode(string) |
| quoted_printable_encode | Mengonversi string 8 bit menjadi string quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Kuota meta karakter | string quotemeta(string) |
| rand | Hasilkan angka acak, lihat contoh ini | int rand() OR int rand(min, max) |
| regexMatch | Membandingkan string dengan persamaan reguler | bool regexMatch(pattern,input) |
| round | Membulatkan angka ke dalam ketepatan opsional | number round(val [, precision]) |
| rtrim | Hapus spasi kosong (atau karakter lain) dari akhir string | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Mengembalikan string yang diformat | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Akar kuadrat | number sqrt(arg) |
| stddev | Hitung Deviasi standar sampel untuk daftar angka | number stddev(arg1, arg2, ... argN) |
| str_pad | Lengkapi string hingga panjang tertentu dengan string lain | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Ulangi rangkaian karakter | string str_repeat(input, multiplier) |
| str_replace | Ganti semua kemunculan string pencarian dengan string pengganti | string str_replace(search, replace, subject) |
| strcasecmp | Perbandingan string peka huruf besar kecil yang aman untuk biner | int strcasecmp(str1, str2) |
| strcmp | Perbandingan string yang aman untuk biner | int strcmp(str1, str2) |
| strip_tags | Hapus tag HTML dan PHP dari string | string strip_tags(str, allowable_tags) |
| stripos | Cari posisi kemunculan pertama dari string unicode yang tidak peka huruf besar-kecil (dimulai dari 0, mengembalikan false jika tidak ditemukan) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Menghapus tanda kutip dari rangkaian karakter yang terdapat di dalam tanda kutip | string stripslashes(string) |
| stristr | Strstr tidak peka huruf besar - kecil | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Ambil panjang rangkaian karakter | int strlen(string) |
| strpos | Cari posisi kemunculan pertama dari string unicode (dimulai dari 0, mengembalikan false jika tidak ditemukan) | int strpos(haystack, needle [ offset=0]) |
| strrev | Balikkan rangkaian karakter | string strrev(string) |
| strstr | Cari kemunculan pertama dari rangkaian karakter | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Ubah string menjadi huruf kecil | string strtolower(string) |
| strtotime | Mengurai hampir semua deskripsi tanggal-waktu berbahasa Inggris menjadi timestamp Unix | int strtotime(string) |
| strtoupper | Ubah string menjadi huruf besar | string strtoupper(string) |
| substr | Mengembalikan bagian dari string unicode | string substr(string, start [, length]) |
| sum | Hitung jumlah nilai-nilai dalam susunan | number sum(arg1, arg2, ... argN) |
| sumifop | Menjumlahkan nilai pertanyaan yang dijawab dalam daftar yang memenuhi kriteria (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangen | number tan(arg) |
| time | Kembalikan timestamp UNIX ssaat ini | number time() |
| trim | Hapus spasi kosong (atau karakter lain) dari awal dan akhir string | string trim(string [, charlist]) |
| ucwords | Ubah karakter pertama dari setiap kata dalam string menjadi huruf kapital | string ucwords(string) |
| unique | Mengembalikan benar jika semua respons yang tidak kosong adalah unik | boolean unique(arg1, ..., argN) |
Fungsi yang Direncanakan atau Sedang Dipertimbangkan
Fungsi lain yang direncanakan (atau sedang dipertimbangkan) tetapi belum diimplementasikan antara lain sebagai berikut. Beberapa di antaranya untuk kompatibilitas mundur dengan alat survei lain.
| Sintaks | Arti | Komentar |
|---|---|---|
| e() | mengembalikan nilai e | |
| formatDate(X,PAT) | mengembalikan nilai string dari tanggal X yang diformat sesuai pola format tanggal Java PAT | |
| formatNumber(X,PAT) | mengembalikan nilai string dari angka X yang diformat sesuai pola format angka Java PAT | |
| getAnsOption(X) | Plugin inti ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Plugin inti ExpressionAnswerOptions | |
| getRelevance(X) | mengembalikan persamaan relevansi untuk pertanyaan X | |
| getStartTime() | mengembalikan tanggal yang sesuai dengan waktu sistem saat wawancara dimulai | |
| getType(X) | mengembalikan nama string dari tipe data - misalnya *NA* jika isNA() | |
| gotoFirst() | melompat ke kumpulan pertanyaan relevan yang pertama - ini melanggar alur normal sistem | |
| gotoNext() | melompat ke kumpulan pertanyaan relevan berikutnya - ini melanggar alur normal sistem | |
| gotoPrevious() | melompat ke kumpulan pertanyaan relevan sebelumnya - ini melanggar alur normal sistem | |
| isAsked(X) | mengembalikan true jika jawaban bukan *NA*, *INVALID*, maupun *UNASKED* | |
| isInvalid(X) | mengembalikan true jika jawaban bertipe *INVALID* | |
| isNA(X) | mengembalikan true jika jawaban bertipe *NA* | |
| isNotUnderstood(X) | mengembalikan true jika jawaban bertipe *HUH* | |
| isRefused(X) | mengembalikan true jika jawaban bertipe *REFUSED* | |
| isSpecial(X) | mengembalikan true jika jawaban bertipe *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN*, atau *HUH* | |
| isUnknown(X) | mengembalikan true jika jawaban bertipe *UNKNOWN* | |
| jumpTo(X) | melompat ke grup yang berisi pertanyaan dengan nama tersebut -- ini melanggar alur normal sistem | |
| jumpToFirstUnasked() | melompat ke pertanyaan pertama yang belum ditanyakan |
|
| lastIndexOf(X,Y) | mengembalikan indeks terakhir (basis 0) dari string Y dalam string X. Mengembalikan -1 jika Y tidak terdapat dalam X | |
| list(X,...) | string berisi daftar nilai positif yang dipisahkan koma, dengan "dan" memisahkan dua nilai terakhir | |
| mean(X,...) | mengembalikan rata-rata dari daftar nilai | |
| numAnsOptions(X) | mengembalikan jumlah opsi jawaban yang dimiliki pertanyaan X | |
| orlist(X,...) | string berisi daftar nilai positif yang dipisahkan koma, dengan "atau" memisahkan dua nilai terakhir | |
| parseDate(X,PAT) | mengembalikan nilai tanggal dari string X yang diurai dengan pola format tanggal Java PAT | |
| parseNumber(X,PAT) | mengembalikan nilai numerik dari string X yang diurai dengan pola format angka Java PAT | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | questionList = daftar pengenal pertanyaan yang dipisahkan tanda pipa; attributeList = daftar atribut yang dipisahkan tanda pipa (seperti question#, title, text, type - sehingga Anda dapat menentukan apa yang ditampilkan); attributeTitleList = daftar judul tabel yang dipisahkan tanda pipa, sehingga laporan dapat diinternasionalisasi. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | questionList = daftar pengenal pertanyaan yang dipisahkan tanda pipa; attributeList = daftar atribut yang dipisahkan tanda pipa (seperti question#, title, text, type - sehingga Anda dapat menentukan apa yang ditampilkan); attributeTitleList = daftar judul tabel yang dipisahkan tanda pipa, sehingga laporan dapat diinternasionalisasi. |
Expression Manager Mengetahui Variabel Mana yang Bersifat Lokal
Agar dapat membangun JavaScript untuk halaman dengan benar, Expression Manager perlu mengetahui variabel mana yang diatur pada halaman tersebut, dan apa ID JavaScript-nya (misalnya untuk document.getElementById(x)). Expression Manager juga harus mengetahui variabel mana yang diatur pada halaman lain (agar dapat memastikan bahwa kolom <input type='hidden' value='x'> yang diperlukan tersedia dan terisi).
Kondisi Berjenjang
Jika salah satu variabel tidak relevan, seluruh persamaan menjadi tidak relevan (false). Misalnya, pada tabel berikut, N/A berarti salah satu variabel tidak relevan
| Operator | Contoh | a | b | Hasil |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (atau eq) | a == b | N/A | 5 | false |
| == (atau eq) | a == b | N/A | 0 | false |
| == (atau eq) | a == b | N/A | N/A | false |
| != (atau ne) | a != b | N/A | 5 | false |
| != (atau ne) | a != b | N/A | N/A | false |
| != (atau ne) | a != b | N/A | 0 | false |
| > (atau gt) | a > b | N/A | 5 | false |
| >= (atau ge) | a >= b | N/A | 5 | false |
| < (atau lt) | a < b | N/A | 5 | false |
| <= (atau le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| fungsi | sum(a,b,b) | N/A | 5 | false |
| fungsi | max(a,b) | N/A | 5 | false |
| fungsi | min(a,b) | N/A | 5 | false |
| fungsi | implode(', ',a,b,a,b) | N/A | 5 | false |
| fungsi | if(a,a,b) | N/A | 5 | false |
| fungsi | is_empty(a) | N/A | false | |
| fungsi | is_empty(a) | 0 (atau kosong) | true | |
| fungsi | !is_empty(a) | N/A | false |
Mengesampingkan Kondisi Berjenjang
Misalkan Anda ingin menampilkan total berjalan dari semua jawaban yang relevan. Anda mungkin mencoba menggunakan persamaan {sum(q1,q2,q3,...,qN)}. Namun, persamaan ini diterjemahkan secara internal menjadi LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Jadi, jika salah satu nilai q1-qN tidak relevan, persamaan akan selalu mengembalikan false. Dalam hal ini, sum() akan menampilkan 0 sampai semua pertanyaan dijawab.
Untuk mengatasinya, setiap variabel dapat diberi sufiks ".NAOK" (artinya Not Applicable boleh/OK). Dalam kasus tersebut, perilaku berikut terjadi. Misalkan Anda memiliki variabel q1.NAOK
- q1 tidak ditambahkan ke klausa LEManyNA()
- LEMval('q1') akan tetap memeriksa apakah tanggapan relevan, dan akan mengembalikan '' jika tidak (sehingga tanggapan individual yang tidak relevan akan diabaikan, tetapi tidak membatalkan seluruh ekspresi).
Jadi, solusi untuk masalah total berjalan adalah menggunakan persamaan sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Penggunaan sufiks .NAOK juga memungkinkan pembuat survei merancang survei yang memiliki beberapa jalur yang mungkin tetapi kemudian bertemu kembali pada jalur yang sama. Misalnya, responden menjawab survei dengan cara yang berada di luar rentang tanggapan normal. Pembuat survei dapat memperingatkan responden bahwa mereka mungkin tidak mendapatkan hasil yang valid, dan menanyakan apakah mereka benar-benar ingin melanjutkan survei. Jika mereka menjawab Ya, sisa pertanyaan akan ditampilkan. Kondisi untuk "sisa pertanyaan" akan memeriksa apakah tanggapan awal dijawab dalam rentang normal ATAU apakah responden menjawab Ya pada pertanyaan yang hanya relevan jika mereka menjawab di luar rentang normal.
Bagaimana Expression Manager Mendukung Micro-Tailoring Bersyarat?
Berikut adalah contoh micro-tailoring (di mana Question Type=='expr' berarti Persamaan):
| Kode pertanyaan | Relevansi | Jenis pertanyaan | Pertanyaan |
|---|---|---|---|
| name | 1 | text | Siapa nama Anda? |
| age | 1 | text | Berapa usia Anda? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Maaf, {name}, Anda terlalu {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } untuk tes ini. |
| kids | !badage | yesno | Apakah Anda memiliki anak? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Berapa jumlah anak Anda? |
| kid1 | parents && numKids >= 1 | text | Berapa usia anak pertama Anda? |
| kid2 | parents && numKids >= 2 | text | Berapa usia anak kedua Anda? |
| kid3 | parents && numKids >= 3 | text | Berapa usia anak ketiga Anda? |
| kid4 | parents && numKids >= 4 | text | Berapa usia anak keempat Anda? |
| kid5 | parents && numKids >= 5 | text | Berapa usia anak kelima Anda? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, Anda mengatakan bahwa usia Anda {age} dan Anda memiliki {numKids} anak. Jumlah usia dari {min(numKids,5)} anak pertama Anda adalah {sumage} |
Semua pertanyaan ini dapat berada pada satu halaman (misalnya dalam grup yang sama), dan hanya pertanyaan yang relevan yang akan ditampilkan. Selain itu, saat Anda memasukkan usia anak-anak, ekspresi sum() pada pertanyaan terakhir akan diperbarui secara dinamis pada halaman.
Expression Manager menyediakan fungsi ini dengan mengapit setiap ekspresi dalam elemen <span> bernama. Setiap kali nilai berubah, Expression Manager menghitung ulang ekspresi yang harus muncul dalam elemen <span> tersebut dan membuat ulang tampilannya. Anda dapat memiliki puluhan, bahkan ratusan, ekspresi tailoring seperti ini pada halaman yang sama, dan halaman akan menampilkan ulang semuanya dalam satu kali penyegaran layar.
Pemetaan Fungsionalitas LimeSurvey 1.91+ ke Expression Manager
| Fitur Lama | Fitur Baru | Komentar |
|---|---|---|
| Kondisi | Relevansi | Anda dapat menggunakan persamaan bersyarat yang sangat kompleks, dan mengakses rentang variabel yang lebih luas |
| Penilaian | Persamaan | Setiap skor penilaian dapat disusun ulang menjadi sebuah Persamaan. Hal ini memastikan skor ditulis ke basis data, dan juga memungkinkan Anda melihat perubahan dinamis pada nilai skor di halaman saat ini |
| Replacements | Expression Manager | Mesin inti mengambil string masukan dan memperlakukan semua yang ada di dalam kurung kurawal sebagai Ekspresi - sehingga menangani semua jenis replacement historis. Agar JavaScript tertanam tidak rusak, Expression Manager hanya memproses konten di antara kurung kurawal selama (a) tidak ada spasi di awal atau di akhir dalam kurung kurawal - misalnya {expr} adalah ekspresi, tetapi { expr}, {expr }, dan { expr } bukan ekspresi. Selain itu, Expression Manager tidak memproses konten di dalam string miliknya sendiri (misalnya {list('hi','there {braces}')} menghasilkan "hi there {braces}"). Expression Manager juga mengabaikan kurung kurawal yang di-escape (misalnya \{this is not an expression\}) |
| Validasi | Expression Manager | Rencananya adalah mengambil Atribut Pertanyaan min/maks saat ini dan membuat Expression Manager memprosesnya. Dengan begitu nilai min/maks dapat berupa ekspresi itu sendiri |
Penyorotan Sintaks
Untuk membantu memasukkan dan memvalidasi ekspresi, EM menyediakan penyorotan sintaks dengan fitur-fitur berikut:
Jenis dan Arti Penyorotan Sintaks
| Warna | Contoh | Arti | Tooltip | Komentar |
|---|---|---|---|---|
| latar belakang cokelat muda | Sample | seluruh persamaan | tidak ada | Apa pun di dalam kurung kurawal yang dikenali sebagai persamaan (misalnya tidak ada spasi di awal atau di akhir) akan diberi kode warna latar belakang cokelat muda agar mudah dibedakan dari teks di sekitarnya |
| teks merah tebal | Sample | Kesalahan | Penjelasan singkat tentang kesalahan | Bisa berupa variabel yang tidak dikenal atau kesalahan pada fungsi, .... Survei bisa rusak total, hal ini tidak ditampilkan kepada pengguna publik. |
| teks biru | Sample | nama fungsi | arti dan sintaks yang diperbolehkan | nama fungsi, atau hal yang seharusnya berupa fungsi karena diikuti tanda kurung buka, ditampilkan dengan teks biru tebal. Tooltip menampilkan arti dan sintaks yang diperbolehkan untuk fungsi tersebut. |
| teks abu-abu | Sample | string | tidak ada | string dengan tanda kutip tunggal dan ganda ditampilkan dengan teks abu-abu |
| teks cyan | Sample | variabel yang diatur di halaman yang sama, | [nama atau kode SGQA]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang diatur di halaman yang sama dengan pertanyaan saat ini ditampilkan dengan teks cyan, yang menunjukkan bahwa variabel tersebut dapat diperbarui di JavaScript. Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum diatur). Jika jenis pertanyaan mengharapkan jawaban dari kumpulan nilai yang terdaftar, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks hijau | Sample | variabel yang diatur di halaman sebelumnya | [nama atau kode SGQA]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang diatur di halaman sebelumnya ditampilkan dengan teks hijau tebal. Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum diatur). Jika jenis pertanyaan mengharapkan jawaban dari kumpulan nilai yang terdaftar, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks merah muda tebal | Sample | variabel yang diatur di halaman berikutnya secara umum: kosong saat survei dimulai, tetapi dapat terisi melalui indeks atau tombol sebelumnya | [nama atau kode SGQA]: pertanyaan; nilai; answerList yang menampilkan kode untuk setiap nilai | Setiap variabel yang diatur di halaman berikutnya ditampilkan dengan teks merah muda tebal. Tooltip menampilkan namanya, pertanyaan sebenarnya, dan nilainya saat ini (atau kosong jika belum diatur). Jika jenis pertanyaan mengharapkan jawaban dari kumpulan nilai yang terdaftar, pemetaan kode ke nilai tampilan akan ditampilkan. |
| teks cokelat tebal | Sample | nilai pengganti Lime | nilainya | String Pengganti Lime (seperti {TOKEN:xxx}, {PRIVACY_MESSAGE}) ditampilkan dengan teks cokelat tebal. |
| teks merah | Sample | operator penugasan (=) | pesan peringatan | Jika Anda menggunakan operator penugasan (=), operator tersebut akan ditampilkan dengan teks merah. Ini untuk membantu mencegah penugasan ulang nilai yang tidak disengaja ketika Anda sebenarnya ingin memeriksa apakah a == b, bukan mengatur nilai a = b. |
| teks hitam biasa | Sample | tanda baca | tidak ada | Semua tanda baca lain di dalam ekspresi ditampilkan dengan teks hitam biasa. |
| teks dalam kotak merah | garis merah tebal mengelilingi kesalahan | kesalahan sintaks | deskripsi kesalahan | Setiap kesalahan sintaks yang terdeteksi ditampilkan dengan kotak merah di sekeliling kesalahan. Tooltip menampilkan kesalahannya. Contohnya meliputi tanda kurung yang tidak berpasangan, penggunaan fungsi yang tidak didefinisikan, pemberian jumlah argumen yang salah pada fungsi, ekspresi yang strukturnya buruk (misalnya operator hilang di antara variabel), mencoba menetapkan nilai baru ke variabel hanya-baca, mencoba menetapkan nilai ke bukan variabel, atau menggunakan sintaks yang tidak didukung. Perlu diperhatikan bahwa sistem pendeteksi kesalahan sintaks mungkin hanya melaporkan satu kesalahan dalam sebuah ekspresi meskipun ada beberapa kesalahan; namun, jika ada kesalahan yang terdeteksi, setidaknya satu kesalahan akan ditampilkan. |
Bacaan Tambahan
Contoh survei Expression Manager
Kasus Penggunaan dan Panduan Cara
Contoh Langkah demi Langkah
Fungsi statistik Expression Manager
Referensi untuk Pengembang










