ExpressionScript örnekleri
From LimeSurvey Manual
Yapı
Makalenin ilk bölümünde ifadelerin ne için kullanılabileceği ve bir ifadenin nerede bulunacağı/ekleneceği açıklanmaktadır. İkinci bölümde ise ifadelerin nasıl kullanılacağına ilişkin örnekler yer almaktadır.
İfade kategorileri
LimeSurvey, ifadeleri aşağıdaki amaçlarla kullanır:
İlinti
Amaç: Soru gruplarını/soruları gizlemek
İlinti, bir soru grubunun veya sorunun gösterilip gösterilmeyeceğini belirler. İfadenin sonucu "true" (yani 1) ise öğe gösterilir. Aksi halde (ifadenin sonucu "false" (yani 0) ise) öğe gizlenir.
Geçerlilik
Amaç: Sorular/alt sorular/yanıtlar üzerindeki girdileri/işlemleri doğrulamak
Geçerlilik, yanıtlayıcının bir soruya girdiği verinin veya yaptığı işlemin geçerli olup olmadığını denetler. İfadenin sonucu "true" (yani 1) ise öğeye ve geçerlilik iletisine "good" sınıfı uygulanır. Aksi halde, ifadenin sonucu "false" (yani 0) ise öğeye ve geçerlilik iletisine "error" sınıfı uygulanır. Bu sınıflar için bir biçem template.css dosyasında tanımlayabilirsiniz.
Yazı çıktısı
Amaçlar: (Bir işlem yapmak ve) bir yazı çıktısı vermek
Bir ifade, bir yazı çıktısı vermek için kullanılabilir. Örneğin bir şeyi sınayabilir veya hesaplayabilir ve çıktıyı sınamanın ya da hesaplamanın sonucuna göre belirleyebilirsiniz. Ayrıca ifadeden önce kullanılan bir sorunun soru yazısını, yanıtlarını, soru türlerini vb. eklemek için de kullanılabilir. Yazı çıktısı, bir yazının gösterildiği her yerde kullanılabilir ve her türlü sonucu döndürebilir.
| Kullanım durumu | Açıklama |
|---|---|
| Mikro uyarlama | Bir yazıyı uyarlayın; örneğin daha önce sorulan bir cinsiyet sorusuna göre "Bay" veya "Bayan" yazın |
| Hesaplama | Bir değeri hesaplayıp yazdırın; örneğin "Aile geliriniz xxx" |
| Başvuru | Bir öğeden yazı ekleyin; örneğin "Adınız xxx. Kaç yaşındasınız?" |
Yanıtların saklanması
Amaçlar: (Bir işlem yapmak,) (bir yazı çıktısı vermek) ve veritabanında bir şey saklamak
Denklem soru türü, veritabanında bir şey saklamak için kullanılabilir. Bir ifadeyle bir işlem yapabilir, Denklem sorusunu (yazı görünümü ile benzerdir) gösterebilir ve ifadenin sonucunu veritabanında saklayabilirsiniz. Yanıt, yanıtlar tablosuna kaydedilir. Ardından sonuç istatistik özelliğinde kullanılabilir veya LimeSurvey dışa aktarma işlevinin sunduğu biçimlerden birine aktarılabilir.
İfade örnekleri
Önceki bir sorudan yanıt eklemek
Bir yanıtı otomatik doldurmak için gizli denklem sorusu kullanmak
Sorun: Q1 ve Q2 adlı iki sorunuz olduğunu düşünün. Q1, yanıtlayıcılara yaşlarını sorar. Q2 ise yanıtlayıcıları üç gruba ayırır: yaş 20'nin altında, yaş 20, yaş 20'den büyük. Bu nedenle Q2, yukarıdaki koşullara karşılık gelen "1", "2", "3" değerlerini kullanmalıdır. Ayrıca Q2'yi görünmez yapmayı da unutmamalıyız (soru ankette görüntülenmez, ancak değerler "arka plan işlemi" ile yanıtlar tablosunda yer alır).
Denklem soru türünü kullanarak veritabanını doldurmak için:
- Önce Q1 kodlu bir soruyu Sayısal giriş sorusu olarak oluşturun.
- Ardından Q2 kodlu başka bir soruyu Denklem sorusu olarak oluşturun.
- Q2'nin "Görünüm ayarları" sekmesinde:
- "Bu soru her zaman gizlensin" alanını "Açık" olarak ayarlayın
- "Denklem" alanına şu ifadeyi yazın:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Yer tutucuları kullanarak özet sayfası oluşturmak
Bu eğitimde, anketin sonunda tüm soruları ve yanıtları ExpressionScript yer tutucuları aracılığıyla listeleyen bir özetin nasıl oluşturulabileceği gösterilmektedir. Ayrıca böyle bir özetin yalnızca yanıtlanan sorularla nasıl sınırlandırılacağı da anlatılmaktadır.
Örneğimizi buradan indirebilirsiniz: Yer tutucular anket örneği.
Burada kullanılan soru türleri:
1. Bir seçimli sorular / tek yazı/sayısal sorular
- Liste (açılan)
- Liste (radyo) [L]
- Evet/Hayır [Y]
- Uzun serbest yazı [T]
- Kısa serbest yazı [S]
- Sayısal giriş [N]
- Denklem [*]
2. Alt sorulu sorular
- Birkaç kısa yazı [Q]
- Birkaç seçim [M]
- Dizi [F]
- Dizi (Evet/Hayır/Kararsız) [C]
- Dizi (10 noktalı seçim) [B]
3. 2 ölçekli sorular
- Çift ölçekli dizi [1]
4. X ve Y ölçekli sorular
- Dizi (Rakamlar) [:]
5. Kalıp sorular
- Yazı görünümü [X]
Bu basit örnekte özetimiz şu biçimde basit bir liste olacaktır:
- Soru yazısı: Kullanıcının yanıtı
Bir seçimli sorular / tek yazı/sayısal sorular
Tüm bu soru türleri için LimeSurvey tek bir yanıt saklar:
- Liste (açılan)
- Liste (radyo)
- Açıklamalı liste
- 5 noktalı seçim
- Evet/Hayır
- Kısa serbest yazı
- Uzun serbest yazı
- Çok uzun serbest yazı
- Sayısal giriş
- Denklem
- Tarih
- Cinsiyet
Sorunun soru kodunun q1 olduğunu varsayarsak, soru yazısına ve yanıta şunu kullanarak başvurabiliriz:
- {q1.question}: {q1.shown}
Örnek:
- Kaç yaşındasınız?: 25
Sorunun yanıtlanıp yanıtlanmadığını kontrol etmek istiyorsanız, çıktınızın etrafına bir IF ifadesi koyabilirsiniz:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
Bu ifade şu anlama gelir: EĞER q1 kodlu soru boş değilse, "- " VE soru yazısı VE ": " VE yanıt yazısını çıktı olarak ver (join() işlevi öğeleri yeni bir dize olarak birleştirir); DEĞİLSE: hiçbir şey çıktılama ("" boş dize anlamına gelir).
Alt sorulu sorular
Tüm bu soru türleri için LimeSurvey alt soruları kullanır:
- Birkaç kısa yazı
- Birkaç seçim
- Açıklamalar ile birkaç seçenek
- Dizi
- Dizi (5 noktalı seçim)
- Dizi (10 noktalı seçim)
- Dizi (Evet/Hayır/Kararsız)
- Dizi (Artış/Aynı/Düşüş)
- Sütuna göre dizi
Sorunun soru kodunun q2 ve alt soruların SQ001, SQ002 şeklinde numaralandırıldığını (otomatik numaralandırma LimeSurvey tarafından yapılır) varsayarsak, soru yazısına ve yanıta şunu kullanarak başvurabiliriz:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
Birkaç seçimli sorularda, işaretlenen alt sorunun yazısını göstermek yerine seçilen her seçenek için bir Y göstermek mantıklıdır:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Şu anda alt sorulu soruların soru yazısını çıktılamanın mümkün olmadığını unutmayın, bkz. bu özellik isteği.
Örnek 1 (soru türünün Birkaç seçim olduğu varsayılarak)
- Bu araba markalarını biliyor musunuz?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Yalnızca işaretlenmiş ögeleri çıktı olarak almak istiyorsanız, çıktınızın etrafına bir IF ifadesi ekleyip onay kutusunun değerini kontrol edebilirsiniz:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Yalnızca Seçilmiş ögelerin listesini çıktı olarak almak istiyorsanız listifop işlevini kullanın, örneğin: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
Burada that.q2 , q2'nin tüm alt sorularına genişler. Daha fazla ayrıntı için bkz. self, this ve that.
Örnek 2 (soru türünün Dizi (10 noktalı seçim) olduğu varsayılarak)
- Lütfen aşağıdaki araba markalarının kalitesini 1=çok kötü ile 10=çok iyi arasındaki bir ölçekte derecelendirin?
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Yalnızca derecelendirilmiş ögeleri çıktı olarak almak istiyorsanız, çıktınızın etrafına bir IF ifadesi ekleyip geçerli alt sorunun yanıtlanıp yanıtlanmadığını şu şekilde kontrol edebilirsiniz:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Örneğin yalnızca sekizden büyük Seçilmiş ögelerin listesini çıktı olarak almak istiyorsanız listifop işlevini kullanın, örneğin: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
İki ölçekli soru
Aşağıdaki kodların kullanıldığını varsayalım:
- Soru kodu: q4
- Alt soru kodları: SQ001, SQ002, ...
- Ölçek 1 Yanıt kodları: A1, A2, ...
- Ölçek 2 Yanıt kodları: B1, B2, ...
Üçüncü alt sorunun ve ikinci ölçeğin yanıtına başvuru örneği: q4_SQ003_1 - Soru 4, alt soru 3, ikinci ölçek.
Her iki ölçek ve ilk iki alt soru için sonuçları çıktı olarak alalım:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
Alt soru metnini çıktı olarak almak için yer tutucuya ölçek kimliğini eklemeniz gerekir (metinler her iki ölçek için de aynı olsa da). Bu nedenle {q4_SQ001.question} yerine {q4_SQ001_0.question} veya {q4_SQ001_1.question} kullanmamız gerekir.
Alt soruların sonuçlarını yalnızca en az bir yanıt içerenler için dışa aktarmak/görüntülemek istiyorsanız, her alt soru için şu sözdizimini kullanın:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
X ve Y ölçekli soru
Bu, her hücre için yanıta izin veren (daha önce gösterildiği gibi yalnızca her satır için değil) tüm matris sorular için geçerlidir:
- Dizi (Metinler)
- Dizi (Rakamlar)
Kullanıldığı varsayılan kodlar:
- Soru kodu: q5
- Alt soru kodları: SQ001, SQ002, ...
- Yanıt kodları: A1, A2, ...
Belirli bir sütundaki belirli bir alt sorunun sonucuna başvurmak için QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode biçimini kullanmanız gerekir. Üçüncü alt sorunun ve ikinci sütunun yanıtına başvurmak için örnek: q5_SQ003_A2.
İlk iki alt sorunun 1-3. sütunlarının sonuçlarını çıktı olarak verelim:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
Bu soru türlerinde her hücre (X ekseni ve Y ekseni kombinasyonu) bir yanıt seçeneğine karşılık geldiğinden, mevcut verilerin kontrolü her hücre için yapılmalıdır. Örnek:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
Önceki sorunun yanıtı boşsa soruyu gizleme
| Amaç | Önceki sorunun yanıtı boşsa soruyu gizleme |
| Tür | Soru ilintisi |
| Örnek | Birinci soru: soru kodu "name", soru yazısı "Adınız nedir?" İkinci soru: soru yazısı "{name}, kaç yaşındasınız?" Yapılacak: Birinci sorunun metin alanı boşsa ikinci soruyu gizle |
| İfade | !is_empty(name) |
| Açıklama | is_empty() bir değişkenin boş kabul edilip edilmediğini belirler. "!" sonucu tersine çevirir. Dolayısıyla değişken boş değilse ifade doğru olur ve soru gösterilir |
| Adımlar | İkinci soruyu oluşturun/düzenleyin "İlinti denklemi:" alanına "!is_empty(name)" yazın |
| Örnek dosya | Hide_question_if_empty_question_group.zip |
![]()
| |
Önceki sorunun yanıtı Evet veya Hayır ise soru grubunu gizleme
| Amaç | Önceki sorunun yanıtı Evet veya Hayır ise soru grubunu gizleme |
| Tür | Soru grubu ilintisi |
| Örnek | Birinci sayfa, birinci soru grubu, birinci soru: soru kodu "PET", soru yazısı "Evcil hayvanınız var mı?" -Evet -Hayır İkinci sayfa, ikinci soru grubu: Başlık "Evcil hayvanlarınız hakkında" Yapılacak: Birinci sorunun yanıtı Evet/Hayır ise ikinci soru grubunu göster/gizle |
| İfade | PET == "Y" |
| Açıklama | PET, yanıtını kontrol etmek istediğiniz sorunun soru kodudur. Bir son ek kullanmazsanız EM "Qcode.code" kullanır. Böylece PET sorusunun yanıt kodunu "Y" değeriyle karşılaştırırsınız. Katılımcı "Evet" yanıtını verirse ifade doğru olur ve "Evcil hayvanlarınız hakkında" soru grubu gösterilir. |
| Adımlar | İkinci soru grubunu oluşturun/düzenleyin "İlinti denklemi:" alanına "PET == "Y"" yazın |
| Örnek dosya | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Çoklu yanıt girişli soru alanının değerini görüntüleme
| Amaç | Çoklu yanıt girişli soru alanının değerini görüntüleme |
| Tür | Başvuru |
| Örnek | Birinci soru: soru kodu "AskChildAge", soru yazısı "Çocuklarınız kaç yaşında?". Alt soru kodları -Child1 -Child2 -Child3 - ChildXXX İkinci soru: soru kodu "ReportChildAge", soru yazısı "İlk çocuğunuz hakkında: - CHILD1 AGE1 yaşında." |
| İfade | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| Açıklama | Bir alt sorunun değerini sonraki bir soruda kullanmak istiyorsunuz. Alt soru değerine şu tür bir ifadeyle erişebilirsiniz: QcodeQuestion_QcodeSubquestion.value |
| Adımlar | İkinci soruyu oluşturun/düzenleyin Açıklamaya şu metni ekleyin: "İlk çocuğunuz hakkında: - {AskChildAge_Child1.question} {AskChildAge_Child1.value} yaşında." |
| Örnek dosya | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
"Dizi (Rakamlar) İşaret kutusu" sorusunda satır başına işaretlenen kutu sayısını doğrulama
| Amaç | Satır başına işaretlenen kutu sayısını doğrulama |
| Tür | Doğrulama |
| Örnek | "Dizi (Rakamlar) (İşaret kutusu yerleşimi)" türünde soru |
| İfade | sum(...) |
| Açıklama | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) ifadesi, A satırında en az X işaret kutusunun işaretlenip işaretlenmediğini belirler. Üç satırın (A, B, C) tümünü kontrol etmek isterseniz ifadeyi "&&" ile birleştirebilirsiniz: (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| Adımlar | "Dizi (Rakamlar) (İşaret kutusu yerleşimi)" türünde bir soru oluşturun/düzenleyin. Yukarıdaki ifadeyi gelişmiş soru ayarlarındaki "Soru geçerliliği denklemi" alanına ekleyin (değişken adlarını uyarlamanız gerekebilir!). |
| Örnek dosya | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
İki tarih arasındaki farkı hesaplama
| Amaç | İki tarih arasındaki farkı hesaplama |
| Tür | İlinti / Denklem soru türü / Doğrulama |
| Örnek | Birinci soru (tarih/saat, kod: DOB): Doğum tarihiniz nedir? İkinci soru (tarih/saat, kod: datetoday): Bugünün tarihi nedir? Üçüncü soru (boilerplate): XXXX günlüksünüz. Yapılacak: 1. soruda verilen tarih ile 2. soru arasındaki gün sayısını hesapla ve görüntüle. |
| İfade | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| Açıklama | strtotime, 1 Ocak 1970 ile verilen tarih arasındaki saniye sayısını hesaplar. Yukarıdaki ifade, verilen iki tarih arasındaki saniye sayısını hesaplar. "/60/60/24" terimi ise saniye sayısından gün sayısını hesaplar. "datetoday" değerini sormak yerine strtotime('now') veya doğrudan Ocak 1970'ten şimdiye (yani anketin yapıldığı ana) kadar geçen saniye sayısını döndüren time() işlevini de kullanabilirsiniz. Böylece bir kişinin yaşını {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} denklemiyle hızlıca yıl olarak bulabilirsiniz. Bu durumların hepsinde tarihin uygun bir biçimde girilmesi çok önemlidir; aksi halde strtotime() işlevi doğru çalışmaz. |
| Adımlar | İki tarih sorusu (doğum tarihi ve bugünün tarihi için) ile bir boilerplate sorusu oluşturun. Boilerplate sorusunun soru yazısına şunu ekleyin: "{datetoday} tarihinde {(strtotime(today)-strtotime(dob))/60/60/24} günlüktünüz." Lütfen unutmayın: strtotime işlevi ÇOK sayıda tarih biçimiyle çalışabilir ancak hepsiyle değil. Sorun yaşarsanız anketinizin tarih biçimini mm/dd/yyyy, yyyy-mm-dd veya dd.mm.yyyy olarak ayarlayın." |
| Örnek dosya | Date_difference.zip |
| |
Değerlendirmeler için ExpressionScript kullanımı
İşte ExpressionScript'in Dizi türü sorular ve değerlendirmelerle nasıl kullanılacağına dair başka bir örnek:</ br>
Diyelim ki 2 dizi sorunuz var ve hesaplama sonuçlarını veritabanınıza kaydetmek istiyorsunuz. Aslında çok basit; dizilerinizi oluşturup test etmeniz ve çalışıp çalışmadığını görmek için sahte bir yanıt göndermeniz yeterlidir; sonuçları tamamlanma sayfasında görürsünüz.
Uygulama ayrıntıları:
- denklem türünde bir soru ekleyin
- Q1'in dizi sorunuzun soru kodu, Q2'nin ise ikinci soru olduğunu varsayarak aşağıdaki satırı ekleyin:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
SQ001'in herhangi bir alt soru için varsayılan kod olduğunu unutmayın. Alt soru kodunu değiştirirseniz yukarıdaki denklemi buna göre uyarlayın.
Dizide em_validation_q kullanımı
Bir diziyi herhangi bir koşulla denetlemek için soru geçerliliği denklemi özelliğini kullanabilirsiniz.
Uygulama ayrıntıları:
- birinci dizi için: tekli seçim dizisi
- Soru kodu ARRAY
- Alt soru kodları SQ01, SQ02, SQ03 ve SQ04
- Tüm soru için geçerlilik denklemini güncelleyin ve şunu yazın:
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- ikinci dizi için: metin dizisi
- Soru kodu ARRAYTEXT
- Y eksenindeki alt soru kodları SY01, SY02, SY03 ve SY04
- Tüm soru için geçerlilik denklemini güncelleyin ve şunu yazın:
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








