Expression Manager
From LimeSurvey Manual
Hızlı Başlangıç Eğitimi
Özet
Anketlerinizi özelleştirirken genellikle şunları belirtmenin bir yoluna ihtiyaç duyarsınız:
- Gezinme/Dallanma - bir katılımcının yanıtlarının soruların sorulma sırasını değiştirmesine izin vermek
- Uyarlama/Yönlendirme (Piping) - sorunun nasıl ifade edileceği (önceki yanıtlara atıfta bulunmak veya cümleleri katılımcılarınızın sayısına ya da cinsiyetine göre çekimlemek gibi) veya özel raporların nasıl oluşturulacağı (değerlendirme puanları veya uyarlanmış tavsiyeler gibi).
- Geçerlilik - yanıtların en küçük ve en büyük değerler gibi belirli ölçütleri karşılamasını veya bir giriş desenine uymasını sağlamak
Expression Manager (EM), bu özelliklerin her biri için mantığı belirtmenin sezgisel bir yolunu sunar. Standart bir matematiksel denklem olarak yazabileceğiniz hemen hemen her şey, işlev çağırsanız bile geçerli bir ifadedir. EM şu anda 80 işleve erişim sağlar ve daha fazlasını desteklemek üzere kolayca genişletilebilir. Ayrıca değişkenlerinize (SGQA adları yerine) insan tarafından okunabilir değişken adlarıyla erişmenizi sağlar.
Aşağıdaki bölümlerde Expression Manager'ın kullanıldığı başlıca yerler gösterilmektedir
İlinti (Gezinme/Dallanmayı Denetleme)
Bazı anketler "Goto Mantığı" kullanır; örneğin 1. soruyu C seçeneğiyle yanıtlarsanız 5. soruya atlanır. Bu yaklaşım çok sınırlayıcıdır, çünkü doğrulaması zordur ve soruların sırasını değiştirmeniz gerektiğinde kolayca bozulur. EM, bir sorunun geçerli olabileceği tüm koşulları belirtmek için Boolean türünde bir ilinti denklemi kullanır. Soru ilintiliyse gösterilir, aksi halde Uygulanamaz olur ve veritabanında NULL değeri saklanır. Bu, Koşullar düzenleyicisi ile yapılabilenlere benzer, ancak EM çok daha karmaşık ve güçlü ölçütleri kolayca belirtmenize olanak tanır (ve SGQA adlandırması yerine değişken adını kullanmanızı sağlar).
Bu görüntü, bir anketin ilinti mantığını gözden geçirmenin bir yolunu gösterir. Vücut Kitle İndeksini hesaplar. İlinti denklemi, değişken adının (yeşil renkte) hemen ardından köşeli parantez içinde gösterilir. Dolayısıyla weight, weight_units, height ve height_units öğelerinin ilintisi 1'dir; bu, söz konusu soruların her zaman sorulduğu anlamına gelir. Ancak BMI için ilinti {!is_empty(height) and !is_empty(weight)} şeklindedir; bu da BMI'nin yalnızca katılımcı hem boy hem de kilo için bir değer girerse hesaplanacağı anlamına gelir (böylece sıfıra bölme hatası riski ortadan kalkar). Ayrıca Report sorusu yalnızca katılımcı dört ana soruyu da (height, height_units, weight, weight_units) yanıtlarsa gösterilir.
İlinti aşağıdaki yerlerde gösterilir ve düzenlenebilir:
Soru Düzeyinde İlintiyi Görüntüleme / Düzenleme
Bu denklem Vücut Kitle İndeksini (BMI) hesaplar. Yalnızca kişi önce boyunu ve kilosunu girerse sorulur.
Bu, BMI sorusunun düzenleme ekranıdır.
İlinti denklemi girerken süslü parantezleri kullanmadığınıza dikkat edin.
Grup Düzeyinde İlintiyi Görüntüleme / Düzenleme
Bu, örnek bir nüfus sayımı anketidir. İlk sayfa sizinle kaç kişinin yaşadığını sorar ve bunu "cohabs" değişkeninde saklar. Bu sayfa yalnızca birden fazla birlikte yaşayan kişi varsa gösterilir (yani sizinle birlikte yaşayan ikinci kişi için gösterilir) ve ayrıca yalnızca Birinci Kişinin size nasıl bir yakınlığı olduğunu (p1_rel) belirttiyseniz gösterilir.
Gördüğünüz gibi grubun ayrıca soru düzeyinde ilinti ölçütleri de vardır; böylece her soru, kendisinden önceki soru yanıtlandıktan sonra görünür (ör. {!is_empty(p1_sex)}). EM, Grup ve Soru düzeyindeki ilintiyi sizin için birleştirir. Bir gruptaki sorular yalnızca grup bir bütün olarak ilintiliyse sorulur. Ardından grup içinde yalnızca ilintili olan soru alt kümesi sorulur.
Aşağıda, söz konusu soru için grup düzeyindeki ilintiyi düzenleme ekranı yer almaktadır:
İlinti denklemi girerken süslü parantezleri kullanmadığınıza dikkat edin.
Uyarlama/Yönlendirme (Piping)
EM, sorularınızı basit ve karmaşık koşullu olarak kolayca uyarlamanıza olanak tanır. Bazen yalnızca basit bir yer değiştirmeye ihtiyaç duyarsınız; örneğin "[Ürün] satın aldığınızı söylediniz. Onun hakkında en çok neyi beğendiniz?" demek gibi. Bazen "[Bay/Bayan] [Soyadı], anketimizi tamamlamak ister misiniz?" gibi koşullu bir yer değiştirmeye ihtiyaç duyarsınız. Bu durumda kişinin cinsiyetine göre Bay veya Bayan kullanmak istersiniz. Başka zamanlarda (matematiksel bir hesaplamaya dayanan gibi) daha da karmaşık bir yer değiştirmeye ihtiyaç duyarsınız. EM bu uyarlama/yönlendirme türlerinin her birini destekler.
Koşullu Denklemler
Vücut Kitle İndeksi örneği, kişilerin boy ve kilolarını metrik veya metrik olmayan birimlerle girmelerine izin verirken bile BMI'lerini hesaplama yeteneğini gösterir.
Burada weight_kg değeri {if(weight_units == 'kg', weight, weight * .453592)} şeklindedir. Bu if() işlevi, katılımcı kiloyu kilogram olarak girdiyse bu değerin kullanılacağı, aksi halde girilen değerin (libre cinsinden) kilograma çevrilmesi için .453592 ile çarpılacağı anlamına gelir. height_m değişkeni de, boyunu inç olarak girse bile kişinin boyunu metre cinsinden hesaplamak için benzer bir yaklaşım kullanır.
BMI, ağırlık formülünü {weight_kg / (height_m * height_m)} olarak hesaplar.
Son olarak, rapor katılımcıya girdiği değerleri söyleyerek iletiyi koşullu olarak uyarlar. ("2 metre boyunda olduğunuzu ve 70 kg ağırlığında olduğunuzu söylediniz.")
Yukarıdaki görüntüde pek iyi görünmese de weight_status, kişiyi zayıftan ileri derecede obeze kadar sınıflandırmak için iç içe if() ifadeleri kullanır. Denklemini Mantığı Göster görünümünde görebilirsiniz.
Bu sorunun düzenleme penceresinde iki şeyi görebilirsiniz:
- Uyarlama, ifadeleri küme ayraçlarıyla çevrelemelidir
- İfadeler, bu örnekte olduğu gibi iç içe koşullu mantığı okumayı kolaylaştırmak istediğinizde birden çok satıra yayılabilir.
Uyarlanmış Sorular, Yanıtlar ve Raporlar
Bu örnek BMI raporunu göstermektedir.
Aşağıda aynı sorunun düzenleme penceresi yer almaktadır.
Gördüğünüz gibi, küme ayraçları içindeki her şey bir ifade olarak ele alınır ve bu nedenle önceki görüntüde sözdizimi vurgulamalıdır (renk kodludur). Yazım hatalarınız olursa (yanlış yazılmış veya tanımlanmamış değişken adları ya da işlevler gibi), EM bunun gibi bir hata gösterir; burada height_unit tanımlanmamış bir değişken adıdır (aslında height_units olmalıdır) ve rnd() tanımlanmamış bir işlevdir (doğru işlev adı round() olmalıdır). Her iki durumda da hataları fark edip düzeltmeyi kolaylaştırmak için hatalar kırmızı bir kutuyla çevrelenir.
Ayrıca girilen değerlerin tablosu veya uyarlanmış öneriler gibi karmaşık raporları hızlıca oluşturabileceğinizi de görebilirsiniz.
Lütfen tüm uyarlamalarda ifadelerin küme ayraçlarıyla çevrelenmesi gerektiğini unutmayın; böylece LimeSurvey sorunun hangi bölümlerinin serbest metin olduğunu, hangilerinin Expression Manager ile işlenmesi gerektiğini bilir.
Doğrulama
EM, gelişmiş soru seçeneklerinin çoğunun nasıl çalışacağını denetler. Bunlar, en az/en çok yanıt sayısı; en az/en çok tekil değerler; en az/en çok toplam değerler ve girilen değerlerin belirtilen dize desenleriyle eşleştiğinin denetlenmesi gibi yönleri kontrol eder. Bu gelişmiş soru seçeneklerini her zamanki gibi girmeye devam edersiniz. Ancak artık bu alanlardaki her değer bir ifade olarak kabul edilir; böylece diğer sorularla karmaşık koşullu ilişkileri olan en az/en çok ölçütleri kullanabilirsiniz.
Tüm bu durumlarda, gelişmiş soru seçeneği her zaman bir ifade olarak kabul edildiğinden, belirtirken küme ayraçlarını kullanmazsınız.
Örnek Anketler sayfaları, doğrulama için ifadelerin kullanıldığı çok sayıda çalışan örnek içerir.
Giriş
LimeSurvey, daha karmaşık dallanma, değerlendirme, doğrulama ve uyarlamayı desteklemesini sağlayacak yeni Expression Manager (EM) modülünü kullanır. LimeSurvey'in arka uçta Değiştirmeleri, Koşulları ve Değerlendirmeleri yönetme biçiminin yerini alacaktır. Ayrıca çalışma zamanındaki veritabanı okumalarının çoğunu ortadan kaldırdığı için işlemeyi önemli ölçüde hızlandıracaktır. EM, Dr. Thomas White (TMSWhite) tarafından geliştirilmiştir.
Bu viki sayfası, Expression Manager sözdizimi ve işlevselliği için kesin başvuru kaynağıdır.
Temel Tanımlar
- İfade: Küme ayraçlarıyla çevrelenmiş her şey
- Açılış ayracından hemen sonra veya kapanış ayracından hemen önce boşluk olmadığı sürece
- İfadelerin içeriği EM tarafından değerlendirilir; bu nedenle matematiksel formüller, işlevler ile karmaşık dize ve tarih işlemleri içerebilir.
- Uyarlama: Bazen "piping" olarak da adlandırılır; metnin koşullu olarak değiştirilmesi sürecidir
- Tüm 'değiştirme alanlarına', katılımcı verilerine ve yanıt verilerine erişiminiz vardır.
- Ayrıca sorulara, yanıtlara ve özelliklerine daha kolay erişirsiniz.
- İlinti Denklemi: Soru 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
- Denklem Soru Türü: Hesaplamaları veya raporları veritabanına kaydeden yeni bir soru türü
- Boilerplate soruya 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
- Bu, sorunun amacını belirten açıklayıcı bir ad olabilir ve karmaşık mantığın okunmasını kolaylaştırır
- Geçerli soru kodları bir sayıyla 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'a dışa aktarırsanız şu anda değişken adı olan budur; istatistiksel analiz yapıyorsanız muhtemelen bunu zaten benzersiz yapmışsınızdır.
EM kullanmak zorunda mıyım?
Kısa yanıt: Hayır (ama aynı zamanda evet).
EM, mevcut anketlerle tamamen geriye dönük uyumludur. Bu nedenle LimeSurvey'in <= 1.91+ sürümlerinde kullandığı biçemde Koşulları ve Değerlendirmeleri kullanmaktan memnunsanız bunu sürdürebilirsiniz.
Ancak EM, LimeSurvey'in Koşulları dahili olarak ele alma biçimini tamamen değiştirir. Koşulları oluşturmak ve yönetmek için Koşul Düzenleyicisi'ni kullanmaya devam edebilseniz de LimeSurvey 1.92 bunları eşdeğer İlinti Denklemlerine dönüştürür. Yükseltmenin bir parçası olarak LimeSurvey 1.92, mevcut tüm Koşulları otomatik olarak İlinti Denklemlerine dönüştürür.
Bu, size her iki dünyanın da en iyisini sunmalıdır - LimeSurvey'i alışık olduğunuz şekilde kullanmaya devam edebilir, ancak uygun gördüğünüzde kademeli olarak doğrudan İlinti Denklemlerine geçebilmeniz için eşdeğer İlinti Denklemini görürsünüz.
Koşulları ve İlinti denklemini bir arada kullanabilir miyim?
Evet. Bazı sorular için Koşul düzenleyicisini, diğerleri için İlinti düzenleyicisini kullanabilirsiniz. Soruyu kaydettiğinizde Koşullar otomatik olarak İlinti denklemine dönüştürülür.
Koşul düzenleyicisini kullanıyorsanız, bu Koşulların el ile girilmiş herhangi bir İlinti denkleminin üzerine yazılmasını istediğinizi varsayıyoruz. Bu nedenle, mevcut Koşullarınız varsa ve İlinti denklemini el ile düzenlemek istiyorsanız, önce o soru için Koşulları silin. Ayrıntılı olarak: oluşturulan ilinti denklemini bir metin düzenleyiciye kopyalayın, Koşullar menüsünü kullanarak o soruya ait tüm koşulları silin (bu işlem ilintiyi de siler), ardından soruyu düzenleyin ve oluşturulan ilinti denklemini metin düzenleyiciden o sorunun ilinti alanına geri yapıştırın (ve soruyu kaydedin). Oluşturulan ilinti denklemini silmeden koşulları silme yönünde yeterli talep olursa, toplu dönüştürme işlemi ekleyebiliriz.
Koşullar ile İlinti denklemi arasında nasıl seçim yapmalıyım?
Aşağıda her bir biçemin artıları ve eksilerinin listesi yer almaktadır:
| Biçem | Artıları | Eksileri |
|---|---|---|
| Koşullar | 1. Basit koşullar oluşturmak için kullanışlı arayüz 2. Arayüz iyi belgelenmiş ve destek ekibi tarafından iyi biliniyor |
1. Yalnızca basit karşılaştırmaları destekler ve VE/VEYA koşullarını iyi işlemez 2. Basamaklı koşullar düzensiz çalışır 3. Yavaş - veritabanını yoğun kullanır, bu nedenle uzun anketleri yavaşlatabilir 4. Koşulların yeniden yüklenmesiyle ilgili bildirilen bazı sorunlar var 5. Düzinelerce, yüzlerce veya binlerce soru olduğunda arayüz iyi ölçeklenmez 6. SGQA adlarının kullanılması gerektiğinden kâğıt tabanlı anketleri dönüştürmek yavaş olabilir 7. Karmaşık dallanma için gereken mantığı özel olarak kodlamak için çoğunlukla bir programcıya ihtiyaç duyulur |
| İlinti denklemi | 1. 80'den fazla işlev ve matematik/dizge işleçleri dahil çok karmaşık mantığı destekler 2. Basamaklı mantık için mükemmel destek 3. Hızlı - ek veritabanı çağrısı yok, bu nedenle 1000'den fazla soruluk anketleri destekler 4. SGQA kodları gerektirmediğinden mantığın yeniden yüklenmesinde sorun yok 5. Sözdizimi vurgulama 1000'den fazla soruluk anketlere ölçeklenir 6. Mevcut kâğıt tabanlı anketleri bilgisayar ortamına aktarmak isteyen gruplar için kolay ve hızlı 7. Programcıya ihtiyaç duymadan yarı yapılandırılmış görüşmeleri ve epidemiyolojik anketleri kolayca destekler |
1. Basit koşullar için arayüz yok - bunun yerine sözdizimi vurgulamayı kullanın 2. Yeni olduğundan destek ekipleri EM'de henüz uzmanlaşmadı. |
Sonuç olarak, LimeSurvey 1.91+ sürümünün çalışma biçiminden memnunsanız, yaptığınız şeyi değiştirmek için bir neden yoktur.
EM kullanmanın diğer yararları nelerdir?
EM'yi kullanmak isteyebileceğiniz diğer bazı nedenler şunlardır.
- Hesaplamalar - aklınıza gelen her hesaplamayı oluşturabilirsiniz:
- Tüm yaygın matematiksel işleçlere ve işlevlere erişiminiz vardır
- 70'ten fazla matematik, tarih ve dizge işleme işlevine erişiminiz vardır
- Kullanıcıların ihtiyaç duyması halinde geliştiricilerin yeni işlevler eklemesi oldukça kolaydır
- Hesaplamaları veritabanına kaydetme
- Artık basit ve karmaşık hesaplamaları ve/veya ölçek puanlarını JavaScript'e ihtiyaç duymadan hesaplayabilir ve veritabanında saklayabilirsiniz.
- Bunu gerçekleştirmek için Denklem soru türünü kullanırsınız.
- Değerlendirmeler
- Artık yalnızca eskiden desteklenen alt kümeden değil, her soru türünden değerlendirme veya ölçek puanı oluşturabilirsiniz
- Gereken her yerde - hatta aynı sayfada - devam eden veya toplam değerlendirme puanlarını göstermek için Uyarlama'yı kullanabilirsiniz
- Bu değerlendirme puanlarına dayalı olarak oluşturulan raporlar üzerinde daha fazla denetiminiz vardır
- Değerlendirme puanlarını JavaScript'e ihtiyaç duymadan veritabanında saklayabilirsiniz
- Değerlendirme puanlarını JavaScript veya CSS'e ihtiyaç duymadan gizleyebilirsiniz
- Yer değiştirme alanları
- Önceki soruların yanıtlarındaki değerleri eklemek için Soru kodunu kullanın - bu, okumayı ve doğrulamayı kolaylaştırır.
- Uyarlama - diğer değerlere göre metni koşullu olarak görüntüleyebilirsiniz
- Katılımcı için uygun hitabı kullanın (örn. "Merhaba [Bay/Bayan] Smith")
- Tekil/çoğul durumunun önemli olduğu yerlerde dil bilgisi açısından doğru cümleler üretin: (örn. "1 çocuğunuz var" ile "2 çocuğunuz var")
- Katılımcının cinsiyetine ve çokluğuna göre fiilleri uygun biçimde çekimleyin ve adları uygun biçimde çekin.
- Yeni değişken öznitelikleri - uyarlama yapmak için aşağıdakilere erişebilirsiniz:
- (son ek yok) - qcode.code için bir takma ad
- .code - soru ilintiliyse sorunun seçilen yanıt kodu (aksi halde boş) veya kodlu bir soru değilse metin değeri
- .NAOK - .code ile aynıdır, ancak ilintisiz olsa bile hesaplamaların veya listelerin parçası olabilir
- .value - soru ilintiliyse sorunun Değer'i (aksi halde boş) veya kodlu bir soru değilse metin değeri -- anket için değerlendirmeler etkinse kullanılabilir, aksi halde her zaman sıfırdır
- .valueNAOK - .value ile aynıdır, ancak ilintisiz olsa bile hesaplamaların veya listelerin parçası olabilir
- .shown - yanıtın kullanıcıya görüntülendiği hali
- .qid - Soru kimliği
- .gid - Grup kimliği
- .sgqa - sorunun SGQA değeri
- .jsName - bu sayfada veya başka bir sayfada tanımlanmış olmasına bakılmaksızın sorunun doğru javascript değişken adı
- .qseq - soru sırası (0'dan başlar)
- .gseq - grup sırası (0'dan başlar)
- .mandatory - sorunun zorunlu olup olmadığı (Y/N)
- .question - sorunun metni
- .relevance - sorunun İlinti denklemi
- .grelevance - grubun İlinti denklemi
- .relevanceStatus - sorunun şu anda ilintili olup olmadığı (boolean (PHP ve JS'de farklı olabilir))
- .type - Soru türü (tek karakterlik kod)
- Sayfa içi dinamik değişiklikler
- Tüm İlinti, Hesaplama ve Uyarlama bir sayfada dinamik olarak çalışır - bu nedenle değerlerdeki değişiklikler sayfayı anında günceller
- Böylece sorular ilintili olup olmadıklarına göre dinamik olarak görünür/kaybolur
- Sorular ayrıca sayfadaki yanıtlara göre dinamik olarak uyarlanır, böylece devam eden toplamları, uyarlanmış cümleleri ve özelleştirilmiş raporları görebilirsiniz.
- Yeni Veri girişi sayfası
- Geçerli veri girişi sistemini kullanmaya ek olarak, Survey-All-In-One'ı da kullanabilirsiniz.
- Bu, sayfa içi ilinti ve uyarlamayı destekler, böylece veri giriş görevlileri alanlar arasında hızla gezinebilir ve yalnızca ilintili yanıtları girmeleri gerekir
- Veri girişi yapan kişinin yine dinamik olan uyarlamayı görmesi gerekiyorsa bu çok önemli olabilir.
- Özel JavaScript ihtiyacının çoğunu ortadan kaldırır
- EM karmaşık hesaplamaları, puanlamayı, uyarlamayı ve koşullu mantığı kolayca destekler.
- Bazı şeyler için hâlâ JavaScript gerekecektir (özel düzenler ve soru alt öğelerini koşullu olarak gizleme gibi), ancak JavaScript'iniz EM işlevlerini kullanarak sorulara SGQA yerine Qcode ile erişebilir ve yukarıda listelenen tüm soru özelliklerine erişebilir.
EM'nin sağladığı diğer yararlı yeni özellikler nelerdir?
Koşullar Düzenleyicisi'ni kullanmaya devam etseniz de İlinti Denklemlerini el ile yazsanız da şu ek avantajlardan yararlanırsınız:
- Daha karmaşık doğrulama ölçütleri oluşturabilirsiniz
- Gelişmiş soru özniteliklerinin tümü (max_answers, min_num_value_n, max_num_value gibi) İfadeleri kullanabilir. Böylece en küçük/en büyük ölçütlerinizi, aynı sayfada olsalar bile, önceki yanıtlara göre kolayca ayarlayabilirsiniz.
- EM ayrıca düzenli ifade tabanlı tüm doğrulamaları da yönetir; böylece preg ve denklem tabanlı soru özniteliklerini sağlam biçimde bir arada kullanabilirsiniz.
- Soruları ve Grupları kolayca yeniden sıralama (veya silme)
- 1.92 sürümünden önce, LimeSurvey yeniden sıralamanın kullanıldıkları koşulları bozabileceğini düşünürse soruları veya grupları yeniden sıralayamazdınız. Benzer şekilde, başka sorular bir soruya bağlıysa o soruyu silemezdiniz.
- EM'in sözdizimi vurgulaması sayesinde, soruları bildirilmeden önce kullanmaya çalışıp çalışmadığınızı görmek ve doğrulamak kolaydır. Bu nedenle artık soruları ve grupları istediğiniz zaman yeniden sıralamanıza veya silmenize izin veriyoruz. EM olası hataları göstermek için tüm sözdizimi vurgulamasını güncelleyecektir.
- Soruları yeniden sıralama görünümü bu tür incelemelere yardımcı olacak şekilde geliştirildi. Artık sorunun ilinti denklemini ve uyarlamasını gösterdiği için herhangi bir değişkenin pembe olup olmadığını (yani bildirilmeden önce kullanıldığını) hemen görebilirsiniz.
- Soru/Grup Gezinti Dizini her zaman kullanılabilir ve doğrudur
- 1.92 sürümünden önce, karmaşık koşullar varsa bu dizinler kullanılamıyordu
- EM ile bunların doğru olduğunu garanti edebiliriz.
- Katılımcılar önceki bir soruya geri dönüp yanıtı değiştirebilir, ardından yeniden ileri atlayabilir (veya gönderebilir)
- İleri atlarken EM, aradaki tüm soruları/grupları yeniden doğrular.
- Herhangi bir soru ilintisiz hale gelirse, verileriniz kendi içinde tutarlı olsun diye veritabanında NULL yapılır
- Herhangi bir soru ilintili hale gelirse veya zorunluluk ya da doğrulama kurallarını yeni karşılamaz duruma gelirse EM o sayfada durur ve kullanıcıyı son hedefine atlamadan önce bu soruları yanıtlamaya zorlar.
- Koşulların İlintiye otomatik dönüştürülmesi
- Veritabanınızı yükselttiğinizde, koşulları olan tüm mevcut anketler için ilinti denklemleri oluşturulur
- Bir anketi içe aktardığınızda, gerektiğinde ilinti denklemleri oluşturulur
- Koşulları her eklediğinizde, sildiğinizde veya değiştirdiğinizde EM uygun ilinti denklemini oluşturur.
- Kullanışlı Sözdizimi Vurgulaması
- EM ilinti denklemini gösterirken, bir SGQA kodu girmiş olsanız bile Qcode'u gösterir; çünkü bunun okunmasının daha kolay olacağını varsayarız.
- Tüm değişkenler, geçerli sorudan (veya geçerli gruptan) önce mi sonra mı bildirildiklerini göstermek için renk kodludur. Bu, ilinti (array_filter dahil), uyarlama veya doğrulama denklemleri için değişkenleri bildirmeden önce kullanmaya çalıştığınız durumları hızla fark edip düzeltmenizi sağlar.
- Ayrıca fare imlecini renk kodlu değişkenin üzerine getirirseniz, o soru hakkındaki en önemli üst veriyi görürsünüz. Bu; Grup Sırası #, Soru Sırası #, Qcode, sorunun metni ve (numaralandırılmış yanıt seçenekleri olan bir soru türüyse) kullanılabilir tüm yanıt seçeneklerini içerir.
- Yanıt seçenekleri listesi şu sözdizimini kullanır: 'answers':{key:val, ... }.
- key için sözdizimi 'scale~code' biçimindedir; burada scale yanıt ölçeğidir (ör. çift ölçek için), code ise yanıt kodudur.
- val için sözdizimi 'value~shown' biçimindedir; burada value değerlendirme değeridir (değerlendirme kullanılıyorsa; aksi halde code) (ör. Qcode.value), shown ise katılımcının gördüğü görüntülenen değerdir (ör. Qcode.shown)
- Bu, birçok anketin değerlendirme kipine gerek kalmadan hesaplama kullanabileceği anlamına gelir. Benzersiz, ondalıksız ve negatif olmayan numaralandırılmış yanıt seçenekleriniz varsa, doğrudan Qcode.code değerleri üzerinde hesaplama yapabilirsiniz.
- Tüm anket mantığının ve içeriğinin kolayca gözden geçirilmesi
- Anketle (veya grupla ya da soruyla) ilgili her şeyi tek sayfada görmenizi sağlayan yeni bir Anket Mantığını Göster özelliği vardır.
- Seçilen kapsam (anket, grup veya soru) için Grup, Soru, Alt Soru ve Yanıt düzeyindeki ayrıntıları gösterir
- Ayrıca ilintiyi, alt soru düzeyindeki ilintiyi (array_filter ve array_filter_exclude için), oluşturulan doğrulama denklemini (preg ve en küçük/en büyük toplam/değer sayısı gibi tüm doğrulama kuralları için) ve boş olmayan tüm soru özniteliklerini gösterir.
- Her şey sözdizimi vurgulamalıdır; böylece olası sözdizimi hatalarını (dengesiz parantezler veya değişkenlerin bildirilmeden önce kullanılması gibi) görebilirsiniz
- Sözdizimi vurgulaması, anketin hızlı gezinmesini ve düzenlenmesini destekler.
- Bir değişken adına tıklarsanız, o soruyu gösteren ve düzenlemenize olanak veren bir tarayıcı penceresi (veya sekmesi) açılır.
- Bir grup adına tıklarsanız, soruları kolayca taşıyabilmeniz için grup yeniden sıralama görünümünü gösteren bir tarayıcı penceresi (veya sekmesi) açılır.
- Tüm soru öznitelikleri de sözdizimi vurgulamalıdır. Bu, gelişmiş soru seçenekleri içinde (değer sayısının/toplamının en büyük/en küçük değerini bir ifadeye dayandırmak gibi) ifadeleri ayarlamanıza ve görmenize olanak verir
- EM yazarı, birlikte çalıştığı epidemiyologların ve Kurumsal Etik Kurulun, çok dallanan ve uyarlanan yapılandırılmış görüşmelerdeki binlerce sorulu anketleri doğrulayıp onaylayabilmesi için benzer (biraz daha sade) bir görünüm kullandı
Başlarken
EM ile başlamanın en iyi yolu şudur:
- En son kararlı sürümü http://www.limesurvey.org/en/download adresinden kurun
- örnek anketleri içe aktarın ve inceleyin.
- kullanım senaryolarını ve nasıl yapılır kılavuzlarını ve adım adım örnekleri inceleyin.
- EM belgelerini (bu sayfa) inceleyin
- Yerleşik EM test paketini inceleyin
- Herhangi bir anketten, araçlar altında EM seçeneğini seçin
- Kullanılabilecek işlevler, 70'ten fazla işlevi ve sözdizimini listeler
- Yalıtılmış İfadelerin Birim Testleri
- tüm EM işlevlerinin ve işleçlerinin kullanımına ilişkin örnekleri ve PHP ile 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.
Expression Manager Hangi İşlevselliği Genişletiyor/Değiştiriyor? (LimeSurvey <= 1.91+)
Koşullar => İlinti
Koşullar hangi soruların görünür olacağını denetliyordu. Genel sözdizimi SGQA işleç Değer biçimindeydi, örneğin 111X2X3 == "Y". Koşullar VE veya VEYA ile birleştirilebiliyordu, ancak VE ile VEYA'yı karıştırmak zordu. Koşulların kendisi ayrı bir tabloda saklanıyordu ve LimeSurvey kodunun büyük bir bölümü Koşulları yönetmeye ayrılmıştı. Yoğun veritabanı erişimi nedeniyle çok sayıda koşulun işlenmesi fark edilir performans sorunlarına yol açabiliyordu. Ayrıca sorulara veya gruplara koşul atadıktan sonra, bunları çoğu zaman yeniden sıralamanıza veya silmenize izin verilmiyordu.
Değerlendirmeler => Denklemler ve Mikro Uyarlama
Değerlendirmeler, kullanıcıların bir grup sorudan ölçek puanları oluşturmasını sağlıyordu. Ancak bunlar geçerli sayfada dinamik olarak değişemiyordu ve değerleri veritabanına kaydedilmiyordu.
Değiştirmeler => Mikro Uyarlama
Kullanıcılar bazı iletileri ve soruları önceki yanıtlara göre uyarlayabiliyordu. Örneğin bir soru şöyle olabilirdi: {TOKEN:FIRSTNAME}, en sevdiğiniz sporun {SPORT.shown} olduğunu söylediniz. Ancak gelişmiş JavaScript olmadan koşullu uyarlama yapmak (kişinin cinsiyetine göre "Bay" veya "Bayan" demek gibi) ya da fiilleri çekimlemek veya adları çekmek mümkün değildi. Yazarlar soruları uyarlıyormuş gibi görünen anketler hazırlayabiliyordu, ancak bu her permütasyon için ayrı sorular ve hangi soruların görüntüleneceğine karar vermek için karmaşık koşullar gerektiriyordu.
Doğrulama
Sorular Düzenli ifadelerle, en küçük/en büyük değerlerle doğrulanabiliyordu veya bir yanıtın en küçük ya da en büyük değer olarak kullanılması sağlanabiliyordu. Ancak gelişmiş JavaScript olmadan, doğrulamalar diğer değişkenlerin hesaplamalarına dayandırılamıyordu.
Denklemler
Gelişmiş JavaScript olmadan denklemler desteklenmiyordu.
Denklem Soru Türü
Gelişmiş JavaScript olmadan denklemler (ör. bir değerlendirmenin nihai puanı) veritabanına kaydedilemiyordu.
Expression Manager Bu İşlevselliği Nasıl Değiştirecek/Genişletecek?
Expression Manager, LimeSurvey içindeki yeni bir çekirdek modüldür ve eskiden özel JavaScript gerektiren türde karmaşık işlevselliği desteklemeyi çok daha kolay hale getirir. Aynı zamanda LimeSurvey'in şu anda Koşulları ve Değerlendirmeleri yönetme biçiminin yerini almaktadır.
Expression Manager (EM) ile İlgili Yeni Terminoloji
EM işlevselliğini şu terimlerle "düşünür":
- İlintiye Dayalı Dallanma - bir soru ilintiliyse sorulur, değilse sorulmaz (ör. görünmez yapılır ve veritabanında NULL olarak işaretlenir). Tüm Soru türleri için ve ayrıca her Grup için yeni bir İlinti alanı vardır (böylece aynı koşulu her soruya kopyalamak zorunda kalmadan bir koşul kümesini tüm gruba uygulayabilir ve/veya grup ve soru düzeyindeki koşullu mantığı birleştirebilirsiniz).
- Uyarlama - Hangi soruların sorulması gerektiğini bildikten sonra, uyarlama (bazen piping olarak da adlandırılır) sorunun nasıl sorulacağını belirler. Bu, yalnızca basit yer değiştirmeyi ({TOKEN:FIRSTNAME} gibi) değil, katılımcılarınızın cinsiyetine veya sayısına göre fiil çekimini ve ad çekimini de desteklemenizi sağlar. Ayrıca diğer sorulara yanıt verip vermediklerine (veya nasıl yanıt verdiklerine) göre katılımcıya ileteceğiniz iletiyi değiştirmenize olanak verir.
- Denklemler - EM, bir İfadenin sonucunu saklayan Denklem adlı yeni bir soru türü ekler. Bu denklem sonuçları, sayfada gizleseniz bile hesaplanır ve veritabanına yazılır. Bu nedenle gizli puanlama hesaplamaları, karmaşık denklemlere dayalı gezinti, değerlendirmeler ve veritabanında oluşturulması ve kolayca erişilebilir olması gereken raporlar için yararlıdırlar.
İlinti ve Basamaklı İlinti
Artık her soru türünde, sorunun görüntülenip görüntülenmeyeceğini denetleyen bir İlinti seçeneği vardır. EM, İlinti Denklemlerinin her birini anket içinde görünmeleri gereken sırayla işler. İfade doğruysa (veya eski anketleri desteklemek için eksikse) soru görüntülenir. İlintisiz ise soru gizlenir ve değer veritabanında NULL yapılır. Bir grupta ilintili soru yoksa grubun tamamı atlanır.
Ayrıca, bir ifadedeki değişkenlerden herhangi biri ilintisizse ifade her zaman yanlış olarak değerlendirilir. Bu, Basamaklı İlinti özelliğini sağlar; böylece her soru için çok uzun İlinti denklemleri yazmanız gerekmez.
Q1-Q5 olmak üzere 5 sorunuz olduğunu ve Q2'yi yalnızca Q1 yanıtlandıysa, Q3'ü de yalnızca 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 zamandır evlisiniz? |
| Q5 | Q4 | {Q1}, kaç çocuğunuz var? |
İlinti hesaplamaları JavaScript'te de çalışır; dolayısıyla yukarıdaki soruların tümünü tek sayfaya koyabilirsiniz ve yine beklendiği gibi çalışır. Hatta EM, Anket, Grup ve Her Seferinde Tek Soru anket biçimlerinin işlenme şeklini tamamen değiştirir. Artık hepsi tamamen aynı gezinti motorunu kullanır; bu nedenle anket biçeminden bağımsız olarak aynı şekilde çalışırlar.
Aynı sayfada olduğunuz sürece, girdiğiniz veriler yine orada olur, yalnızca gizlenir. Dolayısıyla bazı bilgiler girip ardından onları ilintisiz yapan bir seçenek seçerseniz, sonra yeniden ilintili hale getirirseniz yanıtlarınız hâlâ kullanılabilir olacaktır. Ancak farklı bir sayfaya geçer geçmez, veri kümesinin bütünlüğü için tüm ilintisiz yanıtlar kaybolur.
Grup Düzeyinde İlinti
Expression Manager ayrıca grup düzeyinde uygunluğu da destekler. Bu, döngü oluşturmayı kolaylaştırır. Örneğin, en fazla 10 varlık (ürünler veya bir hanedeki kişiler gibi) hakkında bilgi toplamak istediğinizi varsayalım; önce kaç varlık için takip yapılması gerektiğini belirlersiniz (örneğin hanede kaç kişinin yaşadığını sorarak veya katılımcılardan uzun bir listeden hangi ürünleri beğendiklerini işaretlemelerini isteyerek). 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 uygunluk kullanabilirsiniz. Her grubun içinde soru düzeyinde koşullu mantık da kullanabilirsiniz (örneğin her kişi için cinsiyete veya yaşa özgü takip soruları). Hangilerinin gösterileceğini belirlemek için soru düzeyindeki ve grup düzeyindeki uygunluk denklemleri AND ile birleştirilir.
Uyarlama / Aktarma
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 LimeReplacementFields alanlarına, tüm 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 düzinelerce işleve (istemci tarafında bile dinamik olarak çalışan) erişebilir.
Bu denklemleri kullanarak şunlar gibi şeyler yapabilirsiniz:
- Önceki yanıtlara göre katılımcılara koşullu olarak uyarlanmış iletiler göstermek
- Değerlendirmeler oluşturmak ve Değerlendirmeler modülünün kendisini kullanmadan, bu sonuçlara göre değerlendirme sonuçlarını göstermek (veya koşullu olarak dallandırmak ya da ileti göstermek)
- Sorularda, yanıtlarda ve raporlarda fiilleri çekimlemek ve isimleri hallere göre ç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. Boilerplate sorularına benzer, ancak görüntülenenin değerini veritabanında saklar. Dolayısıyla Denklem sorusunun yazısı bir Değerlendirme hesaplaması içeriyorsa, bu değer veritabanında, genel veya özel istatistiklerde görüntülenebilen bir değişkende saklanır.
Bu, Değerlendirme puanlarının veritabanında saklanmasıyla ilgili sık yapılan bir isteği çözer.
Sözdizimi
Küme parantezleri içindeki her şey artık bir İfade olarak kabul edilir (bir istisna dışında: başta veya sonda boşluk bulunmamalıdır - bu, Expression Manager'ın gömülü JavaScript'i işlemeye çalışmamasını sağlamak için gereklidir).
İfadelerin, açılış küme parantezinden sonra veya kapanış küme parantezinden önce boşluk bulunmadığı sürece birden çok satıra yayılmasında sakınca yoktur. Bu, aşağıdaki gibi iç içe if() deyimleri için özellikle 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',
''
)
)
)
)
)
)
)
)}
- Tüm standart matematiksel işleçler (ör. +,-,*,/,!)
- Tüm standart karşılaştırma işleçleri (ör. <,<=,==,!=,>,>=, ayrıca şu eşdeğerleri: lt,le,eq,ne,gt,ge)
- Parantezler (alt ifadeleri gruplayabilmeniz için)
- Koşullu işleçler (ör. &&,| | ve şu eşdeğerleri: and,or)
- Tek ve çift tırnaklı dizgeler (her biri diğer tırnak türüne sahip dizgeleri içerebilir)
- Virgül işleci (ifade listesi oluşturup yalnızca son sonucu döndürebilirsiniz)
- Atama işleci (=)
- Önceden tanımlı değişkenler (soruları, soru özniteliklerini ve yanıtları belirtmek için) - ör. tüm SGQA kodları
- Önceden tanımlı işlevler (şimdiden 70'ten fazla var ve yenilerini 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 AND |
| 8 | or | mantıksal OR |
| 9 | = | atama işleci |
| 10 | , | virgül işleci |
Artı işleci (+) ile ilgili uyarı
JavaScript ile PHP arasındaki tutarlılık için artı işleci (+), her iki işlenen de sayısal ise toplama yapar, ancak her iki parça da sayısal olmayan dizgeler ise birleştirme yapar. Bununla birlikte, amacınızı daha net ortaya koyduğu ve dizge beklerken sayı almanız (veya tersi) durumunda beklenmedik sonuçlardan kaçındığı için birleştirme için join() işlevini, toplama için sum() işlevini kullanmanızı öneririz.
Sayı ile dizge uyuşmazlığı ve alfabetik karşılaştırma ile ilgili uyarı
Değerleri göreli veya eşitlik karşılaştırmalarıyla karşılaştırmak istediğinizde tür uyuşmazlığına dikkat edin. Kullanıcı tarafından girilen değer veya seçilen yanıt kodu, açıkça bir sayıysa sayı olarak kullanılabilir.
Değerlerden birini " ile çevrelerseniz karşılaştırma metin olarak (alfabetik karşılaştırma) yapılır. Sayısal olarak karşılaştırmak istiyorsanız sayıyı asla tırnak işaretleri, ", ile çevrelemeyin.
Örneğin Q0.NAOK değeri 9 olan sayısal bir soruysa Q0.NAOK > "50" doğrudur. Bunun nedeni, > işlecinin karşılaştırmayı sayısal değil alfabetik kabul etmesidir.
Tamsayı değerini kesin olarak karşılaştırmak için intval(Q0.NAOK) > 50 kullanabilirsiniz; yalnızca Q0.NAOK bir sayı değilse (boş veya dizge ise) intval(Q0.NAOK) == 0 olacağını unutmayın. Dizge değerini ("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 ancak NULL yapılması gereken sorular veya atlanan ancak 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 onu kullanıma sunduk.
Sizi bu işleç konusunda uyarmak için, sözdizimi denklemlerinde kırmızı yazı tipiyle gösterilir (böylece "==" ile karıştırmazsınız).
Atama İşlecini Kullanma
Atama kullanmak isteyebileceğiniz başlıca nedenler şunlardır:
- Denklem yoluyla varsayılan değer kabul etmeyen bir soru için varsayılan değeri ayarlamanız gerekir (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). 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
- Karmaşık bir kota gerekir: kota için gizli bir tekli seçim kullanıp atama ile ayarlamak
- vb...
Bu amaçla Expression Manager sisteminin tamamını kullanabilirsiniz.
Bazı örnekler:
- Kısa yazı sorusunun yanıtını küçük harfe ayarlama :
{QCODE=strtolower(QCODE.NAOK)} - Anketin başında bir dizi soru türüne varsayılan yanıt ayarlama :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Anketin başında bir dizi metin soru türüne varsayılan yanıt ayarlama :
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - Koşullu bir yanıt ayarlama :
{QCODE=if(YesNo="Y","A1","")}
XSS güvenliği
XSS etkinleştirildiğinde, ifade yöneticisi sisteminin bazı özellikleri kullanılamaz:
- Bir HTML etiketini bir ifadede başlatıp başka bir ifadede bitirmek
- URL içinde karmaşık bir ifade kullanmak.
Örnek ve çözüm yolu
{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
İfade Yöneticisi, ihtiyaç duyabileceğimiz tüm değişkenlere salt okunur erişim sağlar. Geriye dönük uyumluluk için aşağıdakilere erişim sunar:
- TOKEN:xxx - bir kodun (token) değeri (örn. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Yalnızca anonim OLMAYAN anketlerde).
- QCODE.shown - İfade Yöneticisi kullanılarak bir yanıtın görüntülenen değeri (örn. "Evet").
- Şablonlar 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.
Ayrıca İfade Yöneticisi, değişkenlere Soru kodu (veri tabanındaki sorular tablosunda yer alan 'title' sütunu) ile başvurmanıza olanak tanır. 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 mümkün kılar.
Önemli: Yalnızca önceki sayfalarda veya sorularda yer alan değişkenlere başvurmak güvenlidir.
Ayrıca İfade Yöneticisi, 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 yazı 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 yazı 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 ya da başka bir sayfada tanımlanmış olmasından bağımsız olarak 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üzenleyici kullanırsanız bazı karakterler HTML varlıklarıyla değiştirilir.
- & yerine &
- < yerine <
- > yerine >
HTML düzenleyici kullanırsanız şunları kullanmanız gerekir:
- & için and
- < için lt
- <= için le
- > için gt
- >= için ge
Qcode değişken adlandırması
Soru türüne göre bir Qcode'un nasıl oluşturulacağının (ve bazı özelliklere nasıl erişileceğinin) ayrıntıları aşağıdadır. Genel olarak Qcode'lar şu şekilde oluşturulur:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Alt soru kodunun ve ölçek kimliğinin kullanılıp kullanılmayacağı soru türüne bağlıdır - aşağıdaki tabloya bakın. Açıklama ve diğer için soru kodları 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, seçenek düğmeleri | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Dizi (10 noktalı seçim), seçenek düğmeleri | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Dizi (5 noktalı seçim), seçenek 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üşüş), seçenek düğmeleri | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Dizi (çoklu esnek) 1 - 10 | 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), seçenek düğmeleri | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Hazır 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 listesi | 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/seçenek düğmeli liste | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Açıklamalı liste, açılan liste/seçenek düğmeli liste + 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, seçenek düğmeleri | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
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 ya da puanları toplamak gibi. Başka zamanlarda ise bir sorunun yalnızca belirli satırlarını veya sütunlarını işlemek istersiniz (örneğin 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 yalnızca "Tüm soru geçerliliği denklemi" ve "Alt soru geçerliliği denklemi" gelişmiş soru seçenekleri içinde kullanılır. Bu sorulardaki her hücrenin değişken adlarına genişletilir. Yani 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' ve 'that' değişkenleri daha güçlüdür ve denklemler işlenmeden önce genişletilen makrolar olarak çalışır. Sözdizimi seçenekleri şunlardır:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix (son ek), normal qcode son eklerinden herhangi biridir (örn. NAOK, value, shown)
sub-selector şunlardan biridir:
- comments - yalnızca açıklama olan alt sorular (örn. açıklamalar ile birkaç seçenek ve açıklamalı liste sorularından)
- nocomments - yalnızca açıklama olmayan alt sorular
- sq_X - X bir satır veya sütun tanımlayıcısıdır. Yalnızca X örüntüsüyle eşleşen alt sorular seçilir. Aramanın tam kod tanımlayıcısı üzerinde yapıldığını, ardından sq_X eşleşmesinin nX, X, Xn alt sorularını da kapsadığını unutmayın (örn. sq_1 kullanırsanız a1, 1a, 1, 11 veya 001 alt soruları dahil edilir). Alt soru kodlarının QCODE_SQCODE_1 ve QCODE_SQCODE_1 olduğu çift ölçekli soru türüne ve alt soru kodlarının QCODE_1, QCODE_2 ... olduğu sıralama sorusu türüne dikkat edin.
- nosq_X - X bir satır veya sütun tanımlayıcısıdır. Yalnızca X örüntüsüyle eşleşmeyen alt sorular seçilir. Aramanın tam kod tanımlayıcısı üzerinde yapıldığını, ardından nosq_X eşleşmesinin nX, X, Xn alt sorularını kapsamadığını unutmayın.
Örnekler:
- Sorunun herhangi bir bölümü 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ı ve 1-5 sütunları olan 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 'self' değişkenine benzer, ancak diğer sorulara başvurmanızı sağlar. Sözdizimi şöyledir:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname, herhangi bir alt soru uzantısı olmayan soru adıdır. Örneğin 'q1' adlı bir soru oluşturduysanız, qname budur.
Örnekler:
- q1 sorusunun herhangi bir bölümü yanıtlandı mı? {count(that.q1.NAOK)>0}
- q2 için değerlendirme puanı nedir? {sum(that.q2.NAOK)}
- q3'ün ana toplamı nedir? {sum(that.q3.NAOK)}
- q4'te C satırının toplamı nedir? {sum(that.q4.sq_C.NAOK)}
- q4'te 2. sütunun toplamı nedir? {sum(that.q4.sq_2.NAOK)}
'self' ve 'that' değişkenleri herhangi bir ilinti, geçerlilik veya uyarlama (tailoring) işleminde kullanılabilir.
Tek uyarı şudur: Mantık dosyasını göster özelliğini kullandığınızda, 'self' ve 'that' değişkenlerinin genişletilmiş değeri gösterilir. Bu, oluşturulacak gerçek denklemi görmenizi ve (sizin ile İfade Yöneticisi'nin) değişkenlerin var olduğunu doğrulamasını sağlar. Oldukça uzun denklemler görebileceğiniz için bu kafa karıştırıcı görünebilir. Ancak soruyu düzenlerseniz, 'self' ve/veya 'that' kullanan özgün denklemi görürsünüz.
Ayrıca, (a) bir denklemde kullanılan her değişkeni açıkça adlandırmak istiyorsanız veya (b) alt sorusu olmayan değişkenler (ör. tek yanıtlı sorular) kullanıyorsanız bu değişkenleri kullanmamanız gerektiğini unutmayın. Bu durumlarda bir değişkenin önüne 'that' eklemek gereksizdir ve beklenmedik sonuçlar alma riskiyle karşı karşıya kalırsınız.
NAOK Kullanımı
NAOK --> "Not Applicable" (NA; Uygulanamaz) olması sorun değildir (OK)
NAOK kullanmak, değişkenlerin tamamının veya bir kısmının ilgisiz olabileceği anlamına gelir (ör. "Not Applicable" (NA; Uygulanamaz) olması sorun değildir (OK)).
Bir sorudaki herhangi bir değişkeni bir denkleme eklediğinizde: bu soru (veya alt soru) bir koşul nedeniyle gizliyse, denklemin tamamı devre dışı kalır.
Örneğin: Q1'in bir alt sorusu filtrelenmişse count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) her zaman boş bir dize döndürür. Böyle bir soruda işaretlenen alt soruların sayısını bulmak için count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK) kullanılabilir. Alt soru gizliyse: Expression Manager boş bir dize döndürür.
NAOK olmadan: bir soru veya bir alt soru gizliyse Expression Manager her zaman boş bir dize döndürür, bu da false döndürmekle aynıdır.
.shown her zaman NAOK sistemini kullanır (gizliyse boş dize döner), ancak cevabın koduna ihtiyacınız varsa, Soru kodunun ardından .NAOK eklemek her zaman iyi bir fikirdir. Yalnızca buna ihtiyaç duyuyorsanız ve ne yaptığınızı biliyorsanız bunun dışında kalabilirsiniz.
Başka bir örnek ve bilgi için Kademeli Koşulların Geçersiz Kılınması bölümüne bakın.
Fonksiyonlara Erişim
Expression Manager, aşağıda gösterildiği gibi matematiksel, dizeye yönelik ve kullanıcı tanımlı fonksiyonlara erişim sağlar. Bu fonksiyonların PHP ve JavaScript karşılıkları vardır; 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 eğik çizgilerle tırnaklar | 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 | Miladi takvimde geçerli bir tarih ise doğru (1) değerini döndürür | bool checkdate(month,day,year) |
| convert_value | Sayısal değerlerden oluşan bir giriş tablosu ve çıkış 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) sağ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 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ı tekrar 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 (Updated in 3.0.2 ) | 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 kayan noktalı sayı 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) | Elemanları 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) sağlayan sorulardan, belirtilen soru özelliğinin (retProp) 'glue' ile ayrılmış listesini döndürür | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | Sayının verilen tabana göre logaritması; taban verilmemişse doğal logaritması. | number log(number,base=e) |
| 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 yeni satırlardan ö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 kurallı bir ifadeyle 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 | Hemen her İngilizce metinsel 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) sağ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 karakterini büyük harfe çevirir | string ucwords(string) |
| unique | Tüm boş olmayan yanıtlar benzersiz ise doğru değerini döndürür | boolean unique(arg1, ..., argN) |
Planlanan veya Değerlendirilen İşlevler
Planlanan (veya değerlendirilen) ancak henüz uygulanmamış diğer işlevler aşağıda verilmiştir. Bunlardan bazıları başka bir anket aracıyla geriye dönük uyumluluk içindir.
| Söz dizimi | Anlamı | Açıklamalar |
|---|---|---|
| e() | e değerini döndürür | |
| formatDate(X,PAT) | X tarihinin dize değerini, Java tarih biçimi deseni PAT'a göre biçimlendirilmiş olarak döndürür | |
| formatNumber(X,PAT) | X sayısının dize değerini, Java sayı biçimi deseni PAT'a göre biçimlendirilmiş olarak döndürür | |
| getAnsOption(X) | Çekirdek eklenti ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Çekirdek eklenti ExpressionAnswerOptions | |
| getRelevance(X) | X sorusunun ilinti denklemini döndürür | |
| getStartTime() | görüşmenin başlatıldığı andaki sistem saatine karşılık gelen tarihi döndürür | |
| getType(X) | veri türünün dize adını döndürür - örn. isNA() ise *NA* | |
| gotoFirst() | ilgili ilk soru kümesine atlar - bu, sistemin normal akışını bozar | |
| gotoNext() | ilgili sonraki soru kümesine atlar - bu, sistemin normal akışını bozar | |
| gotoPrevious() | ilgili önceki soru kümesine atlar - bu, sistemin normal akışını bozar | |
| isAsked(X) | yanıt *NA*, *INVALID* ya da *UNASKED* değilse true döndürür | |
| isInvalid(X) | yanıt *INVALID* türündeyse true döndürür | |
| isNA(X) | yanıt *NA* türündeyse true döndürür | |
| isNotUnderstood(X) | yanıt *HUH* türündeyse true döndürür | |
| isRefused(X) | yanıt *REFUSED* türündeyse true döndürür | |
| isSpecial(X) | yanıt *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* ya da *HUH* türündeyse true döndürür | |
| isUnknown(X) | yanıt *UNKNOWN* türündeyse true döndürür | |
| jumpTo(X) | adı verilen soruyu içeren gruba atlar -- bu, sistemin normal akışını bozar | |
| jumpToFirstUnasked() | sorulmamış ilk soruya atlar |
|
| lastIndexOf(X,Y) | Y dizesinin X dizesindeki son dizinini (0 tabanlı) döndürür. Y, X içinde yer almıyorsa -1 döndürür | |
| list(X,...) | pozitif değerlerin virgülle ayrılmış listesini içeren bir dize; son iki değer "ve" ile ayrılır | |
| mean(X,...) | bir değer listesinin ortalamasını döndürür | |
| numAnsOptions(X) | X sorusunun sahip olduğu yanıt seçeneklerinin sayısını döndürür | |
| orlist(X,...) | pozitif değerlerin virgülle ayrılmış listesini içeren bir dize; son iki değer "veya" ile ayrılır | |
| parseDate(X,PAT) | X dizesinin Java tarih biçimi deseni PAT ile ayrıştırılmış tarih değerini döndürür | |
| parseNumber(X,PAT) | X dizesinin Java sayı biçimi deseni PAT ile ayrıştırılmış sayısal değerini döndürür | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | questionList = dikey çizgiyle ayrılmış soru tanımlayıcıları listesi; attributeList = dikey çizgiyle ayrılmış öznitelikler listesi (soru no, başlık, metin, tür gibi - böylece neyin gösterileceğine siz karar verebilirsiniz); attributeTitleList = dikey çizgiyle ayrılmış tablo başlıkları listesi, böylece rapor uluslararasılaştırılabilir. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | questionList = dikey çizgiyle ayrılmış soru tanımlayıcıları listesi; attributeList = dikey çizgiyle ayrılmış öznitelikler listesi (soru no, başlık, metin, tür gibi - böylece neyin gösterileceğine siz karar verebilirsiniz); attributeTitleList = dikey çizgiyle ayrılmış tablo başlıkları listesi, böylece rapor uluslararasılaştırılabilir. |
Expression Manager Hangi Değişkenlerin Yerel Olduğunu Bilir
Sayfanın JavaScript kodunu doğru biçimde oluşturabilmek için Expression Manager'ın sayfada hangi değişkenlerin ayarlandığını ve JavaScript kimliklerinin ne olduğunu (örn. document.getElementById(x) için) bilmesi gerekir. Ayrıca hangi değişkenlerin diğer sayfalarda ayarlandığını da bilmelidir (böylece gerekli <input type='hidden' value='x'> alanlarının mevcut ve dolu olduğundan emin olabilir).
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
| İşleç | Örnek | a | b | Sonuç |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (veya eq) | a == b | N/A | 5 | false |
| == (veya eq) | a == b | N/A | 0 | false |
| == (veya eq) | a == b | N/A | N/A | false |
| != (veya ne) | a != b | N/A | 5 | false |
| != (veya ne) | a != b | N/A | N/A | false |
| != (veya ne) | a != b | N/A | 0 | false |
| > (veya gt) | a > b | N/A | 5 | false |
| >= (veya ge) | a >= b | N/A | 5 | false |
| < (veya lt) | a < b | N/A | 5 | false |
| <= (veya 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 |
| işlev | sum(a,b,b) | N/A | 5 | false |
| işlev | max(a,b) | N/A | 5 | false |
| işlev | min(a,b) | N/A | 5 | false |
| işlev | implode(', ',a,b,a,b) | N/A | 5 | false |
| işlev | if(a,a,b) | N/A | 5 | false |
| işlev | is_empty(a) | N/A | false | |
| işlev | is_empty(a) | 0 (veya boş) | true | |
| işlev | !is_empty(a) | N/A | false |
Basamaklı Koşulları Geçersiz Kılma
Tüm ilgili yanıtların güncel toplamını 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'))) biçimine çevrilir. Dolayısıyla q1-qN değerlerinden herhangi biri ilgisizse denklem her zaman false döndürür. Bu durumda sum(), tüm sorular yanıtlanana kadar 0 gösterir.
Bunu aşmak için her değişkene ".NAOK" son eki eklenebilir (Not Applicable is OK, yani "Uygulanamaz olması sorun değil" anlamına gelir). Bu durumda aşağıdaki 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 ilgisiz tekil yanıtlar yok sayılır, ancak ifadenin tamamını geçersiz kılmaz).
Dolayısıyla güncel toplam sorununun çözümü sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) denklemini kullanmaktır.
.NAOK son eki, yazarların birkaç olası yola sahip ancak daha sonra ortak yollarda birleşen anketler tasarlamasına da olanak tanır. Örneğin katılımcılar bir ankete olağan yanıt aralığının dışında yanıt veriyor olsun. Yazar, katılımcıları geçerli sonuçlar alamayabilecekleri konusunda uyarabilir ve anketle gerçekten devam etmek isteyip istemediklerini sorabilir. Evet derlerse kalan sorular gösterilir. "Kalan sorular" için koşul, ilk yanıtların olağan aralıkta olup olmadığını VEYA katılımcının yalnızca olağan aralığın dışında yanıt verdiyse ilgili olan soruya Evet deyip demediğini denetler.
Expression Manager Koşullu Mikro Uyarlamayı Nasıl Destekler?
İşte bir mikro uyarlama örneği (burada Soru türü=='expr' bir Denklem anlamına gelir):
| Soru kodu | İlinti | 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),'young',if( (age>80),'old','middle-aged') ) } olduğunuz için devam edemezsiniz. |
| 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 | yesno | {name}, {age} yaşında olduğunuzu ve {numKids} çocuğunuz olduğunu belirttiniz. İlk {min(numKids,5)} çocuğunuzun yaşları toplamı {sumage} |
Bu soruların tümü tek bir sayfada (örn. 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 sayfada dinamik olarak güncellenir.
Expression Manager bu işlevselliği, 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 onlarca, hatta yüzlerce böyle uyarlanmış ifade bulunabilir ve sayfa hepsini tek bir ekran yenilemesinde yeniden görüntüler.
LimeSurvey 1.91+ İşlevselliğinin Expression Manager İşlevselliğiyle Eşleştirilmesi
| Eski özellik | Yeni özellik | Açıklamalar |
|---|---|---|
| Koşullar | İlinti | Çok karmaşık koşullu denklemler kullanabilir ve daha geniş bir değişken yelpazesine erişebilirsiniz |
| Değerlendirmeler | Denklem | Tüm değerlendirme puanları bir Denkleme dönüştürülebilir. Bu, puanın veritabanına yazılmasını sağlar ve ayrıca puan değerindeki değişiklikleri geçerli sayfada dinamik olarak görmenizi sağlar |
| Yerine koymalar | Expression Manager | Çekirdek motor girdi dizesini alır ve küme parantezleri içindeki her şeyi bir İfade olarak ele alır - böylece tüm geçmiş yerine koyma türlerini işler. Gömülü JavaScript'i bozmamak için Expression Manager, küme parantezleri içeriğini yalnızca (a) küme parantezlerinin içinde baştaki ya da sondaki boşluk yoksa işler - örn. {expr} bir ifadedir, ancak { expr}, {expr } ve { expr } ifade değildir. Ayrıca Expression Manager kendi dizeleri içindeki içeriği işlemez (örn. {list('hi','there {braces}')} "hi there {braces}" üretir). Kaçışlı küme parantezlerini de yok sayar (örn. \{this is not an expression\}) |
| Doğrulama | Expression Manager | Plan, mevcut en az/en çok Soru öznitelikleri alınıp Expression Manager tarafından işlenmesidir. Böylece en az/en çok değerleri de ifade olabilir |
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 Vurgulama Türleri ve Anlamları
| Renk | Örnek | Anlamı | Araç ipucu | Açıklamalar |
|---|---|---|---|---|
| ten rengi arka plan | Örnek | denklemin tamamı | yok | Süslü parantezler içinde ve denklem olarak tanınan her şey (örneğin başında veya sonunda boşluk yoksa), çevresindeki metinden ayırt edilmesi için ten rengi arka planla renklendirilir |
| kalın kırmızı metin | Örnek | Bir hata | Hata hakkında bir açıklama | Bilinmeyen bir değişken veya bir işlevde hata olabilir, .... Anket tamamen bozulmuş olabilir, bu durum genel kullanıcıya gösterilmez. |
| mavi metin | Örnek | işlev adı | anlamı ve izin verilen söz dizimi | İşlev adları veya ardından açılış parantezi geldiği için işlev olması gereken öğeler kalın mavi metinle gösterilir. Araç ipuçları işlevin anlamını ve izin verilen söz dizimini gösterir. |
| gri metin | Örnek | dizi | yok | Tek ve çift tırnaklı diziler gri metinle gösterilir |
| camgöbeği metin | Örnek | aynı sayfada ayarlanan değişken, | [ad veya SGQA kodu]: soru; değer; her değer için kodları gösteren yanıt listesi | Geçerli soruyla aynı sayfada ayarlanan her değişken camgöbeği metinle gösterilir; bu, değişkenin JavaScript'te güncellenebileceğini belirtir. 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şlemesi de gösterilir. |
| yeşil metin | Örnek | önceki bir sayfada ayarlanan değişken | [ad veya SGQA kodu]: 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 metinle 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şlemesi de gösterilir. |
| kalın pembe metin | Örnek | sonraki bir sayfada ayarlanan değişken genel olarak: anket başlangıcında boştur, ancak dizin veya önceki sayfaya gitme ile doldurulabilir | [ad 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 metinle 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şlemesi de gösterilir. |
| kalın ten rengi metin | Örnek | bir Lime yer tutucu değeri | değer | Lime yer tutucu dizeleri ({TOKEN:xxx}, {PRIVACY_MESSAGE} gibi) kalın ten rengi metinle gösterilir. |
| kırmızı metin | Örnek | atama işleci (=) | uyarı iletisi | Atama işleçlerinden (=) birini kullanırsanız bu işleç kırmızı metinle gösterilir. Bu, a == b olup olmadığını denetlemek isterken yanlışlıkla a = b şeklinde değer atamanızı önlemeye yardımcı olur. |
| normal siyah metin | Örnek | noktalama | yok | İfade içindeki diğer tüm noktalama işaretleri normal siyah metinle gösterilir. |
| kırmızı kutulu metin | hatanın çevresinde kalın kırmızı bir çizgi bulunur | söz dizimi hatası | hatanın açıklaması | Algılanan tüm söz dizimi hataları, hatanın çevresine kırmızı bir kutu çizilerek 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 işleç eksikliği), salt okunur bir değişkene yeni değer atanmaya çalışılması, değişken olmayan öğelere değer atanmaya çalışılması veya desteklenmeyen söz dizimi kullanılması yer alır. Söz dizimi hatası algılama sisteminin, birden çok hata olsa bile bir ifadede yalnızca bir hata bildirebileceğini unutmayın; ancak herhangi bir hata algılanırsa en az bir hata gösterilir. |
Ek Okumalar
Expression Manager örnek anketleri
Kullanım Senaryoları ve Nasıl Yapılır Kılavuzları
Adım Adım Örnekler
Expression Manager istatistik işlevleri
Geliştiriciler İçin Başvuru Kılavuzu










