ExpressionScript - Sunum
From LimeSurvey Manual
Giriş
LimeSurvey, daha karmaşık dallanma, değerlendirme, doğrulama ve uyarlama işlemlerini destekleyebilmek için İfade betiğini kullanır. İfade betiği, LimeSurvey'in arka planda Değiştirmeleri, Koşulları ve Değerlendirmeleri yönetme biçiminin yerini alır. Ayrıca çalışma anındaki veritabanı okumalarının çoğunu ortadan kaldırdığı için işlem hızını önemli ölçüde artırır. İfade betiği Dr. Thomas White (TMSWhite) tarafından geliştirilmiştir.
Temel tanımlar
- İfade: Süslü parantezler arasında yer alan her şey:
- Açılış parantezinden hemen sonra ya da kapanış süslü parantezinden hemen önce boşluk bulunmadığı sürece geçerlidir.
- İfadenin içeriği EM tarafından değerlendirilir; bu nedenle matematiksel formüller, işlevler ile karmaşık dizgi ve tarih işlemleri içerebilir.
- Uyarlama: Bazen "piping" olarak da adlandırılır. Metni koşullu olarak değiştirme işlemidir:
- Tüm 'değiştirme alanlarına', katılımcı verilerine ve yanıt verilerine erişebilirsiniz.
- Ayrıca sorulara, yanıtlara ve bunların özelliklerine daha kolay erişebilirsiniz.
- İlinti denklemi: Sorunun görünürlüğünü denetleyen yeni bir soru özniteliği:
- Bir ilinti denklemi varsa soru yalnızca ilinti doğru olarak değerlendirilirse gösterilir.
- Dahili olarak tüm array_filter ve array_filter_exclude komutları alt soru düzeyinde ilintiye dönüşür.
- SGQA (değişkenlerin geçmişte adlandırılma biçimi):
- Survey-Group-Question-Answer (Anket-Grup-Soru-Yanıt) anlamına gelir.
- SGQA değişken adları 123X5X382X971 gibi görünür ve alt soru sonekleri içerebilir.
- Bu değişken adları, temelde yer alan S/Q/G/A veritabanı kodlarına özgüdür; bu nedenle sık sık değiştirilmeleri gerekir.
- Denklem soru türü: Hesaplamaları veya raporları veritabanına kaydeden yeni bir soru türü:
- Boilerplate sorusuna benzer, ancak "Bu soru her zaman gizlensin" seçeneğini ayarlasanız bile içeriği veritabanına kaydedilir.
- Soru kodu: EM için tercih edilen değişken adıdır:
- Sorunun amacını belirten açıklayıcı bir ad olabilir; bu da karmaşık mantığın okunmasını kolaylaştırır.
- Geçerli soru kodları bir rakamla BAŞLAMAMALIDIR; bu nedenle soru kodunu soruları numaralandırmak için kullanırken yalnızca "q1", "q1a" veya "g1q2" gibi kodlar kullanın.
- Verileri SPSS veya R'ye dışa aktarırsanız değişken adı bu olur. Bu nedenle istatistiksel analiz yapıyorsanız yalnızca benzersiz soru kodları oluşturmanız gerekir.
İfade betiğini kullanmak zorunda mıyım?
Kısa cevap "hayır". Ancak bu, büyük ölçüde oluşturmak istediğiniz anketin karmaşıklığına bağlıdır.
Örneğin Koşul düzenleyicisi, anketinizin sorularına uygulanabilecek bazı temel ifadeleri kapsar. Ancak Koşul düzenleyicisi sınırlıdır. İfade betiğinin kullanılmasının nedeni budur; özelleştirme olanaklarının kapsamını genişletir.
Koşulları ve İlinti denklemlerini birlikte kullanabilir miyim?
Evet. Bazı sorular için Koşul düzenleyicisini, diğerleri için İlinti denklemlerini kullanabilirsiniz.
Aynı soruda hem koşullar hem de ifadeler tanımlayamazsınız! Bir koşul tanımlandığında, ilinti denklemi alanına yazılmış olan her ifadenin yerini alır. Ayrıca İlinti denklemi alanı artık el ile düzenlenemez.
Yine de bir soru içinde hem ifadeleri hem de koşulları kullanmanın bir yolu vardır. Yukarıda belirtildiği gibi bir koşul, ilinti denklemi alanının yerini alır. Bu gerçekleştikten sonra yeni oluşturulan denkleme bakın ve bir metin düzenleyicisine kopyalayın. Yeni oluşturulan koşulu Koşul düzenleyicisinden silin, ardından metin düzenleyicisi dosyanızdaki koşul tabanlı ifadeleri kullanmak istediğiniz diğer ifadelerle birlikte ekleyerek soruyu düzenleyin.
Koşullar ile İlinti arasında nasıl seçim yapmalıyım?
Her bir biçemin artı ve eksi yönlerinin listesi aşağıdadır:
| Biçem | Artıları | Eksileri |
|---|---|---|
| Koşullar | 1. Basit koşullar oluşturmak için güzel bir grafik arayüz. 2. Grafik arayüz iyi belgelenmiştir ve destek ekibi tarafından iyi bilinir |
1. Yalnızca basit karşılaştırmaları destekler ve "VE" ile "YA DA" koşullarını iyi işlemez. 2. Basamaklı koşullar düzensiz çalışır 3. Yavaştır - veritabanını yoğun kullanır; uzun anketleri yavaşlatabilir. 4. Koşulların yeniden yüklenmesiyle ilgili bazı sorunlar bildirilmiştir. 5. Düzinelerce, yüzlerce veya binlerce soru olduğunda grafik arayüz iyi ölçeklenmez. 6. SGQA adlarını kullanmak zorunda olduğundan kağıt tabanlı anketleri dönüştürmek yavaş olabilir. 7. Karmaşık dallanma için gereken mantığı özel olarak kodlamak çoğunlukla bir programcı gerektirir. |
| İlinti | 1. 80'den fazla işlev ve matematik/dizgi işleci dahil çok karmaşık mantığı destekler. 2. Basamaklı mantık için mükemmel destek. 3. Hızlıdır - ek veritabanı çağrısı yoktur, 1000'den fazla soruluk anketleri destekler. 4. SGQA kodları gerektirmediği için mantığın yeniden yüklenmesinde sorun yoktur. 5. Sözdizimi vurgulama, 1000'den fazla soruluk anketlere ölçeklenir. 6. Mevcut kağıt tabanlı anketleri bilgisayar ortamına aktarmak isteyen gruplar için kolay ve hızlıdır. 7. Yarı yapılandırılmış görüşmeleri ve epidemiyolojik anketleri programcıya ihtiyaç duymadan kolayca destekler. |
1. Basit koşullar için grafik arayüz yoktur - bunun yerine sözdizimi vurgulamayı kullanır. |
- İhtiyaçlarınıza en uygun olanı kullanmanızı öneririz.
- EM özellikleri hakkında daha ayrıntılı bilgi için aşağıdaki bağlantıya tıklayın.
Başlarken
EM ile başlamanın en iyi yolu şunlardır:
- En son kararlı sürümü https://www.limesurvey.org/en/download adresinden kurun.
- Bazı örnek anketleri içe aktarın ve inceleyin.
- Kullanım durumlarını ve nasıl yapılır kılavuzlarını ve adım adım örnekleri inceleyin.
- EM belgelerini (bu sayfa) inceleyin
- Yalıtılmış İfadelerin Birim Testleri (ileri düzey)
- tüm EM işlevlerinin ve işleçlerinin kullanım örneklerini ile PHP ve JavaScript sonuçlarını gösterir;
- PHP ve JavaScript sürümlerinde farklı sonuçlar üreten birkaç işlev olduğunu unutmayın; bu sayfa, EM mantığınızı buna göre planlamanızı sağlar.
- Yalıtılmış İfadelerin Birim Testleri (ileri düzey)
Terminoloji
Bu sözcükler EM'nin yeteneklerini tanımlamak için yaygın olarak kullanılır:
- İlinti tabanlı dallanma - bir soru ilintiliyse sorulur, değilse sorulmaz (ör. görünmez yapılır ve veritabanında NULL olarak işaretlenir). İlinti alanlarını soru düzenleyici panelinde ve soru grubu düzenleyici panelinde bulabilirsiniz. İkincisi, aynı koşulu her soruya kopyalamadan bir grubun tamamına bir dizi koşul uygulamak ve/veya grup ve soru düzeyindeki koşullu mantığı birleştirmek için kullanılır.
- Uyarlama - Hangi soruların sorulacağını belirledikten sonra uyarlama (bazen piping olarak adlandırılır) sorunun nasıl sorulacağını belirler. Bu, yalnızca basit yer değiştirmeyi ({TOKEN:FIRSTNAME} gibi) değil, aynı zamanda deneklerinizin cinsiyetine veya sayısına göre fiil çekimini ve isim hâllerini de desteklemenizi sağlar. Ayrıca bir anket katılımcısına ilettiğiniz iletiyi, diğer soruları yanıtlayıp yanıtlamadığına (veya nasıl yanıtladığına) göre değiştirmenize olanak tanır.
- Denklemler - EM, bir İfadenin sonucunu saklayan Denklem adlı yeni bir soru türü ekler. Denklem sonuçları, sayfada gizleseniz bile hesaplanır ve veritabanına yazılır. Bu nedenle gizli puanlama hesaplamaları, karmaşık denklemlere dayalı gezinme, değerlendirmeler ve veritabanında oluşturulup saklanacak raporlar için kullanılırlar.
İlinti ve Basamaklı İlinti
Artık her soru türünün, sorunun görüntülenip görüntülenmeyeceğini denetleyen bir İlinti seçeneği vardır. EM, her İlinti denklemini ankette göründükleri sırayla işler. İfade doğruysa (veya eski anketleri desteklemek için eksikse) soru görüntülenir. İlintili değilse soru gizlenir ve değeri veritabanında NULL yapılır. Bir grupta ilintili soru yoksa grubun tamamı atlanır.
Ayrıca bir ifade içindeki değişkenlerden herhangi biri ilintisizse ifade her zaman yanlış olarak değerlendirilir. Bu, her soru için çok uzun İlinti denklemleri yazmak zorunda kalmamanız için Basamaklı ilinti sağlar.
Q1-Q5 olmak üzere beş sorunuz olduğunu ve Q2'yi yalnızca Q1 yanıtlandıysa, Q3'ü Q2 yanıtlandıysa vb. göstermek istediğinizi varsayalım. İlinti denklemleri şöyle olabilir:
| Soru kodu | İlinti | Soru |
|---|---|---|
| Q1 | 1 | Adınız nedir? |
| Q2 | Q1 | {Q1}, kaç yaşındasınız? |
| Q3 | Q2 | Demek {Q2} yaşındasınız. Evli misiniz? |
| Q4 | Q3 == "Y" | {Q1}, ne kadar zamandır evlisiniz? |
| Q5 | Q4 | {Q1}, kaç çocuğunuz var? |
Grup düzeyinde ilinti
ExpressionScript grup düzeyinde ilintiyi de destekler. Bu, döngü uygulamayı kolaylaştırır. Önce kaç varlık için takip yapılması gerektiğini belirleyerek (örneğin bir hanede kaç kişi yaşadığını sorarak veya uzun bir listeden hangi ürünleri beğendiklerini işaretlettirerek) en fazla 10 varlıktan (ürünler veya bir haneden kişiler gibi) bilgi toplamak istediğinizi varsayalım. Kaç varlık için takip gerektiğini öğrendikten sonra, 10 takip sorusu grubunun her biri için {count >= 1}, {count >=2}, ... {count >= 10} gibi grup düzeyinde ilinti kullanabilirsiniz. Her grubun içinde soru düzeyinde koşullu mantık bulundurabilirsiniz (ör. her denek için cinsiyete veya yaşa özgü takip soruları). Hangilerinin gösterileceğini belirlemek için soru ve grup düzeyindeki ilinti denklemleri VE ile birleştirilir.
Böyle bir örneği incelemek için şu anketi içe aktarın: Nüfus sayımı anketi örneği.
Aşağıdaki ekran görüntüsünde, yanıtlayıcı en az bir kişiyle daha birlikte yaşıyorsa Kişi 1 grubunun görüntülendiği (veya ilintili olduğu) görülebilir:

Uyarlama/Yönlendirme
Küme parantezleri içindeki her şey artık bir İfade olarak değerlendirilir (aşağıda açıklanan bir istisna dışında). İfadeler tüm LimeReplacementField alanlarına ve değişkenlere (çeşitli takma adlar aracılığıyla), tüm tipik denklem işleçlerine (matematiksel, mantıksal ve karşılaştırma) ve onlarca işleve (istemci tarafında bile dinamik olarak çalışan) erişebilir.
Bu denklemleri kullanarak şunlar gibi işlemler yapabilirsiniz:
- Önceki yanıtlara göre katılımcılara koşullu olarak uyarlanmış iletiler göstermek;
- Değerlendirmeler oluşturmak ve değerlendirme sonuçlarını göstermek (veya bu sonuçlara göre koşullu olarak dallanmak ya da ileti göstermek); bunların tümünü değerlendirme modülünü kullanmadan yapabilirsiniz;
- Sorular, yanıtlar ve raporlar içinde fiilleri çekimlemek ve adları çekimlemek;
- Anketin sonundaki "Yanıtlarınızı gösterin" sayfasından önce yanıt özetlerini göstermek.
Denklemler
Denklem adında yeni bir soru türü vardır. Bunu bir Yazı görünümü soru türü gibi düşünebilirsiniz; farkı, görüntülenen değerin veritabanında saklanmasıdır. Dolayısıyla Denklem sorusunun yazısı bir Değerlendirme hesaplaması içeriyorsa, bu değer veritabanında bir değişkende saklanır ve herkese açık ya da özel istatistiklerde görüntülenebilir.
Sözdizimi
Küme parantezleri içindeki her şey artık bir İfade olarak kabul edilir (bir istisna ile: başta veya sonda boşluk bulunmamalıdır - bu, ExpressionScript'in gömülü JavaScript kodunu işlemeye çalışmamasını sağlamak için gereklidir).
Açılış küme parantezinden sonra veya kapanış küme parantezinden önce boşluk olmadığı sürece ifadelerin birden çok satıra yayılmasında bir sakınca olmadığını unutmayın. Bu durum özellikle şu gibi iç içe "if()" deyimleri için yararlıdır:
{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',
''
)
)
)
)
)
)
)
)}
ExpressionScript aşağıdaki sözdizimini destekler:
- Tüm standart matematiksel işleçler (ör. +,-,*,/,!);
- Tüm standart karşılaştırma işleçleri (ör. <,<=,==,!=,>,>=, ayrıca bunların eşdeğerleri: lt, le, eq, ne, gt, ge);
- Parantezler (alt ifadeleri gruplayabilmeniz için);
- Koşullu işleçler (ör. &&,| | ve bunların eşdeğerleri: and, or);
- Tek ve çift tırnaklı dizgiler (her biri diğer tırnak türüyle dizgiler içerebilir);
- Virgül işleci (bir ifade listesi oluşturup yalnızca son sonucu döndürebilirsiniz);
- Atama işleci (=);
- Önceden tanımlı değişkenler (sorulara, soru özniteliklerine ve yanıtlara başvurmak için) - ör. SGQA kodları;
- Önceden tanımlı işlevler (şimdiden 80'den fazlası var ve daha fazlasını eklemek kolaydır).
İşleçler
EM sözdizimi normal işleç önceliğini izler:
| Düzey | İşleç(ler) | Açıklama |
|---|---|---|
| 1 | () | gruplama veya işlev çağırma için parantezler |
| 2 | ! - + | tekli işleçler: değil, olumsuzlama, tekli artı |
| 3 | * / | çarpma, bölme |
| 4 | + - | toplama, çıkarma |
| 5 | < <= > >= lt le gt ge | göreli karşılaştırmalar |
| 6 | == != eq ne | eşitlik karşılaştırmaları |
| 7 | and | mantıksal VE |
| 8 | or | mantıksal VEYA |
| 9 | = | atama işleci |
| 10 | , | virgül işleci |
Sayı ile dizgi uyuşmazlığı ve alfabetik/sayısal karşılaştırma uyarısı
Değerleri göreli veya eşitlik karşılaştırmalarıyla karşılaştırmak istediğinizde uyuşmazlıklara dikkat edin. Kullanıcı tarafından girilen (veya yanıt koduyla sağlanan) bir değer, açıkça bir sayıysa sayı olarak kullanılabilir.
Değerlerden birini " ile çevrelerseniz metin/dizgi karşılaştırması yapılır. Sayı olarak karşılaştırmak istiyorsanız bir sayıyı asla " ile çevrelemeyin.
Örneğin Q0.NAOK > "50" ifadesi, Q0.NAOK değeri 9 olan sayısal bir soruysa doğrudur. Bunun nedeni, > işlecinin bunu sayısal değil alfabetik bir karşılaştırma olarak varsaymasıdır.
Tamsayı değerlerini karşılaştırdığınızdan emin olmak için intval(Q0.NAOK) > 50 kullanabilirsiniz. Q0.NAOK bir sayı değilse (boşsa veya bir dizgiyse) intval(Q0.NAOK) === 0 olacağını unutmayın. Dizgi değerlerini ("A" < "B") karşılaştırmak için doğrudan strcmp kullanın: strcmp(Q0.NAOK,"B") veya strcmp(Q0.NAOK,"A5").
Atama İşleci (=) kullanımı hakkında uyarı
Beklenmedik yan etkilere neden olabileceğinden, kesinlikle gerekli olmadıkça atama işleçlerini kullanmaktan kaçınmalısınız. Örneğin önceki bir yanıtın değerini değiştirirseniz, o soru ile geçerli soru arasındaki basamaklı uygunluk ve doğrulama mantığı yeniden hesaplanmaz; bu nedenle kendi içinde tutarsız verilerle karşılaşabilirsiniz (ör. yanıtlı kalan ama NULL yapılması gereken sorular veya atlanan ama yanıtlanması gereken sorular). Genel olarak, bir değişkene değer atamak istiyorsanız bir Denklem soru türü oluşturmalı ve değerini ayarlamak için bir ifade kullanmalısınız. Ancak insanların bu işlece gerçekten ihtiyaç duyduğu nadir durumlar olduğundan bunu kullanıma sunduk.
Bu işleç konusunda sizi uyarmaya yardımcı olmak için, sözdizimi denklemlerinde kırmızı yazı tipiyle gösterilir (böylece "==" ile karıştırmazsınız).
Atama işlecini kullanma
Atama işlecini kullanmak isteyebileceğiniz başlıca nedenler şunlardır:
- Varsayılan değerleri kabul etmeyen bir soru için (kullanıcı arayüzünün yanıt seçeneklerinden birini seçmenize izin verdiği ancak denklem girmenize izin vermediği liste radyo gibi) varsayılan değeri denklemle ayarlamanız gerekir. Ancak dikkatli olun, çünkü LimeSurvey denkleminizin o soru için izin verilen yanıtlardan birini üretip üretmediğini doğrulayamaz;
- Sonraki bir yanıta göre önceki bir sorunun yanıtını zorla değiştirmeniz gerekir;
- vb...
Bu amaç için tüm ifade yöneticisi sistemini kullanabilirsiniz. Bunun için bir Denklem kullanmak daha iyidir.
Bazı örnekler:
- Kısa yazı türündeki bir sorunun yanıtını küçük harfe ayarlamak :
{QCODE=strtolower(QCODE.NAOK)}; - Anketin başında bir dizi soru türü için varsayılan yanıt ayarlamak :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Anketin başında bir dizi yazı soru türü için varsayılan yanıt ayarlamak :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Koşullu bir yanıt ayarlamak :
{QCODE=if(YesNo="Y","A1","")}.
XSS güvenliği
XSS etkinleştirildiğinde, ifade yöneticisi sisteminin bazı bölümleri kullanılamaz:
- bir ifadede bir HTML etiketini başlatıp başka bir ifadede bitirmek;
- bir URL içinde karmaşık bir ifade kullanmak.
Örnekler ve çözüm yolları:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}ifadesi XSS güvenliği ile çalışmaz; bunun yerine şunu kullanabilirsiniz:{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>için bir denklem sorusu kullanabilirsiniz, çünkü tam bir soru kodu kullanmak sorun değildir:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Değişkenlere erişim
ExpressionScript, ihtiyaç duyabileceğiniz tüm değişkenlere salt okunur erişim sağlar. Geriye dönük uyumluluk için aşağıdakilere erişim sağlar:
- TOKEN:xxx - bir kodun (TOKEN) değeri (ör. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (yalnızca anonim anket olmayanlar için).
- Temalar tarafından kullanılan tüm {XXX} değerleri.
- Soru yazısında, soru kimliği ile değiştirilen {QID} ve sorunun SGQA değeri ile değiştirilen {SGQ} ifadelerini kullanabilirsiniz.
- Geçerli yanıt kimliği için {SAVEDID}
Buna ek olarak ExpressionScript, değişkenlere Soru kodu ile (veri tabanındaki sorular tablosunda yer alan 'title' sütunu) başvurmanızı sağlar. Bu, verilerinizi SPSS, R veya SAS'a dışa aktardığınızda kullanılan değişken etiketidir. Örneğin ad, yaş ve cinsiyet ile ilgili sorularınız varsa, bu değişkenleri 12345X13X22, 12345X13X23 ve 12345X13X24 yerine name, age ve gender olarak adlandırabilirsiniz. Bu, denklemlerin herkes tarafından okunmasını ve mantığın doğrulanmasını kolaylaştırır; ayrıca grup veya soru numaralarını takip etmek zorunda kalmadan soruların yerini değiştirmenizi sağlar.
Önemli: Önceki sayfalarda veya sorularda yer alan değişkenlere başvurmak daha güvenlidir.
Ayrıca ExpressionScript, sorunun birçok özelliğine erişmenizi sağlar:
| Sözdizimi | Anlamı | Örnek | Örnek sonuç |
|---|---|---|---|
| Qcode | Qcode.code için bir takma ad | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | soru ilintiliyse sorunun seçilen yanıt kodu (aksi halde boş), kodlanmış bir soru değilse metin değeri | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | Qcode ile aynı - NAOK ile ilgili açıklamaya bakın | {gender.NAOK} | 'M' |
| Qcode.value | soru ilintiliyse sorunun değerlendirme değeri (aksi halde boş), kodlanmış bir soru değilse metin değeri | {gender.value} | '1' |
| Qcode.valueNAOK | Qcode.value ile aynı - NAOK ile ilgili açıklamaya bakın | {gender.valueNAOK} | '1' |
| Qcode.shown | sorunun görüntülenen değeri | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | sorunun yazısı | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | sorunun zorunlu olup olmadığı (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | dahili soru numarası (sıra numarası değil) | {gender.qid} | 337 |
| Qcode.type | soru türü | {gender.type} | 'G' |
| Qcode.jsName | sorunun bu sayfada bildirilip bildirilmediğine bakılmaksızın doğru javascript adı | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | dahili grup numarası (sıra numarası değil) | {gender.gid} | 3 |
| Qcode.qseq | sorunun 0'dan başlayan sıra numarası | {gender.qseq} | 5 |
| Qcode.gseq | grubun 0'dan başlayan sıra numarası | {gender.gseq} | 1 |
| Qcode.relevanceStatus | sorunun şu anda ilintili olup olmadığı (0 veya 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | soru düzeyindeki ilinti denklemi | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | grup düzeyindeki ilinti denklemi | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | bu sorunun SGQA değeri | {gender.sgqa} | '1827X3X337' |
HTML düzenleyici sorunu
HTML düzenleyiciyi kullanırsanız bazı karakterler HTML varlıklarıyla değiştirilir.
- & yerine &
- < yerine <
- > yerine >
HTML düzenleyiciyi kullanıyorsanız şunları kullanmanız gerekir:
- & için and
- < için lt
- <= için le
- > için gt
- >= için ge
İfadenizin içinde yer alan HTML kodlarını temizlemeniz önerilir. LimeSurvey HTML düzenleyicisini kullanıyorsanız, düzenleyicinin sol üst kısmında bulunan "Kaynak" düğmesine tıklayın ve ifadenizle ilgili olmayan tüm karakterleri silin (ör.
,
vb.).
Qcode değişken adlandırması
Soru türüne göre bir Qcode'un nasıl oluşturulacağına (ve bazı özelliklere nasıl erişileceğine) ilişkin ayrıntılar aşağıdadır. Genel olarak Qcode'lar şu şekilde oluşturulur:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Açıklama (comment) ve diğer (other) için karşılık gelen soru kodları sırasıyla QuestionCode_comment ve QuestionCode_other şeklindedir.
| Tür | Açıklama | Kod | Alt sorular | Yanıt seçenekleri | Ölçekler | Yanıt kodu | Görüntülenen yanıt | İlinti |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 noktalı seçim, radyo düğmeleri | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Dizi (10 noktalı seçim), radyo düğmeleri | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Dizi (5 noktalı seçim), radyo düğmeleri | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Dizi (esnek etiketler), çift ölçek | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Dizi (esnek) - sütun biçimi | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Dizi (esnek) - satır biçimi | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Dizi (Artış/Aynı/Düşüş), radyo düğmeleri | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Dizi (çoklu esnek) 1'den 10'a | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Dizi (çoklu esnek) yazı | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Dizi (Evet/Belirsiz/Hayır), radyo düğmeleri | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Standart metin sorusu | Q11 | {Q11.shown} | |||||
| D | Tarih | Q12 | {Q12} | {Q12.shown} | ||||
| * | Denklem | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Dosya yükleme (yüklenen dosya sayısını kaydeder) | Q14 | {Q14} | {Q14>0} | ||||
| G | Cinsiyet, açılan liste | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Çok uzun serbest yazı | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Dil sorusu | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Liste - açılan liste | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Liste, açılan liste/radyo düğmesi listesi | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Açıklamalı liste, açılan liste/radyo düğmesi listesi + metin alanı | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Uzun serbest yazı | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Birkaç seçim, onay kutusu | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Açıklamalar ile birkaç seçenek, onay kutusu + yazı | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Birkaç sayısal soru | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Birkaç kısa yazı | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Sayısal soru türü | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Sıralama biçemi | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Kısa serbest yazı | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Evet/Hayır, radyo düğmeleri | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
NAOK kullanımı
NAOK --> "Not Applicable" (NA; uygulanamaz) sorun değildir (OK)
NAOK kullanmak, değişkenlerin tamamının veya bir kısmının ilintisiz olduğu anlamına gelir (ör. "Not Applicable" (NA; uygulanamaz) sorun değildir (OK)).
Örneğin: Q1'in bir alt sorusu filtrelenmişse count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) her zaman boş bir metin döndürür. Böyle bir soruda işaretlenen alt soru sayısını saymak için count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK) kullanılabilir. Alt soru gizliyse EM boş bir metin döndürür.
NAOK olmadan, bir soru veya alt soru gizliyse EM her zaman boş bir metin döndürür (false döndürmekle aynıdır).
.shown her zaman NAOK sistemini kullanır (gizliyse boş metin); ancak yanıtın koduna ihtiyacınız varsa, soru kodunun ardına .NAOK eklemek her zaman iyi bir fikirdir (ne yaptığınızı bilmiyorsanız veya buna ihtiyacınız yoksa).
Daha fazla bilgi Basamaklı koşulların geçersiz kılınması alt bölümünde verilmiştir.
Ayrılmış "this", "self" ve "that" değişkenleri
Çoğu zaman bir sorunun tüm bölümlerini değerlendirmek istersiniz; örneğin kaç alt sorunun yanıtlandığını saymak veya puanları toplamak gibi. Bazen de bir sorunun yalnızca belirli satırlarını veya sütunlarını işlemek istersiniz (ör. satır veya sütun toplamlarını alıp veri tabanında saklamak). Bu ayrılmış değişkenler bu işlemi oldukça kolaylaştırır.
"This" değişkeni
"this" değişkeni yalnızca "Soru geçerliliği denklemi" ve "Alt soru geçerliliği denklemi" seçeneklerinde kullanılır (ikincisi grafik arayüzden mümkün değildir). Bu soruların içindeki her hücrenin değişken adlarına genişler. Dolayısıyla her girdinin üçten büyük olduğundan emin olmak istiyorsanız "Alt soru geçerliliği denklemi" alanını (this > 3) olarak ayarlarsınız.
"Self" değişkeni
"self" ve "that" değişkenleri daha güçlüdür ve denklemler işlenmeden önce genişletilen makrolar olarak çalışır. "self" değişkeni için sözdizimi seçenekleri şunlardır:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix, normal soru kodu son eklerinden herhangi biridir (ör. NAOK, value, shown)
- sub-selector aşağıdakilerden biri olabilir:
- comments - yalnızca açıklama olan alt sorular (ör. Açıklamalar ile birkaç seçenek ve Açıklamalı liste);
- nocomments - yalnızca açıklama olmayan alt sorular;
- sq_X - burada X bir satır veya sütun tanımlayıcısıdır. Yalnızca X desenine uyan alt sorular seçilir. Aramanın tam kod tanımlayıcısı üzerinde yapıldığına, ardından sq_X eşleşmesinin nX, X, Xn alt sorularını da kapsadığına dikkat edin (ör. sq_1 kullanırsanız a1, 1a, 1, 11 veya 001 alt soruları dahil edilir). QCODE_SQCODE_1 ve QCODE_SQCODE_1 şeklinde alt soru kodlarına sahip çift ölçekli soru türüne ve alt soru kodları QCODE_1, QCODE_2 ... şeklinde olan sıralama soru türüne dikkat edin.
Örnekler:
- Bir sorunun herhangi bir kısmı yanıtlandı mı? -> {count(self.NAOK)>0}
- Bu sorunun değerlendirme puanı nedir? -> {sum(self.value)}
Bunları satır ve sütun toplamlarını almak için de kullanabilirsiniz. A-E satırlarına ve 1-5 sütunlarına sahip bir sayı dizisi olduğunu varsayalım.
- Ana toplam nedir? -> {sum(self.NAOK)}
- B satırının toplamı nedir? -> {sum(self.sq_B.NAOK)}
- 3. sütunun toplamı nedir? -> {sum(self.sq_3.NAOK)}
"That" değişkeni
"that" değişkeni "self" değişkenine benzer, ancak diğer sorulara başvurmanıza olanak tanır. Sözdizimi şöyledir:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname, herhangi bir alt soru uzantısı olmadan soru adıdır. Örneğin 'q1' adında bir soru oluşturalım; buradaki 'q' aynı zamanda qname değerini de temsil eder.
Örnekler:
- q1 sorusunun herhangi bir kısmı yanıtlandı mı? -> {count(that.q1.NAOK)>0}
- q2 için değerlendirme puanı nedir? -> {sum(that.q2.NAOK)}
- q3 için ana toplam nedir? -> {sum(that.q3.NAOK)}
- q4'teki C satırının toplamı nedir? -> {sum(that.q4.sq_C.NAOK)}
- q4'teki 2. sütunun toplamı nedir? -> {sum(that.q4.sq_2.NAOK)}
"self" ve "that" değişkenleri herhangi bir uygunluk, doğrulama veya uyarlama alanında kullanılabilir.
Tek dikkat edilmesi gereken nokta, Mantık dosyasını göster özelliğini kullandığınızda "self" ve "that" değişkenlerinin genişletilmiş değerinin gösterilmesidir. Bu sayede oluşturulacak gerçek denklemi görebilir, değişkenlerin var olup olmadığını siz (ve EM) doğrulayabilirsiniz. Oldukça uzun denklemler görebileceğiniz için bu karışık görünebilir. Ancak soruyu düzenlerseniz "self" ve/veya "that" kullanan özgün denklemi görürsünüz.
- Bir denklemde kullanılan her değişkeni açıkça adlandırmak istiyorsanız veya
- alt sorusu olmayan değişkenler kullanıyorsanız (ör. tek yanıtlı sorular). Bu durumlarda bir değişkenin başına "that" eklemek gereksizdir ve beklenmedik sonuçlar alma riskiyle karşılaşırsınız.
Fonksiyonlara erişim
ExpressionScript, aşağıda gösterildiği gibi matematiksel, metin ve kullanıcı tanımlı fonksiyonlara erişim sağlar. Bu fonksiyonların PHP ve JavaScript karşılıkları bulunur; böylece sunucu tarafında (PHP) ve istemci tarafında (JavaScript) aynı şekilde çalışırlar. Yeni fonksiyon eklemek kolaydır.
Uygulanmış fonksiyonlar
Şu anda aşağıdaki fonksiyonlar kullanılabilir:
| İşlev | Anlamı | Sözdizimi |
|---|---|---|
| abs | Mutlak değer | number abs(number) |
| acos | Ark kosinüs | number acos(number) |
| addslashes | Bir dizgeyi ters eğik çizgilerle tırnak içine alır | string addslashes(string) |
| asin | Ark sinüs | number asin(number) |
| atan | Ark tanjant | number atan(number) |
| atan2 | İki değişkenli ark tanjant | number atan2(number, number) |
| ceil | Küsuratları yukarı yuvarlar | number ceil(number) |
| checkdate | Gregoryen takvimde geçerli bir tarihse doğru(1) değerini döndürür | bool checkdate(month,day,year) |
| convert_value | Sayısal değerlerden oluşan bir girdi tablosu ve çıktı tablosu kullanarak sayısal bir değeri dönüştürür | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Kosinüs | number cos(number) |
| count | Listedeki yanıtlanmış (boş olmayan) soruların sayısını sayar | number count(arg1, arg12, ..., argN) |
| countif | Listede ilk bağımsız değişkene eşit olan yanıtlanmış soruların sayısını sayar | number countif(matches, arg1, arg2, ... argN) |
| countifop | Listede ölçütü (arg op value) karşılayan yanıtlanmış soruların sayısını sayar | number countifop(op, value, arg1, arg2, ... argN) |
| date | Yerel tarih/zamanı biçimlendirir | string date(format [, timestamp=time()]) |
| exp | e üssünü hesaplar | number exp(number) |
| fixnum | Gerekirse sayıları ondalık ayırıcı olarak virgülle gösterir | string fixnum(number) |
| floor | Küsuratları aşağı yuvarlar | number floor(number) |
| gmdate | GMT tarih/zamanı biçimlendirir | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Tüm HTML varlıklarını uygun karakterlere dönüştürür (her zaman ENT_QUOTES ve UTF-8 kullanır) | string html_entity_decode(string) |
| htmlentities | Uygun olan tüm karakterleri HTML varlıklarına dönüştürür (her zaman ENT_QUOTES ve UTF-8 kullanır) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Özel karakterleri HTML varlıklarına dönüştürür (her zaman ENT_QUOTES ve UTF-8 kullanır) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Özel HTML varlıklarını yeniden karakterlere dönüştürür (her zaman ENT_QUOTES ve UTF-8 kullanır) | string htmlspecialchars_decode(string) |
| idate | Yerel tarih/saati tam sayı olarak biçimlendirir | string idate(string [, timestamp=time()]) |
| if | Excel tarzı if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Dizi elemanlarını bir dizge olarak birleştirir | string implode(glue,arg1,arg2,...,argN) |
| intval | Bir değişkenin tam sayı değerini alır | int intval(number [, base=10]) |
| is_empty | Bir değişkenin boş kabul edilip edilmediğini belirler | bool is_empty(var) |
| is_float | Bir değişkenin türünün ondalık sayı (float) olup olmadığını belirler | bool is_float(var) |
| is_int | Bir değişkenin türünün tam sayı olup olmadığını belirler | bool is_int(var) |
| is_nan | Bir değerin sayı olup olmadığını belirler | bool is_nan(var) |
| is_null | Bir değişkenin NULL olup olmadığını belirler | bool is_null(var) |
| is_numeric | Bir değişkenin sayı veya sayısal bir dizge olup olmadığını belirler | bool is_numeric(var) |
| is_string | Bir değişkenin türünün dizge olup olmadığını belirler | bool is_string(var) |
| join (New in 2.0 build 130129) | Öğeleri yeni bir dizge olarak birleştirir | join(arg1, arg2, ... argN) |
| list | Boş olmayan değerlerin virgülle ayrılmış listesini döndürür | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Listede ölçütü (cmpProp op value) karşılayan sorulardan, belirtilen soru özelliğinin (retProp) 'glue' ile ayrılmış bir listesini döndürür | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Bir dizgenin başındaki boşlukları (veya diğer karakterleri) ayıklar | string ltrim(string [, charlist]) |
| max | En yüksek değeri bulur | number max(arg1, arg2, ... argN) |
| min | En düşük değeri bulur | number min(arg1, arg2, ... argN) |
| mktime | Bir tarih için UNIX zaman damgasını alır (6 bağımsız değişkenin her biri isteğe bağlıdır) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Mod işlevi henüz desteklenmemektedir. Bunun yerine floor() işlevini kullanabilirsiniz | floor(x/y)==(x/y) |
| nl2br | Bir dizgedeki tüm satır sonlarından önce HTML satır sonları ekler | string nl2br(string) |
| number_format | Bir sayıyı binlik olarak ayırarak biçimlendirir | string number_format(number) |
| pi | Pi değerini alır | number pi() |
| pow | Üstel ifade | number pow(base, exp) |
| quoted_printable_decode | Quoted-printable bir dizgeyi 8 bitlik bir dizgeye dönüştürür | string quoted_printable_decode(string) |
| quoted_printable_encode | 8 bitlik bir dizgeyi quoted-printable bir dizgeye dönüştürür | string quoted_printable_encode(string) |
| quotemeta | Üst veri karakterlerini tırnak arasına alır | string quotemeta(string) |
| rand | Rastgele bir tam sayı üretir, bu örneğe bakın | int rand() OR int rand(min, max) |
| regexMatch | Bir dizgeyi bir kurallı ifade ile karşılaştırır | bool regexMatch(pattern,input) |
| round | Bir sayıyı istenilen hassasiyette yuvarlar | number round(val [, precision]) |
| rtrim | Bir dizgenin sonundaki boşlukları (veya diğer karakterleri) ayıklar | string rtrim(string [, charlist]) |
| sin | Sinüs | number sin(arg) |
| sprintf | Biçimlendirilmiş bir dizge verir | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Kare kök | number sqrt(arg) |
| stddev | Sayı listesi için örneklem standart sapmasını hesaplar | number stddev(arg1, arg2, ... argN) |
| str_pad | Bir dizgeyi başka bir dizgeyle belirli bir uzunluğa tamamlar | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Bir dizgeyi yineler | string str_repeat(input, multiplier) |
| str_replace | Aranan dizgenin tüm geçtiği yerleri yerine konacak dizgeyle değiştirir | string str_replace(search, replace, subject) |
| strcasecmp | İkili, güvenli, büyük küçük harf duyarsız dizge karşılaştırması | int strcasecmp(str1, str2) |
| strcmp | İkili güvenli dizge karşılaştırması | int strcmp(str1, str2) |
| strip_tags | Bir yazıdaki HTML ve PHP kod imlerini ayıklar | string strip_tags(str, allowable_tags) |
| stripos | Büyük küçük harfe duyarsız bir unicode dizgenin ilk geçtiği konumu bulur (0'dan başlar, bulunamazsa false döndürür) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Tırnaklı bir dizgeyi tırnaksız yapar | string stripslashes(string) |
| stristr | Büyük küçük harfe duyarsız strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Dizge uzunluğunu alır | int strlen(string) |
| strpos | Bir unicode dizgenin ilk geçtiği konumu bulur (0'dan başlar, bulunamazsa false döndürür) | int strpos(haystack, needle [ offset=0]) |
| strrev | Bir dizgeyi ters çevirir | string strrev(string) |
| strstr | Bir dizgenin ilk geçtiği yeri bulur | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Bir dizgeyi küçük harfe çevirir | string strtolower(string) |
| strtotime | İngilizce metin biçimindeki hemen her tarih/saat tanımını Unix zaman damgasına dönüştürür | int strtotime(string) |
| strtoupper | Bir dizgeyi büyük harfe çevirir | string strtoupper(string) |
| substr | Bir unicode dizgenin bir bölümünü döndürür | string substr(string, start [, length]) |
| sum | Bir dizideki değerlerin toplamını hesaplar | number sum(arg1, arg2, ... argN) |
| sumifop | Listede ölçütü (arg op value) karşılayan yanıtlanmış soruların değerlerini toplar | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tanjant | number tan(arg) |
| time | Geçerli UNIX zaman damgasını alır | number time() |
| trim | Bir dizgenin başındaki ve sonundaki boşlukları (veya diğer karakterleri) ayıklar | string trim(string [, charlist]) |
| ucwords | Bir dizgedeki her sözcüğün ilk harfini büyük harf yapar | string ucwords(string) |
| unique | Tüm boş olmayan yanıtlar benzersiz ise doğru değerini döndürür | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Eklenti ile yeni ifade işlevleri oluşturma (New in 4.0.0 )
Çekirdekte bulunmayan yeni bir işleve ihtiyacınız varsa, bunu bir eklenti ile oluşturabilirsiniz. Böyle bir yeni işlev, expressionManagerStart olayı kullanılarak oluşturulur.
ExpressionScript hangi değişkenlerin yerel olduğunu bilir
Bir sayfanın JavaScript kodunu doğru şekilde oluşturabilmek için EM'nin sayfada hangi değişkenlerin ayarlandığını ve bunların JavaScript kimliğinin (ID) ne olduğunu (örneğin document.getElementById(x) için) bilmesi gerekir. Ayrıca gerekli <input type='hidden' value='x'> alanlarının mevcut ve doldurulmuş olduğundan emin olabilmek için diğer sayfalarda hangi değişkenlerin ayarlandığını da bilmelidir.
Basamaklı Koşullar
Değişkenlerden herhangi biri ilgisizse, denklemin tamamı ilgisiz (false) olur. Örneğin aşağıdaki tabloda N/A, değişkenlerden birinin ilgili olmadığı anlamına gelir:
| Operatör | Örnek | a | b | Sonuç |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or 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 |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
Basamaklı Koşulları Geçersiz Kılma
Tüm ilgili yanıtların toplamını anlık olarak göstermek istediğinizi varsayalım. {sum(q1,q2,q3,...,qN)} denklemini kullanmayı deneyebilirsiniz. Ancak bu denklem dahili olarak LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))) şeklinde çevrilir. Dolayısıyla q1-qN değerlerinden herhangi biri ilgisizse denklem her zaman false döndürür. Bu durumda sum() işlevi, tüm sorular yanıtlanana kadar "0" gösterir.
Bunu aşmak için her değişkene ".NAOK" son eki (Not Applicable is OK, yani Uygulanamaz kabul edilebilir anlamına gelir) eklenebilir. Bu durumda şu davranış gerçekleşir. q1.NAOK adlı bir değişkeniniz olduğunu varsayalım:
- q1, LEManyNA() yan tümcesine eklenmez
- LEMval('q1'), yanıtın ilgili olup olmadığını denetlemeye devam eder ve ilgili değilse "" döndürür (böylece tek tek ilgisiz yanıtlar yok sayılır, ancak tüm ifadeyi geçersiz kılmaz).
Dolayısıyla anlık toplam sorununun çözümü sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) denklemini kullanmaktır.
.NAOK son ekinin kullanılması, yazarların birden fazla olası yola sahip olan ancak daha sonra ortak yollarda birleşen anketler tasarlamasına da olanak tanır. Örneğin katılımcıların bir ankete normal yanıt aralığının dışında yanıt verdiğini varsayalım. Yazar, katılımcıları geçerli sonuçlar alamayabilecekleri konusunda uyarabilir ve ankete gerçekten devam etmek isteyip istemediklerini sorabilir. "Evet" derlerse sorunun geri kalanı gösterilir. "Sorunun geri kalanı" için koşul, ilk yanıtların normal aralıkta verilip verilmediğini VEYA katılımcının yalnızca normal aralığın dışında yanıt verdiyse ilgili olan soruya "Evet" yanıtı verip vermediğini denetler.
ExpressionScript koşullu mikro uyarlamayı nasıl destekler?
Mikro uyarlamaya bir örnek (burada Soru türü=='expr' bir Denklem anlamına gelir):
| Soru kodu | İlgililik | Soru türü | Soru |
|---|---|---|---|
| name | 1 | text | Adınız nedir? |
| age | 1 | text | Kaç yaşındasınız? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Üzgünüz, {name}, bu test için çok {if( (age<16),'genç',if( (age>80),'yaşlı','orta yaşlı') ) } görünüyorsunuz. |
| kids | !badage | yesno | Çocuğunuz var mı? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Kaç çocuğunuz var? |
| kid1 | parents && numKids >= 1 | text | İlk çocuğunuz kaç yaşında? |
| kid2 | parents && numKids >= 2 | text | İkinci çocuğunuz kaç yaşında? |
| kid3 | parents && numKids >= 3 | text | Üçüncü çocuğunuz kaç yaşında? |
| kid4 | parents && numKids >= 4 | text | Dördüncü çocuğunuz kaç yaşında? |
| kid5 | parents && numKids >= 5 | text | Beşinci çocuğunuz kaç yaşında? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, {age} yaşında olduğunuzu ve {numKids} çocuğunuz olduğunu belirttiniz. İlk {min(numKids,5)} çocuğunuzun yaşları toplamı {sumage} |
Yukarıdaki anket örneğini indirmek için şu bağlantıya tıklayın: Çocuk sayısı anketi örneği.
Bu soruların tümü tek bir sayfada (örneğin aynı grupta) yer alabilir ve yalnızca ilgili sorular görüntülenir. Ayrıca çocukların yaşlarını girdikçe son sorudaki sum() ifadesi dinamik olarak güncellenir.
ExpressionScript bu işlevi, her ifadeyi adlandırılmış bir <span> öğesiyle çevreleyerek sağlar. Bir değer her değiştiğinde, o <span> öğesinde görünmesi gereken ifadeyi yeniden hesaplar ve görüntüyü yeniden oluşturur. Aynı sayfada düzinelerce, hatta yüzlerce böyle uyarlanmış ifade bulunabilir.
Söz dizimi vurgulama
İfadelerin girilmesine ve doğrulanmasına yardımcı olmak için EM, aşağıdaki özelliklere sahip söz dizimi vurgulama sağlar:
Söz Dizimi Vurgulamanın Türleri ve Anlamları
| Renk | Örnek | Anlamı | Araç ipucu | Açıklamalar |
|---|---|---|---|---|
| tan background | Sample | tüm denklem | yok | Süslü parantezler içinde yer alan ve denklem olarak tanınan her şey (örneğin başında veya sonunda boşluk bulunmayan), çevreleyen metinden ayırt edilmesine yardımcı olmak için bej arka planla renklendirilir |
| bold red text | Sample | Bir hata | Hata hakkında bir açıklama | Bilinmeyen bir değişken veya işlevdeki bir hata olabilir. Anket bozulur ve ilgili ifadeye dayanan sorular katılımcılara gösterilmez. |
| blue text | Sample | işlev adı | anlamı ve izin verilen söz dizimi | İşlev adlarını veya ardından açık parantez geldiği için işlev olması gereken öğeleri ifade eder. Kalın mavi metin olarak görüntülenirler. Araç ipuçları işlevin anlamını ve izin verilen söz dizimini gösterir. |
| grey text | Sample | dize | yok | Tek ve çift tırnaklı dizeler gri metin olarak gösterilir. |
| cyan text | Sample | aynı sayfada ayarlanan değişken | [name]: soru; değer; her değer için kodları gösteren yanıt listesi | Şu anda düzenlediğiniz soruyla aynı sayfada ayarlanan her değişken camgöbeği metin olarak gösterilir (JavaScript ile güncellenebilir). Araç ipucu değişkenin adını, asıl soruyu ve geçerli değerini (ayarlanmamışsa boş) gösterir. Soru türü numaralandırılmış bir değer kümesinden yanıt bekliyorsa, kodların görüntülenen değerlerle eşleşmesi gösterilir. |
| green text | Sample | önceki bir sayfada ayarlanan değişken | [name]: soru; değer; her değer için kodları gösteren yanıt listesi | Önceki bir sayfada ayarlanan her değişken kalın yeşil metin olarak gösterilir. Araç ipucu değişkenin adını, asıl soruyu ve geçerli değerini (ayarlanmamışsa boş) gösterir. Soru türü numaralandırılmış bir değer kümesinden yanıt bekliyorsa, kodların görüntülenen değerlerle eşleşmesi gösterilir. |
| bold pink text | Sample | sonraki bir sayfada ayarlanan değişken genellikle: anket başlangıcında boştur, ancak dizin veya önceki sayfaya gitme ile doldurulabilir | [name veya SGQA kodu]: soru; değer; her değer için kodları gösteren yanıt listesi | Sonraki bir sayfada ayarlanan her değişken kalın pembe metin olarak gösterilir. Araç ipucu değişkenin adını, asıl soruyu ve geçerli değerini (ayarlanmamışsa boş) gösterir. Soru türü numaralandırılmış bir değer kümesinden yanıt bekliyorsa, kodların görüntülenen değerlerle eşleşmesi gösterilir. |
| bold tan text | Sample | bir LimeSurvey değiştirme değeri | değer | LimeSurvey değiştirme dizeleri ({TOKEN:xxx}, {PRIVACY_MESSAGE} gibi) kalın bej metin olarak gösterilir. |
| red text | Sample | atama operatörü (=) | uyarı iletisi | Atama operatörlerinden birini (=) kullanırsanız bu operatör kırmızı metin olarak görüntülenir. Bu, aslında a == b denetimi yapmak isterken a = b şeklinde değer atayarak yanlışlıkla yeniden atama yapılmasını önlemeye yardımcı olmak içindir. |
| normal black text | Sample | noktalama | yok | İfade içindeki diğer tüm noktalama işaretleri normal siyah metin olarak gösterilir. |
| red-boxed text | hatanın çevresinde kalın bir kırmızı çizgi bulunur | söz dizimi hatası | hatanın açıklaması | Algılanan tüm söz dizimi hataları kırmızı kutular içinde gösterilir. Araç ipucu hatayı gösterir. Örnekler arasında eşleşmeyen parantezler, tanımsız işlevlerin kullanımı, işlevlere yanlış sayıda bağımsız değişken geçirilmesi, kötü yapılandırılmış ifadeler (örneğin değişkenler arasında eksik operatörler), salt okunur bir değişkene yeni değer atamaya çalışmak, değişken olmayanlara değer atamaya çalışmak veya desteklenmeyen söz dizimi kullanmak yer alır. Söz dizimi hatası algılama sisteminin, birden fazla hata olsa bile bir ifadede yalnızca tek bir hata bildirebileceğini unutmayın; ancak herhangi bir hata algılanırsa en az bir hata gösterilir. |
Ek okumalar
ExpressionScript örnek anketleri
Kullanım senaryoları ve nasıl yapılır kılavuzları
Adım adım örnekler
Geliştiriciler için başvuru kılavuzu