Expression Manager
From LimeSurvey Manual
Rýchly úvod
Prehľad
Pri prispôsobovaní prieskumov zvyčajne potrebujete spôsob, ako určiť nasledujúce:
- Navigácia/vetvenie - umožňuje, aby odpovede respondenta menili poradie, v akom sa kladú otázky
- Prispôsobenie/piping - ako sformulovať otázku (napríklad odkazom na predchádzajúce odpovede alebo skloňovaním viet podľa počtu či pohlavia respondentov) alebo ako vytvoriť vlastné správy (napríklad skóre hodnotenia alebo poradenstvo na mieru).
- Validácia - zabezpečuje, aby odpovede spĺňali určité kritériá, napríklad minimálne a maximálne hodnoty alebo zhodu so vstupným vzorom
Expression Manager (EM) poskytuje intuitívny spôsob zadávania logiky pre každú z týchto funkcií. Takmer čokoľvek, čo môžete zapísať ako štandardnú matematickú rovnicu, je platný výraz, aj keď voláte funkcie. EM v súčasnosti poskytuje prístup k 80 funkciám a možno ho jednoducho rozšíriť o ďalšie. Umožňuje tiež pristupovať k vašim premenným pomocou ľudsky čitateľných názvov premenných (namiesto názvov SGQA).
Nasledujúce časti ukazujú hlavné miesta, kde sa Expression Manager používa
Niektoré prieskumy používajú „Goto Logic“, napríklad ak odpoviete na otázku 1 možnosťou C, preskočí sa na otázku 5. Tento prístup je veľmi obmedzujúci, pretože sa ťažko overuje a ľahko sa pokazí pri zmene poradia otázok. EM používa booleovskú rovnicu relevantnosti na určenie všetkých podmienok, za ktorých môže byť otázka platná. Ak je otázka relevantná, zobrazí sa, v opačnom prípade je nepoužiteľná (Not Applicable) a do databázy sa uloží hodnota NULL. Je to podobné tomu, čo možno urobiť pomocou editora podmienok, ale EM umožňuje jednoducho zadať oveľa zložitejšie a výkonnejšie kritériá (a umožňuje používať názov premennej namiesto názvov SGQA).
Tento obrázok ukazuje jeden zo spôsobov, ako skontrolovať logiku relevantnosti prieskumu. Počíta index telesnej hmotnosti (BMI). Rovnica relevantnosti je zobrazená v hranatých zátvorkách hneď za názvom premennej (ktorý je zelený). Relevantnosť premenných weight, weight_units, height a height_units je teda vždy 1, čo znamená, že tieto otázky sa kladú vždy. Relevantnosť pre BMI je však {!is_empty(height) and !is_empty(weight)}, čo znamená, že BMI sa vypočíta, len ak respondent zadá hodnotu pre výšku aj hmotnosť (čím sa predíde riziku chyby delenia nulou). Otázka Report sa tiež zobrazí, iba ak respondent odpovie na všetky štyri hlavné otázky (height, height_units, weight, weight_units).
Relevantnosť sa zobrazuje a dá sa upravovať na týchto miestach:
Zobrazenie / úprava relevantnosti na úrovni otázky
Táto rovnica počíta index telesnej hmotnosti (BMI). Otázka sa kladie, len ak osoba najprv zadá svoju výšku a hmotnosť.
Toto je obrazovka úprav otázky BMI.
Upozorňujeme, že pri zadávaní rovnice relevantnosti sa nepoužívajú zložené zátvorky.
Zobrazenie / úprava relevantnosti na úrovni skupiny
Toto je ukážkový prieskum sčítania ľudu. Prvá strana sa pýta, koľko ľudí s vami býva, a ukladá to do premennej „cohabs“. Táto strana sa zobrazí, len ak s vami býva viac ako jedna osoba (zobrazí sa teda pre druhú osobu bývajúcu s vami) a tiež len ak ste uviedli, aký vzťah k vám má prvá osoba (p1_rel).
Ako vidíte, skupina má aj kritériá relevantnosti na úrovni otázok, takže každá otázka sa zobrazí, až keď odpoviete na otázku pred ňou (napr. {!is_empty(p1_sex)}). EM za vás skombinuje relevantnosť skupiny a otázky. Otázky v skupine sa kladú, iba ak je relevantná skupina ako celok. Potom sa kladú iba tie otázky v rámci skupiny, ktoré sú relevantné.
Tu je obrazovka na úpravu relevantnosti na úrovni skupiny pre túto otázku:
Upozorňujeme, že pri zadávaní rovnice relevantnosti sa nepoužívajú zložené zátvorky.
Prispôsobenie/piping
EM umožňuje jednoducho robiť jednoduché aj zložité podmienené prispôsobenie vašich otázok. Niekedy potrebujete iba jednoduchú substitúciu, napríklad: „Uviedli ste, že ste kúpili [Produkt]. Čo sa vám na ňom páčilo najviac?“. Niekedy potrebujete podmienenú substitúciu, napríklad „[Pán/Pani] [Priezvisko], boli by ste ochotný/á vyplniť náš prieskum?“. V tomto prípade chcete použiť oslovenie Pán alebo Pani podľa pohlavia osoby. Inokedy potrebujete ešte zložitejšiu substitúciu (napríklad na základe matematického výpočtu). EM podporuje všetky tieto typy prispôsobenia/pipingu.
Podmienené rovnice
Príklad s indexom telesnej hmotnosti ukazuje možnosť vypočítať BMI osoby, a to aj keď jej umožníte zadať výšku a hmotnosť v metrických alebo nemetrických jednotkách.
Tu je weight_kg {if(weight_units == 'kg', weight, weight * .453592)}. Funkcia if() znamená, že ak respondent zadal hmotnosť v kilogramoch, použije sa táto hodnota, v opačnom prípade sa zadaná hodnota (v librách) vynásobí číslom .453592, čím sa prevedie na kilogramy. Premenná height_m používa podobný postup na výpočet výšky osoby v metroch, aj keď zadala výšku v palcoch.
BMI vypočíta podľa vzorca {weight_kg / (height_m * height_m)}.
Nakoniec report podmienene prispôsobí správu pre respondenta a oznámi mu, čo zadal. („Uviedli ste, že merate 2 metre a vážite 70 kg.“)
Hoci to nie je na obrázku vyššie dobre vidieť, weight_status používa vnorené príkazy if() na zaradenie osoby od podváhy až po ťažkú obezitu. Jeho rovnicu si môžete pozrieť v zobrazení Show Logic View.
V okne úprav tejto otázky vidíte dve veci:
- Pri prispôsobení musia byť výrazy ohraničené kučeravými zátvorkami.
- Výrazy môžu zahŕňať viac riadkov, ak chcete, ako v tomto prípade, uľahčiť čítanie vnorenej podmienenej logiky.
Prispôsobené otázky, odpovede a reporty
Tento príklad zobrazuje report BMI.
Tu je okno úprav pre tú istú otázku.
Ako vidíte, všetko v kučeravých zátvorkách sa považuje za výraz, a preto je na predchádzajúcom obrázku zvýraznené syntaxou (farebne odlíšené). Ak by ste urobili preklepy (napríklad chybne napísané alebo nedefinované názvy premenných či funkcií), EM zobrazí chybu, ako je táto, ktorá ukazuje, že height_unit je nedefinovaný názov premennej (v skutočnosti ide o height_units) a rnd() je nedefinovaná funkcia (správny názov funkcie je round()). V oboch prípadoch sú chyby obklopené červeným rámčekom, aby sa dali ľahšie nájsť a opraviť.
Môžete tiež vidieť, že môžete rýchlo vytvárať zložité reporty, ako je tabuľka zadaných hodnôt alebo prispôsobené rady.
Nezabudnite, že pri všetkých prispôsobeniach musia byť výrazy ohraničené kučeravými zátvorkami, aby LimeSurvey vedel, ktoré časti otázky sú voľný text a ktoré sa majú spracovať cez Expression Manager.
Validácia
EM riadi fungovanie väčšiny pokročilých možností otázok. Tie ovládajú napríklad minimálny/maximálny počet odpovedí, minimálne/maximálne jednotlivé hodnoty, minimálny/maximálny súčet hodnôt a kontrolu, či zadané hodnoty zodpovedajú určeným vzorom reťazcov. Tieto pokročilé možnosti otázok zadávate naďalej ako zvyčajne. Teraz sa však každá hodnota v niektorom z týchto polí považuje za výraz, takže môžete mať kritériá minima/maxima so zložitými podmienenými vzťahmi k iným otázkam.
Vo všetkých týchto prípadoch sa pokročilá možnosť otázky vždy považuje za výraz, preto pri jej zadávaní nepoužívate kučeravé zátvorky.
Stránky Ukážkové prieskumy obsahujú mnoho funkčných príkladov použitia výrazov na validáciu.
Úvod
LimeSurvey používa nový modul Expression Manager (EM), ktorý umožní LimeSurvey podporovať zložitejšie vetvenie, hodnotenia, validáciu a prispôsobenie. Nahradí spôsob, akým LimeSurvey na pozadí spravuje náhrady, podmienky a hodnotenia. Výrazne tiež urýchli spracovanie, pretože odstraňuje väčšinu čítaní z databázy za behu. EM vyvinul Dr. Thomas White (TMSWhite).
Táto wiki stránka je smerodajnou referenciou pre syntax a funkcie Expression Manager.
Kľúčové definície
- Výraz: Čokoľvek ohraničené kučeravými zátvorkami
- Za predpokladu, že bezprostredne za otváracou zátvorkou ani pred zatváracou kučeravou zátvorkou nie je medzera
- Obsah výrazov vyhodnocuje EM, takže môže obsahovať matematické vzorce, funkcie a zložité spracovanie reťazcov a dátumov.
- Prispôsobenie: Niekedy nazývané „piping“, ide o proces podmieneného upravovania textu
- Máte prístup ku všetkým „náhradným poliam“, údajom respondenta a údajom odpovedí.
- Máte tiež jednoduchší prístup k otázkam, odpovediam a ich vlastnostiam.
- Rovnica relevantnosti: Nový atribút otázky, ktorý riadi viditeľnosť otázky
- Ak existuje rovnica relevantnosti, otázka sa zobrazí len vtedy, ak sa relevantnosť vyhodnotí ako pravdivá.
- Interne sa všetky príkazy array_filter a array_filter_exclude menia na relevantnosť na úrovni podotázok
- Rovnica ako typ otázky: Nový typ otázky, ktorý ukladá výpočty alebo reporty do databázy
- Je podobný otázke typu Boilerplate, ale jeho obsah sa ukladá do databázy, aj keď nastavíte „Vždy skryť túto otázku“
- Kód otázky: Toto je preferovaný názov premennej pre EM
- Môže to byť popisný názov označujúci účel otázky, čo uľahčuje čítanie zložitej logiky
- Platné kódy otázok by NEMALI začínať číslom, preto pri číslovaní otázok pomocou kódu otázky jednoducho použite „q1“, „q1a“ alebo „g1q2“.
- Toto sa v súčasnosti stáva názvom premennej pri exporte dát do SPSS alebo R, takže ak robíte štatistickú analýzu, pravdepodobne ste ho už urobili jedinečným.
Musím používať EM?
Krátka odpoveď je nie (ale aj áno).
EM je plne spätne kompatibilný s existujúcimi prieskumami. Ak vám teda vyhovuje používať podmienky a hodnotenia v štýle, aký LimeSurvey používal vo verziách <= 1.91+, môžete v tom pokračovať.
EM však úplne nahrádza spôsob, akým LimeSurvey interne pracuje s podmienkami. Hoci môžete naďalej používať editor podmienok na vytváranie a správu podmienok, LimeSurvey 1.92 ich prevedie na ekvivalentné rovnice relevantnosti. V rámci aktualizácie LimeSurvey 1.92 automaticky prevedie všetky existujúce podmienky na rovnice relevantnosti.
Vďaka tomu získate to najlepšie z oboch svetov – môžete LimeSurvey používať naďalej tak, ako ste zvyknutí, ale uvidíte ekvivalent v podobe rovnice relevantnosti, takže môžete postupne prechádzať priamo na rovnice relevantnosti, kedykoľvek uznáte za vhodné.
Môžem kombinovať použitie podmienok a relevantnosti?
Áno. Pre niektoré otázky môžete použiť editor podmienok a pre iné editor relevantnosti. Podmienky sa pri uložení otázky automaticky prevedú na relevantnosť.
Predpokladáme, že ak používate editor podmienok, chcete, aby tieto podmienky prepísali každú ručne zadanú rovnicu relevantnosti. Ak teda máte existujúce podmienky a chcete ručne upraviť relevantnosť, najprv odstráňte podmienky danej otázky. Konkrétne: skopírujte vygenerovanú rovnicu relevantnosti do textového editora, v ponuke Podmienky odstráňte všetky podmienky tejto otázky (tým sa odstráni aj relevantnosť), potom upravte otázku, vložte vygenerovanú rovnicu relevantnosti z textového editora späť do poľa relevantnosti tejto otázky a otázku uložte. Ak bude dostatočný záujem o odstraňovanie podmienok bez odstránenia vygenerovanej rovnice relevantnosti, mohli by sme pridať hromadný proces konverzie.
Ako si mám vybrať medzi podmienkami a relevantnosťou?
Tu je zoznam výhod a nevýhod jednotlivých štýlov:
| Štýl | Výhody | Nevýhody |
|---|---|---|
| Podmienky | 1. Pekné grafické rozhranie na vytváranie jednoduchých podmienok 2. Grafické rozhranie je dobre zdokumentované a podporný tím mu rozumie |
1. Podporuje iba jednoduché porovnania a nezvláda dobre podmienky AND/OR 2. Kaskádové podmienky fungujú nespoľahlivo 3. Pomalé - náročné na databázu, môže spomaliť dlhé prieskumy 4. Hlásené problémy s opätovným načítaním podmienok 5. Grafické rozhranie sa zle škáluje, ak existujú desiatky, stovky alebo tisíce otázok 6. Prevod papierových prieskumov môže byť pomalý, pretože treba používať názvy SGQA 7. Pre zložité vetvenie často treba programátora, ktorý napíše vlastnú logiku |
| Relevantnosť | 1. Podporuje veľmi zložitú logiku vrátane viac ako 80 funkcií a matematických/reťazcových operátorov 2. Perfektná podpora kaskádovej logiky 3. Rýchle - žiadne ďalšie volania databázy, takže podporuje prieskumy s viac ako 1000 otázkami 4. Žiadne problémy s opätovným načítaním logiky, pretože nevyžaduje kódy SGQA 5. Zvýrazňovanie syntaxe sa škáluje na prieskumy s viac ako 1000 otázkami 6. Jednoduché a rýchle použitie pre skupiny, ktoré chcú digitalizovať existujúce papierové prieskumy. 7. Jednoducho podporuje pološtruktúrované rozhovory a epidemiologické prieskumy bez potreby programátorov |
1. Žiadne grafické rozhranie pre jednoduché podmienky - namiesto toho použite zvýrazňovanie syntaxe 2. Novinka, takže podporné tímy ešte EM úplne neovládajú. |
Podstata je, že ak ste spokojní s fungovaním LimeSurvey 1.91+, nemáte dôvod meniť svoj postup.
Aké ďalšie výhody prináša používanie EM?
Tu sú ďalšie dôvody, prečo môžete chcieť používať EM.
- Výpočty - môžete vytvoriť akýkoľvek výpočet, aký si viete predstaviť:
- Máte prístup ku všetkým bežným matematickým operátorom a funkciám
- Máte prístup k viac ako 70 matematickým funkciám, funkciám pre dátumy a spracovanie reťazcov
- Vývojári môžu pomerne ľahko pridať nové funkcie, ak ich používatelia potrebujú
- Ukladanie výpočtov do databázy
- Teraz môžete vypočítať jednoduché aj zložité výpočty a/alebo skóre škál A uložiť ich do databázy bez potreby JavaScriptu.
- Na dosiahnutie tohto cieľa použijete typ otázky Rovnica.
- Hodnotenia
- Teraz môžete vytvárať hodnotenia alebo skóre škál z ľubovoľného typu otázky, nielen z podmnožiny, ktorá bola podporovaná predtým
- Pomocou prispôsobenia (tailoring) môžete zobraziť priebežné alebo celkové skóre hodnotenia kdekoľvek, kde je to potrebné - dokonca aj na tej istej stránke
- Máte väčšiu kontrolu nad zostavami generovanými na základe týchto skóre hodnotenia
- Skóre hodnotenia môžete ukladať do databázy bez potreby JavaScriptu
- Skóre hodnotenia môžete skryť bez potreby JavaScriptu alebo CSS
- Náhradné polia
- Použite kód otázky na vloženie hodnôt z odpovedí na predchádzajúce otázky - uľahčuje to čítanie a overovanie.
- Prispôsobenie (tailoring) - text môžete podmienečne zobrazovať na základe iných hodnôt
- Použite vhodné oslovenie respondenta, napr. "Dobrý deň, [pán/pani] Novák"
- Generujte gramaticky správne vety, keď záleží na jednotnom/množnom čísle: (napr. "Máte 1 dieťa" vs. "Máte 2 deti")
- Vhodne časujte slovesá a skloňujte podstatné mená podľa pohlavia a čísla respondenta.
- Nové atribúty premenných - na prispôsobenie môžete použiť nasledujúce:
- (bez prípony) - alias pre qcode.code
- .code - vybraný kód odpovede na otázku, ak je relevantná (inak prázdny), alebo textová hodnota, ak nejde o kódovanú otázku
- .NAOK - rovnaké ako .code, ale môže byť súčasťou výpočtov alebo zoznamov aj vtedy, keď je nerelevantná
- .value - hodnota hodnotenia otázky, ak je relevantná (inak prázdna), alebo textová hodnota, ak nejde o kódovanú otázku -- k dispozícii, ak sú pre prieskum povolené hodnotenia, inak vždy nula
- .valueNAOK - rovnaké ako .value, ale môže byť súčasťou výpočtov alebo zoznamov aj vtedy, keď je nerelevantná
- .shown - odpoveď tak, ako sa zobrazuje používateľovi
- .qid - ID otázky
- .gid - ID skupiny
- .sgqa - hodnota SGQA otázky
- .jsName - správny názov javascriptovej premennej otázky bez ohľadu na to, či je definovaná na tejto alebo inej stránke
- .qseq - poradie otázky (od 0)
- .gseq - poradie skupiny (od 0)
- .mandatory - či je otázka povinná (Y/N)
- .question - text otázky
- .relevance - rovnica relevantnosti otázky
- .grelevance - rovnica relevantnosti skupiny
- .relevanceStatus - či je otázka momentálne relevantná (boolean (môže sa líšiť v PHP a JS))
- .type - typ otázky (jednoznakový kód)
- Dynamické zmeny na stránke
- Všetka relevantnosť, výpočty a prispôsobenie fungujú dynamicky na stránke - zmeny hodnôt okamžite aktualizujú stránku
- Otázky sa teda dynamicky zobrazujú/skrývajú podľa toho, či sú relevantné
- Otázky sa tiež dynamicky prispôsobujú na základe odpovedí na stránke, takže môžete vidieť priebežné súčty, prispôsobené vety a vlastné zostavy.
- Nová obrazovka zadávania dát
- Okrem súčasného systému zadávania dát môžete jednoducho použiť Survey-All-In-One.
- Podporuje relevantnosť a prispôsobenie na stránke, takže pracovníci zadávajúci dáta môžu rýchlo prechádzať medzi poľami a zadávať iba relevantné odpovede
- Môže to byť kľúčové, ak osoba zadávajúca dáta potrebuje vidieť prispôsobenie, ktoré je tiež dynamické.
- Eliminuje potrebu väčšiny vlastného JavaScriptu
- EM jednoducho podporuje zložité výpočty, skórovanie, prispôsobenie a podmienenú logiku.
- Niektoré veci budú stále vyžadovať JavaScript (napríklad vlastné rozloženia a podmienečné skrývanie podprvkov otázky), ale váš JavaScript môže používať funkcie EM, takže môžete pristupovať k otázkam podľa ich Qcode namiesto SGQA a k akýmkoľvek vlastnostiam otázky uvedeným vyššie.
Aké ďalšie užitočné nové funkcie EM umožňuje?
Bez ohľadu na to, či budete naďalej používať editor podmienok, alebo ručne zostavovať rovnice relevantnosti, získate tieto ďalšie výhody:
- Môžete vytvárať zložitejšie validačné kritériá
- Všetky pokročilé atribúty otázky (ako max_answers, min_num_value_n, max_num_value) môžu používať výrazy. Kritériá minima/maxima tak možno jednoducho upraviť na základe predchádzajúcich odpovedí, aj keď sú na tej istej stránke.
- EM zvláda aj všetku validáciu založenú na regulárnych výrazoch, takže môžete spoľahlivo kombinovať atribúty otázky typu preg a atribúty založené na rovniciach.
- Jednoduché zmeny poradia (alebo odstraňovanie) otázok a skupín
- Pred verziou 1.92 ste nemohli zmeniť poradie otázok alebo skupín, ak LimeSurvey usúdil, že takáto zmena poradia môže narušiť podmienky, v ktorých boli použité. Podobne ste nemohli odstrániť otázky, ak na nich závisela akákoľvek iná otázka.
- Vďaka zvýrazneniu syntaxe v EM je ľahké vidieť a overiť, či sa nepokúšate použiť otázky skôr, než sú deklarované. Preto teraz môžete meniť poradie alebo odstraňovať otázky a skupiny, kedykoľvek chcete. EM aktualizuje všetko zvýraznenie syntaxe a ukáže vám prípadné chyby.
- Zobrazenie zmeny poradia otázok bolo vylepšené, aby pomáhalo pri takejto kontrole. Teraz zobrazuje rovnicu relevantnosti otázky a tailoring, takže okamžite vidíte, či niektoré premenné zružovejú (čo znamená, že sa používajú pred svojou deklaráciou).
- Navigačný index otázok/skupín je vždy dostupný a presný
- Pred verziou 1.92 tieto indexy nebolo možné použiť, ak existovali zložité podmienky.
- S EM môžeme zaručiť, že sú presné.
- Účastníci sa môžu dokonca vrátiť na predchádzajúcu otázku, zmeniť odpoveď a potom skočiť dopredu (alebo odoslať prieskum)
- Pri skoku dopredu EM znova overí všetky otázky/skupiny medzi nimi.
- Ak niektoré otázky prestanú byť relevantné, v databáze sa nastavia na NULL, aby boli vaše údaje vnútorne konzistentné.
- Ak niektoré otázky začnú byť relevantné alebo novo nesplnia pravidlá povinnosti či validácie, EM sa na tej stránke zastaví a prinúti používateľa odpovedať na tieto otázky pred skokom do cieľového miesta.
- Automatická konverzia podmienok na relevantnosť
- Pri aktualizácii databázy sa pre všetky existujúce prieskumy s podmienkami vygenerujú rovnice relevantnosti
- Pri každom importe prieskumu sa podľa potreby vytvoria rovnice relevantnosti
- Pri každom pridaní, odstránení alebo úprave podmienok EM vygeneruje príslušnú rovnicu relevantnosti.
- Praktické zvýrazňovanie syntaxe
- Keď EM zobrazí rovnicu relevantnosti, zobrazí Qcode, aj keď ste zadali kód SGQA, pretože predpokladáme, že sa bude ľahšie čítať.
- Všetky premenné sú farebne označené, aby ukázali, či boli deklarované pred alebo po aktuálnej otázke (alebo pred alebo po aktuálnej skupine). Vďaka tomu rýchlo odhalíte a opravíte prípady, keď sa pokúšate použiť premenné v relevantnosti (vrátane array_filter), tailoringu alebo validačných rovniciach pred ich deklaráciou.
- Ak navyše umiestnite kurzor myši nad farebne označenú premennú, zobrazia sa najdôležitejšie metadáta o tejto otázke. Patrí sem poradové číslo skupiny, poradové číslo otázky, Qcode, text otázky a všetky dostupné možnosti odpovede (ak ide o typ otázky s vymenovanými možnosťami odpovede).
- Zoznam možností odpovede používa túto syntax: 'answers':{key:val, ... }.
- key má syntax 'scale~code', kde scale je škála odpovede (napr. pri dvojitej škále) a code je kód odpovede.
- val má syntax 'value~shown', kde value je hodnota hodnotenia (ak používate hodnotenia, inak code) (napr. Qcode.value) a shown je zobrazená hodnota, ktorú vidí účastník (napr. Qcode.shown)
- To znamená, že mnohé prieskumy môžu používať výpočty bez potreby režimu hodnotenia. Ak máte vymenované možnosti odpovede, ktoré sú jedinečné, nedesatinné a nezáporné, môžete jednoducho robiť výpočty s hodnotami Qcode.code.
- Jednoduchá kontrola celej logiky a obsahu prieskumu
- Nová funkcia Zobraziť logiku prieskumu vám umožňuje vidieť všetko o prieskume (alebo skupine či otázke) na jednej stránke.
- Zobrazuje podrobnosti na úrovni skupiny, otázky, podotázky a odpovede pre vybraný rozsah (prieskum vs. skupina vs. otázka)
- Zobrazuje tiež relevantnosť, relevantnosť na úrovni podotázok (pre array_filter a array_filter_exclude), vygenerovanú validačnú rovnicu (pre preg a akékoľvek validačné pravidlá, ako minimum/maximum súčtu/počtu hodnôt) a všetky neprázdne atribúty otázky.
- Všetko je zvýraznené syntaxou, takže vidíte prípadné syntaktické chyby (ako nevyvážené zátvorky alebo použitie premenných pred ich deklaráciou)
- Zvýrazňovanie syntaxe podporuje rýchlu navigáciu a úpravu prieskumu.
- Ak kliknete na názov premennej, otvorí sa okno prehliadača (alebo karta) s touto otázkou a môžete ju upraviť.
- Ak kliknete na názov skupiny, otvorí sa okno prehliadača (alebo karta) so zobrazením zmeny poradia v skupine, kde môžete jednoducho presúvať otázky.
- Všetky atribúty otázky sú tiež zvýraznené syntaxou. Umožňuje to nastavovať a vidieť výrazy v pokročilých možnostiach otázky (napríklad založiť maximum/minimum počtu/súčtu hodnôt na výraze)
- Autor EM používal podobné zobrazenie (o niečo prehľadnejšie), aby jeho spolupracujúci epidemiológovia a etická komisia mohli overovať a schvaľovať prieskumy s tisíckami otázok vo vysoko rozvetvených a prispôsobených štruktúrovaných rozhovoroch
Začíname
Najlepší spôsob, ako začať s EM:
- Nainštalujte najnovšiu stabilnú verziu z http://www.limesurvey.org/en/download
- Importujte a preskúmajte ukážkové prieskumy.
- Preskúmajte prípady použitia a návody a príklady krok za krokom.
- Preštudujte si dokumentáciu EM (táto stránka)
- Vyskúšajte vstavanú testovaciu sadu EM
- V ktoromkoľvek prieskume vyberte v nástrojoch možnosť EM
- Dostupné funkcie obsahuje zoznam viac než 70 funkcií a ich syntax
- Jednotkové testy izolovaných výrazov
- zobrazujú príklady použitia všetkých funkcií a operátorov EM a výsledky v PHP aj JavaScripte
- upozornenie: niekoľko funkcií dáva v PHP a JavaScripte rôzne výsledky, takže vám táto stránka umožní naplánovať logiku EM podľa toho.
Akú funkcionalitu Expression Manager rozširuje/nahrádza? (LimeSurvey <= 1.91+)
Podmienky => Relevantnosť
Podmienky riadili, ktoré otázky sú viditeľné. Všeobecná syntax bola SGQA operátor Hodnota, napríklad 111X2X3 == "Y". Podmienky bolo možné spájať pomocou AND alebo OR, ale miešanie AND a OR bolo ťažké. Samotné podmienky boli uložené v samostatnej tabuľke a veľká časť kódu LimeSurvey bola venovaná správe podmienok. Kvôli rozsiahlemu prístupu k databáze mohlo spracovanie veľkého počtu podmienok spôsobiť citeľné problémy s výkonom. Navyše, keď boli podmienky priradené k otázkam alebo skupinám, často nebolo dovolené meniť ich poradie ani ich odstrániť.
Hodnotenia => Rovnice a mikro-tailoring
Hodnotenia umožňovali používateľom vytvárať škálové skóre zo skupiny otázok. Nemohli sa však dynamicky meniť na aktuálnej stránke a ich hodnoty sa neukladali do databázy.
Nahradenia => Mikro-tailoring
Používatelia mohli prispôsobiť niektoré správy a otázky na základe predchádzajúcich odpovedí. Napríklad otázka mohla znieť {TOKEN:FIRSTNAME}, uviedli ste, že {SPORT.shown} je váš obľúbený šport. Nebolo však možné robiť podmienený tailoring (napríklad uvádzať „pán“ alebo „pani“ podľa pohlavia osoby) ani skloňovať či časovať slová bez zložitého JavaScriptu. Autori mohli vytvoriť prieskumy, ktoré sa tvárili, že prispôsobujú otázky, ale vyžadovalo to samostatné otázky pre každú permutáciu a zložité podmienky na rozhodnutie, ktoré otázky zobraziť.
Validácia
Otázky bolo možné validovať pomocou regulárnych výrazov alebo minimálnych/maximálnych hodnôt, prípadne nechať odpoveď slúžiť ako minimálnu alebo maximálnu hodnotu. Validácie však nemohli byť založené na výpočtoch z iných premenných bez zložitého JavaScriptu.
Rovnice
Rovnice neboli podporované bez zložitého JavaScriptu.
Typ otázky Rovnica
Rovnice (napr. konečné skóre hodnotenia) nebolo možné uložiť do databázy bez zložitého JavaScriptu.
Ako Expression Manager nahradí/rozšíri túto funkcionalitu?
Expression Manager je nový základný modul v LimeSurvey, ktorý výrazne uľahčuje podporu zložitej funkcionality, ktorá si predtým vyžadovala vlastný JavaScript. Zároveň nahrádza spôsob, akým LimeSurvey aktuálne spravuje podmienky a hodnotenia.
Nová terminológia pri odkazovaní na Expression Manager (EM)
EM „premýšľa“ o svojej funkcionalite v týchto pojmoch:
- Vetvenie na základe relevantnosti - ak je otázka relevantná, položí sa, inak nie (t. j. stane sa neviditeľnou a v databáze sa označí ako NULL). Všetky typy otázok, ako aj každá skupina, majú nové pole Relevantnosť (takže môžete použiť sadu podmienok na celú skupinu bez nutnosti kopírovať tú istú podmienku do každej otázky a/alebo kombinovať podmienenú logiku na úrovni skupiny a otázky).
- Tailoring - Keď viete, ktoré otázky sa majú položiť, tailoring (niekedy nazývaný piping) určuje, ako sa otázka položí. Podporuje nielen jednoduchú substitúciu (napríklad {TOKEN:FIRSTNAME}), ale aj časovanie slovies a skloňovanie podstatných mien podľa pohlavia alebo počtu vašich účastníkov. Umožňuje tiež meniť správu, ktorú účastníkovi doručíte, podľa toho, či odpovedal (alebo ako odpovedal) na iné otázky.
- Rovnice - EM pridáva nový typ otázky s názvom Rovnica, ktorý ukladá výsledok výrazu. Výsledky týchto rovníc sa vypočítajú a zapíšu do databázy, aj keď ich na stránke skryjete. Preto sú užitočné pre skryté výpočty skóre, navigáciu založenú na zložitých rovniciach, hodnotenia a prehľady, ktoré sa majú vygenerovať a byť ľahko dostupné v databáze.
Relevantnosť a kaskádová relevantnosť
Každý typ otázky má teraz možnosť Relevantnosť, ktorá riadi, či sa otázka zobrazí. EM spracúva každú rovnicu relevantnosti v poradí, v akom sa majú zobrazovať v prieskume. Ak je výraz pravdivý (alebo chýba - kvôli podpore starších prieskumov), otázka sa zobrazí. Ak nie je relevantná, otázka sa skryje a hodnota sa v databáze nastaví na NULL. Ak v skupine nie sú žiadne relevantné otázky, celá skupina sa preskočí.
Ak je navyše akákoľvek premenná vo výraze nerelevantná, výraz sa vždy vyhodnotí ako nepravdivý. To umožňuje kaskádovú relevantnosť, takže nemusíte písať veľmi dlhé rovnice relevantnosti pre každú otázku.
Povedzme, že máte 5 otázok Q1-Q5 a chcete zobraziť Q2 iba vtedy, ak sa odpovedalo na Q1, Q3 iba vtedy, ak sa odpovedalo na Q2, atď. Rovnice relevantnosti môžu byť:
| Kód otázky | Relevantnosť | Otázka |
|---|---|---|
| Q1 | 1 | Aké je vaše meno? |
| Q2 | Q1 | {Q1}, koľko máte rokov? |
| Q3 | Q2 | Takže máte {Q2} rokov. Ste ženatý/vydatá? |
| Q4 | Q3 == "Y" | {Q1}, ako dlho ste ženatý/vydatá? |
| Q5 | Q4 | Koľko máte detí, {Q1}? |
Výpočty relevantnosti fungujú aj v JavaScripte - takže všetky vyššie uvedené otázky môžete umiestniť na jednu stránku a bude to fungovať podľa očakávania. EM v skutočnosti úplne nahrádza spôsob, akým EM spracúva formáty prieskumu po celom prieskume, po skupinách a po otázkach. Všetky teraz používajú presne ten istý navigačný systém, takže fungujú rovnako bez ohľadu na štýl prieskumu.
Kým ste na tej istej stránke, všetky údaje, ktoré ste zadali, tam zostanú, len budú skryté. Ak teda zadáte nejaké informácie, potom vyberiete možnosť, ktorá ich urobí nerelevantnými, a potom ich znova urobíte relevantnými, vaše odpovede budú stále k dispozícii. Akonáhle však prejdete na inú stránku, všetky nerelevantné odpovede sa stratia, aby sa zachovala integrita súboru údajov.
Relevantnosť na úrovni skupiny
Expression Manager podporuje aj relevantnosť na úrovni skupiny. Vďaka tomu je jednoduchšie implementovať cyklenie. Predpokladajme, že chcete zhromaždiť informácie až o 10 entitách (napríklad o produktoch alebo osobách v domácnosti), pričom najprv zistíte, koľko entít vyžaduje doplňujúce otázky (napríklad otázkou, koľko ľudí žije v domácnosti, alebo tým, že respondenti označia, ktoré produkty z dlhého zoznamu sa im páčia). Keď viete, koľko entít vyžaduje doplňujúce otázky, môžete pre každú z 10 skupín doplňujúcich otázok použiť relevantnosť na úrovni skupiny, napríklad {count >= 1}, {count >=2}, ... {count >= 10}. V rámci každej skupiny môžete mať podmienenú logiku na úrovni otázky (napr. doplňujúce otázky špecifické pre pohlavie alebo vek každého respondenta). Rovnice relevantnosti na úrovni otázky a skupiny sa spájajú operátorom AND, čím sa určuje, čo sa má zobraziť.
Prispôsobenie / Piping
Všetko v zložených zátvorkách sa teraz považuje za výraz (s jednou výnimkou opísanou nižšie). Výrazy majú prístup ku všetkým LimeReplacementFields, ku všetkým premenným (cez viacero aliasov), ku všetkým typickým operátorom rovníc (matematickým, logickým a porovnávacím) a k desiatkam funkcií (ktoré fungujú dynamicky aj na strane klienta).
Pomocou týchto rovníc môžete robiť napríklad toto:
- Podmienene zobrazovať prispôsobené správy respondentom na základe predchádzajúcich odpovedí
- Vytvárať hodnotenia a zobrazovať ich výsledky (alebo podľa nich podmienene vetviť či zobrazovať správy), a to bez použitia samotného modulu hodnotení
- Časovať slovesá a skloňovať podstatné mená v otázkach, odpovediach a reportoch.
- Zobraziť súhrny odpovedí pred stránkou „Zobraziť vaše odpovede“ na konci prieskumu
Rovnice
Existuje nový typ otázky s názvom Rovnica. Je podobný otázke typu Boilerplate, avšak hodnotu zobrazeného obsahu ukladá do databázy. Ak teda text otázky typu Rovnica obsahuje výpočet hodnotenia, táto hodnota sa uloží do databázy v premennej, ktorú možno zobraziť vo verejných alebo súkromných štatistikách.
Tým sa rieši častá požiadavka na ukladanie skóre hodnotenia do databázy.
Syntax
Všetko, čo je uzavreté v zložených zátvorkách, sa teraz považuje za výraz (s jednou výnimkou: na začiatku ani na konci nesmie byť medzera - je to potrebné, aby sa Expression Manager nepokúšal spracovať vložený JavaScript).
Upozorňujeme, že výrazy sa môžu rozprestierať na viacerých riadkoch, pokiaľ za otváracou zloženou zátvorkou ani pred zatváracou zloženou zátvorkou nie je medzera. To je užitočné najmä pri vnorených príkazoch if(), ako je tento:
{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',
''
)
)
)
)
)
)
)
)}
- Všetky štandardné matematické operátory (napr. +,-,*,/,!)
- Všetky štandardné porovnávacie operátory (napr. <,<=,==,!=,>,>=, plus tieto ekvivalenty: lt,le,eq,ne,gt,ge)
- Zátvorky (na zoskupovanie podvýrazov)
- Podmienkové operátory (napr. &&,| | a tieto ekvivalenty: and,or)
- Reťazce v jednoduchých a dvojitých úvodzovkách (do každého z nich možno vložiť reťazce s druhým typom úvodzoviek)
- Operátor čiarky (možno mať zoznam výrazov a vrátiť len posledný výsledok)
- Operátor priradenia (=)
- Preddefinované premenné (na odkazovanie na otázky, atribúty otázok a odpovede) - napr. všetky kódy SGQA
- Preddefinované funkcie (už ich je 70+ a ďalšie sa dajú ľahko pridať)
Operátory
Syntax EM dodržiava bežnú prioritu operátorov:
| Úroveň | Operátor(y) | Popis |
|---|---|---|
| 1 | () | zátvorky na zoskupovanie alebo volanie funkcií |
| 2 | ! - + | unárne operátory: negácia, záporné znamienko, kladné znamienko |
| 3 | * / | násobenie, delenie |
| 4 | + - | sčítanie, odčítanie |
| 5 | < <= > >= lt le gt ge | relačné porovnania |
| 6 | == != eq ne | porovnania rovnosti |
| 7 | and | logické AND |
| 8 | or | logické OR |
| 9 | = | operátor priradenia |
| 10 | , | operátor čiarky |
Upozornenie k operátoru plus (+) =
Kvôli konzistencii medzi JavaScriptom a PHP operátor plus (+) sčítava, ak sú oba operandy číselné, ale zreťazuje, ak sú oba operandy nečíselné reťazce. Na zreťazenie však odporúčame používať funkciu join() a na sčítanie funkciu sum(), pretože tak je váš zámer jasnejší a vyhnete sa neočakávaným výsledkom, ak ste očakávali reťazce, ale dostali ste čísla (alebo naopak).
Upozornenie na nezhodu medzi číslom a reťazcom a abecedné porovnávanie
Keď porovnávate hodnoty relačnými operátormi alebo operátormi rovnosti, dávajte pozor na nezhodu typov. Hodnota zadaná používateľom alebo vybraný kód odpovede sa môže použiť ako číslo, ak je to zjavne číslo.
Ak jednu z hodnôt uzavriete do ", porovnanie sa vynúti ako textové (abecedné porovnanie). Ak chcete porovnávať numericky, číslo nikdy neuzatvárajte do úvodzoviek, ".
Napríklad Q0.NAOK > "50" je pravdivé, ak je Q0.NAOK číselná otázka s hodnotou 9. Je to preto, že operátor > predpokladá abecedné porovnanie, nie numerické.
Ak chcete mať istotu, že sa porovná celočíselná hodnota, môžete použiť intval(Q0.NAOK) > 50, len nezabudnite, že ak Q0.NAOK nie je číslo (je prázdne alebo je to reťazec), potom intval(Q0.NAOK) == 0. Na porovnanie reťazcových hodnôt ("A" < "B") použite priamo strcmp: strcmp(Q0.NAOK,"B") alebo strcmp(Q0.NAOK,"A5").
Upozornenie k používaniu operátora priradenia (=)
Operátorom priradenia by ste sa mali vyhýbať, pokiaľ to nie je nevyhnutné, pretože môžu spôsobiť neočakávané vedľajšie účinky. Ak napríklad zmeníte hodnotu predchádzajúcej odpovede, kaskádová logika relevantnosti a validácie medzi touto otázkou a aktuálnou otázkou sa neprepočíta, takže môžete skončiť s vnútorne nekonzistentnými údajmi (napr. otázky, ktoré zostali zodpovedané, ale mali byť nastavené na NULL, alebo otázky, ktoré sa preskočili, ale mali byť zodpovedané). Vo všeobecnosti platí, že ak chcete premennej priradiť hodnotu, mali by ste vytvoriť otázku typu Rovnica a jej hodnotu nastaviť pomocou výrazu. Existujú však zriedkavé prípady, keď ľudia tento operátor skutočne potrebujú, preto sme ho sprístupnili.
Aby sme vás na tento operátor upozornili, zobrazuje sa v syntaktických rovniciach červeným písmom (aby ste ho nezamenili s „==“).
Používanie operátora priradenia
Hlavné dôvody, prečo môžete chcieť použiť priradenie:
- Potrebujete nastaviť predvolenú hodnotu pre otázku, ktorá neakceptuje predvolené hodnoty pomocou rovnice (napríklad zoznam s prepínačmi, kde vám rozhranie umožňuje vybrať jednu z možností odpovede, ale nedovoľuje zadať rovnicu). Buďte však opatrní, pretože LimeSurvey nedokáže overiť, či vaša rovnica vytvára jednu z povolených odpovedí pre danú otázku.
- Potrebujete nasilu zmeniť odpoveď na predchádzajúcu otázku na základe neskoršej odpovede
- Potrebujete zložitú kvótu: použitie jednej skrytej otázky s jednou voľbou pre kvótu a jej nastavenie pomocou priradenia
- atď...
Na tento účel môžete použiť celý systém Expression Manager.
Niekoľko príkladov:
- Nastavenie odpovede na otázku s krátkym textom na malé písmená:
{QCODE=strtolower(QCODE.NAOK)} - Nastavenie predvolenej odpovede pre typ otázky pole na začiatku prieskumu:
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Nastavenie predvolenej odpovede pre typ otázky pole textov na začiatku prieskumu:
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - Nastavenie odpovede s podmienkou:
{QCODE=if(YesNo="Y","A1","")}
Zabezpečenie XSS
Pri zapnutom XSS nie je možné používať niektoré funkcie Expression Manageru:
- začatie HTML značky v jednom výraze a jej ukončenie v inom výraze
- použitie zložitého výrazu v URL.
Príklad a riešenie
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}nefunguje so zabezpečením XSS, tu môžete použiť{if(1,"<strong>information</strong>","information")}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, tu môžete použiť otázku typu rovnica, pretože použitie úplného kódu otázky je v poriadku:<a href="/script.php?value={EQUATION.NAOK}">next</a>
Prístup k premenným
Expression Manager poskytuje prístup len na čítanie ku všetkým premenným, ktoré môžeme potrebovať. Z dôvodu spätnej kompatibility poskytuje prístup k nasledujúcemu:
- TOKEN:xxx - hodnota tokenu (napr. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (iba pre NEanonymný prieskum).
- QCODE.shown - zobrazená hodnota odpovede (napr. "Áno") pri použití Expression Manageru.
- Všetky hodnoty {XXX} používané šablónami.
- V texte otázky môžete použiť {QID}, ktoré sa nahradí ID otázky, a {SGQ}, ktoré sa nahradí hodnotou SGQA otázky
Expression Manager vám navyše umožňuje odkazovať na premenné pomocou kódu otázky (stĺpec 'title' v tabuľke otázok v databáze). Je to tiež označenie premennej, ktoré sa používa pri exporte údajov do SPSS, R alebo SAS. Ak máte napríklad otázky o mene, veku a pohlaví, môžete tieto premenné nazvať name, age a gender namiesto 12345X13X22, 12345X13X23 a 12345X13X24. Vďaka tomu sa rovnice ľahšie čítajú a overuje sa ich logika, a otázky môžete presúvať bez nutnosti sledovať čísla skupín alebo otázok.
Dôležité: Bezpečné je odkazovať iba na premenné, ktoré sa nachádzajú v predchádzajúcich stránkach alebo otázkach.
Expression Manager vám ďalej umožňuje pristupovať k mnohým vlastnostiam otázky:
| Syntax | Význam | Príklad | Výsledok príkladu |
|---|---|---|---|
| Qcode | alias pre Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | zvolený kód odpovede na otázku, ak je relevantná (inak prázdne), alebo textová hodnota, ak nejde o otázku s kódovanými odpoveďami | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | rovnaké ako Qcode - pozrite diskusiu o NAOK | {gender.NAOK} | 'M' |
| Qcode.value | hodnota hodnotenia otázky, ak je relevantná (inak prázdne), alebo textová hodnota, ak nejde o otázku s kódovanými odpoveďami | {gender.value} | '1' |
| Qcode.valueNAOK | rovnaké ako Qcode.value - pozrite diskusiu o NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | zobrazená hodnota otázky | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | text otázky | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | určuje, či je otázka povinná (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | interné číslo otázky (nie poradové číslo) | {gender.qid} | 337 |
| Qcode.type | typ otázky | {gender.type} | 'G' |
| Qcode.jsName | správny názov v JavaScripte pre otázku, bez ohľadu na to, či je deklarovaná na tejto stránke alebo mimo nej | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | interné číslo skupiny (nie poradové číslo) | {gender.gid} | 3 |
| Qcode.qseq | poradové číslo otázky, počnúc od 0 | {gender.qseq} | 5 |
| Qcode.gseq | poradové číslo skupiny, počnúc od 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | určuje, či je otázka momentálne relevantná (0 alebo 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | rovnica relevantnosti na úrovni otázky | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | rovnica relevantnosti na úrovni skupiny | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | hodnota SGQA tejto otázky | {gender.sgqa} | '1827X3X337' |
Problém s HTML editorom
Ak používate HTML editor, niektoré znaky sa nahradia HTML entitami.
- & sa nahradí &
- < sa nahradí <
- > sa nahradí >
Ak používate HTML editor, musíte použiť:
- and namiesto &
- lt namiesto <
- le namiesto <=
- gt namiesto >
- ge namiesto >=
Pomenovanie premenných Qcode
Tu sú podrobnosti o tom, ako zostaviť Qcode (a pristupovať k niektorým vlastnostiam) podľa typu otázky. Qcode sa vo všeobecnosti zostavuje takto:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Kód podotázky a ID škály sa používajú alebo nepoužívajú v závislosti od typu otázky - pozrite tabuľku nižšie. Pre comment a other sú kódy otázok QuestionCode_comment a QuestionCode_other
| Typ | Popis | Kód | Podotázky | Možnosti odpovede | Škály | Kód odpovede | Zobrazená odpoveď | Relevantnosť |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 možností (prepínače) | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Pole (výber z 10 bodov) - prepínače | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Pole (výber z 5 bodov) - prepínače | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Pole (flexibilné štítky) - dvojitá škála | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Pole (flexibilné) - formát stĺpcov | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Pole (flexibilné) - formát riadkov | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Otázky so škálou (Nárast/Bez zmeny/Pokles) - prepínače | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Pole (viacnásobné flexibilné) 1 až 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Pole (viacnásobné flexibilné) text | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Pole (Áno/Neistý/Nie) - prepínače | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Otázka s pevným textom (boilerplate) | Q11 | {Q11.shown} | |||||
| D | Dátum | Q12 | {Q12} | {Q12.shown} | ||||
| * | Rovnica | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Nahrať súbor (zaznamenáva počet nahraných súborov) | Q14 | {Q14} | {Q14>0} | ||||
| G | Rozbaľovací zoznam - pohlavie | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Rozsiahle textové pole | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Otázka na jazyk | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Zoznam - rozbaľovací | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Zoznam - rozbaľovací zoznam/prepínače | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Zoznam s komentárom - rozbaľovací zoznam/prepínače + textové pole | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Dlhý text | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Možnosť výberu viacerých možností - začiarkavacie políčka | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Možnosť výberu viacerých možností s komentárom - začiarkavacie políčko + text | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Viacnásobná číselná otázka | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Viacnásobný krátky text | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Číselná otázka | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Poradie | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Krátky text | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Áno/Nie - prepínače | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Rezervované premenné 'this', 'self' a 'that'
Pomerne často potrebujete vyhodnotiť všetky časti otázky, napríklad spočítať, koľko podotázok bolo zodpovedaných, alebo sčítať skóre. Inokedy chcete spracovať len určité riadky alebo stĺpce otázky (napríklad získať súčty riadkov alebo stĺpcov a uložiť ich do databázy). Tieto rezervované premenné z tohto procesu robia relatívne jednoduchú záležitosť.
Premenná 'this' sa používa výhradne v rozšírených možnostiach otázky "Rovnica na overenie celej otázky" a "Rovnica na overenie podotázky". Rozvinie sa na názvy premenných každej bunky v týchto otázkach. Ak teda chcete zabezpečiť, aby bol každý údaj väčší ako tri, nastavíte "Rovnicu na overenie podotázky" na (this > 3).
Premenné 'self' a 'that' sú výkonnejšie a slúžia ako makrá, ktoré sa rozvinú pred spracovaním rovníc. Možnosti syntaxe sú:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix je ktorákoľvek z bežných prípon qcode (napr. NAOK, value, shown)
sub-selector je jedno z nasledujúceho:
- comments - iba podotázky, ktoré sú komentármi (napr. z možnosti výberu viacerých možností s komentárom a zo zoznamu s komentárom)
- nocomments - iba podotázky, ktoré nie sú komentármi
- sq_X - kde X je identifikátor riadka alebo stĺpca. Vyberú sa iba podotázky zodpovedajúce vzoru X. Upozorňujeme, že vyhľadávanie sa vykonáva na úplnom identifikátore kódu, potom sa zhoduje sq_X a zahŕňa podotázky nX, X, Xn (napr. ak použijete sq_1, zahrnuté budú podotázky a1, 1a, 1, 11 alebo 001). Dávajte pozor na otázky s dvojitou škálou, kde kódy podotázok sú QCODE_SQCODE_1 a QCODE_SQCODE_1, a na otázky typu poradie, kde kódy podotázok sú QCODE_1, QCODE_2 ....
- nosq_X - kde X je identifikátor riadka alebo stĺpca. Vyberú sa iba podotázky, ktoré nezodpovedajú vzoru X. Upozorňujeme, že vyhľadávanie sa vykonáva na úplnom identifikátore kódu, potom sa zhoduje nosq_X a nezahŕňa podotázky nX, X, Xn
Príklady:
- Bola zodpovedaná nejaká časť otázky? {count(self.NAOK)>0}
- Aké je skóre hodnotenia pre túto otázku? {sum(self.value)}
Môžete ich použiť aj na získanie súčtov riadkov a stĺpcov. Povedzme, že máte pole čísel s riadkami A-E a stĺpcami 1-5.
- Aký je celkový súčet? {sum(self.NAOK)}
- Aký je súčet riadka B? {sum(self.sq_B.NAOK)}
- Aký je súčet stĺpca 3? {sum(self.sq_3.NAOK)}
Premenná 'that' je podobná premennej 'self', ale umožňuje odkazovať na iné otázky. Jej syntax je:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname je názov otázky bez akýchkoľvek prípon podotázok. Ak teda vytvoríte otázku 'q1', toto je jej qname
Príklady:
- Bola zodpovedaná nejaká časť otázky q1? {count(that.q1.NAOK)>0}
- Aké je skóre hodnotenia pre q2? {sum(that.q2.NAOK)}
- Aký je celkový súčet pre q3? {sum(that.q3.NAOK)}
- Aký je súčet riadka C v q4? {sum(that.q4.sq_C.NAOK)}
- Aký je súčet stĺpca 2 v q4? {sum(that.q4.sq_2.NAOK)}
Premenné 'self' a 'that' môžete použiť v akejkoľvek relevantnosti, validácii alebo prispôsobení textu.
Jedno upozornenie: keď použijete funkciu Zobraziť súbor logiky, zobrazí sa rozvinutá hodnota 'self' a 'that'. Vďaka tomu uvidíte skutočnú rovnicu, ktorá sa vygeneruje, aby ste (a Expression Manager) mohli overiť, že premenné existujú. Môže to pôsobiť zmätočne, pretože môžete vidieť pomerne dlhé rovnice. Ak však upravíte otázku, uvidíte pôvodnú rovnicu s použitím 'self' a/alebo 'that'
Tiež si všimnite, že tieto premenné by ste nemali používať, ak (a) chcete explicitne pomenovať každú premennú použitú vo rovnici, alebo (b) používate premenné, ktoré nemajú podotázky (napr. otázky s jednou odpoveďou). V takýchto prípadoch je predpona 'that' zbytočná a riskujete neočakávané výsledky.
Použitie NAOK
NAOK --> "Not Applicable" (NA) is alright (OK) – „Nehodí sa“ je v poriadku
Použitie NAOK znamená, že všetky alebo niektoré premenné sú irelevantné (t. j. "Not Applicable" (NA) is alright (OK) – „Nehodí sa“ je v poriadku).
Ak vložíte do akejkoľvek rovnice premennú z otázky a táto otázka (alebo podotázka) je skrytá podmienkou, celá rovnica sa vypne.
Napríklad: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) vždy vráti prázdny reťazec, ak je niektorá podotázka otázky Q1 odfiltrovaná. Na spočítanie zaškrtnutých podotázok v takejto otázke môžete použiť count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Ak je podotázka skrytá, Expression Manager vráti prázdny reťazec.
Bez NAOK: ak je skrytá jedna otázka alebo jedna podotázka, Expression Manager vždy vráti prázdny reťazec, čo je rovnaké ako vrátiť hodnotu false.
Prípona .shown vždy používa systém NAOK (prázdny reťazec, ak je skrytá), ale ak potrebujete kód odpovede, vždy je vhodné pridať .NAOK za kód otázky. Výnimkou je prípad, keď to potrebujete a viete, čo robíte.
Ďalší príklad a informácie nájdete v časti Overriding Cascading Conditions
Prístup k funkciám
Expression Manager poskytuje prístup k matematickým, reťazcovým a používateľom definovaným funkciám, ako je uvedené nižšie. Pre tieto funkcie má ekvivalenty v PHP a JavaScripte, takže fungujú rovnako na strane servera (PHP) aj na strane klienta (JavaScript). Pridať nové funkcie je jednoduché.
Implementované funkcie
Aktuálne sú dostupné nasledujúce funkcie:
| Funkcia | Význam | Syntax |
|---|---|---|
| abs | Absolútna hodnota | number abs(number) |
| acos | Arkus kosínus | number acos(number) |
| addslashes | Citovať reťazec pomocou lomítok | string addslashes(string) |
| asin | Arkus sínus | number asin(number) |
| atan | Arkus tangens | number atan(number) |
| atan2 | Arkus tangens dvoch premenných | number atan2(number, number) |
| ceil | Zaokrúhliť nahor | number ceil(number) |
| checkdate | Vráti pravdu (1), ak ide o platný dátum v gregoriánskom kalendári | bool checkdate(month,day,year) |
| convert_value | Previesť číselnú hodnotu pomocou vstupnej a výstupnej tabuľky číselných hodnôt | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Kosínus | number cos(number) |
| count | spočítať počet zodpovedaných (neprázdnych) otázok v zozname | number count(arg1, arg12, ..., argN) |
| countif | Spočítať počet zodpovedaných otázok v zozname, ktoré sa rovnajú prvému argumentu | number countif(matches, arg1, arg2, ... argN) |
| countifop | Spočítať počet zodpovedaných otázok v zozname, ktoré spĺňajú kritériá (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formátovať miestny dátum/čas | string date(format [, timestamp=time()]) |
| exp | Vypočíta exponent e | number exp(number) |
| fixnum | Zobraziť čísla s čiarkou ako oddeľovačom desatinných miest, ak je to potrebné | string fixnum(number) |
| floor | Zaokrúhliť nadol | number floor(number) |
| gmdate | Formátovať svetový dátum/čas | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Previesť všetky HTML entity na zodpovedajúce znaky (vždy používa ENT_QUOTES a UTF-8) | string html_entity_decode(string) |
| htmlentities | Previesť všetky použiteľné znaky na HTML entity (vždy používa ENT_QUOTES a UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Previesť špeciálne znaky na HTML entity (vždy používa ENT_QUOTES a UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Previesť špeciálne HTML entity späť na znaky (vždy používa ENT_QUOTES a UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formátovať miestny čas/dátum ako celočíselné | string idate(string [, timestamp=time()]) |
| if (Updated in 3.0.2 ) | if v štýle Excelu: if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
| implode | Spojiť položky poľa pomocou reťazca | string implode(glue,arg1,arg2,...,argN) |
| intval | Získať celočíselnú hodnotu premennej | int intval(number [, base=10]) |
| is_empty | Určiť, či sa premenná považuje za prázdnu | bool is_empty(var) |
| is_float | Zistiť, či je typ premennej float | bool is_float(var) |
| is_int | Zistiť, či je typ premennej celé číslo | bool is_int(var) |
| is_nan | Zistiť, či premenná nie je číslo | bool is_nan(var) |
| is_null | Zistiť, či je premenná hodnoty NULL | bool is_null(var) |
| is_numeric | Zistiť, či je premenná číslo alebo číselný reťazec | bool is_numeric(var) |
| is_string | Zistiť, či je typ premennej reťazec | bool is_string(var) |
| join (New in 2.0 build 130129) | Spojiť prvky do nového reťazca | join(arg1, arg2, ... argN) |
| list | Vráti zoznam neprázdnych hodnôt oddelených čiarkami | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Vráti zoznam oddelený znakom 'glue' zadanej vlastnosti otázky (retProp) z otázok v zozname, ktoré spĺňajú kritériá (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | Logaritmus čísla so základom base, ak je zadaný, inak prirodzený logaritmus. | number log(number,base=e) |
| ltrim | Odstrániť medzery (alebo iné znaky) zo začiatku reťazca | string ltrim(string [, charlist]) |
| max | Nájdi najvyššiu hodnotu | number max(arg1, arg2, ... argN) |
| min | Nájdi najnižšiu hodnotu | number min(arg1, arg2, ... argN) |
| mktime | Získať UNIX časovú pečiatku pre dátum (každý zo 6 argumentov je voliteľný) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Funkcia modulo zatiaľ nie je podporovaná. Namiesto nej môžete použiť funkciu floor() | floor(x/y)==(x/y) |
| nl2br | Vloží HTML zalomenia riadkov pred všetky znaky nového riadka v reťazci | string nl2br(string) |
| number_format | Formátovať číslo oddelením tisícov | string number_format(number) |
| pi | Získať hodnotu pí | number pi() |
| pow | Exponenciálny výraz | number pow(base, exp) |
| quoted_printable_decode | Previesť reťazec quoted-printable na 8-bitový reťazec | string quoted_printable_decode(string) |
| quoted_printable_encode | Previesť 8-bitový reťazec na reťazec quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Citovať metaznaky | string quotemeta(string) |
| rand | Generuj náhodné číslo, pozrite tento príklad | int rand() OR int rand(min, max) |
| regexMatch | porovnať reťazec s regulárnym výrazom | bool regexMatch(pattern,input) |
| round | Zaokrúhliť číslo na voliteľnú presnosť | number round(val [, precision]) |
| rtrim | Odstrániť medzery (alebo iné znaky) z konca reťazca | string rtrim(string [, charlist]) |
| sin | Sínus | number sin(arg) |
| sprintf | Vráť naformátovaný reťazec | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Druhá odmocnina | number sqrt(arg) |
| stddev | Vypočítať výberovú štandardnú odchýlku pre zoznam čísel | number stddev(arg1, arg2, ... argN) |
| str_pad | Doplniť reťazec na určitú dĺžku iným reťazcom | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Zopakuj reťazec | string str_repeat(input, multiplier) |
| str_replace | Nahradiť všetky výskyty hľadaného reťazca náhradným reťazcom | string str_replace(search, replace, subject) |
| strcasecmp | Binárne bezpečné porovnanie reťazca nerozlišujúce malé a veľké písmená | int strcasecmp(str1, str2) |
| strcmp | Binárne bezpečné porovnanie reťazca | int strcmp(str1, str2) |
| strip_tags | Odobrať HTML a PHP tagy z reťazca | string strip_tags(str, allowable_tags) |
| stripos | Nájsť pozíciu prvého výskytu unicode reťazca bez rozlišovania veľkosti písmen (od 0, vráti false, ak sa nenašiel) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Zrušiť citovanie citovaného reťazca | string stripslashes(string) |
| stristr | Strstr nezolišujúci malé a veľké písmená | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Zadať dĺžku reťazca | int strlen(string) |
| strpos | Nájsť pozíciu prvého výskytu unicode reťazca (od 0, vráti false, ak sa nenašiel) | int strpos(haystack, needle [ offset=0]) |
| strrev | Obrátiť reťazec | string strrev(string) |
| strstr | Nájsť prvý výskyt reťazca | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Zmeniť reťazec na malé písmená | string strtolower(string) |
| strtotime | Previesť takmer akýkoľvek anglický textový popis dátumu a času na UNIX časovú pečiatku | int strtotime(string) |
| strtoupper | Zmeniť reťazec na veľké písmená | string strtoupper(string) |
| substr | Vrátiť časť unicode reťazca | string substr(string, start [, length]) |
| sum | Vypočítať súčet hodnôt v poli | number sum(arg1, arg2, ... argN) |
| sumifop | Sčítať hodnoty zodpovedaných otázok v zozname, ktoré spĺňajú kritériá (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangens | number tan(arg) |
| time | Vrátiť aktuálnu UNIX časovú pečiatku | number time() |
| trim | Odstrániť medzery (alebo iné znaky) zo začiatku a konca reťazca | string trim(string [, charlist]) |
| ucwords | Zmeniť prvé písmeno každého slova v reťazci na veľké | string ucwords(string) |
| unique | Vráti pravdu, ak sú všetky vyplnené odpovede unikátne | boolean unique(arg1, ..., argN) |
Funkcie, ktoré sú plánované alebo zvažované
Ďalšie funkcie, ktoré sú plánované (alebo zvažované), ale zatiaľ nie sú implementované, sú uvedené nižšie. Niektoré z nich slúžia na spätnú kompatibilitu s iným nástrojom na prieskumy.
| Syntax | Význam | Poznámky |
|---|---|---|
| e() | vráti hodnotu e | |
| formatDate(X,PAT) | vráti reťazcovú hodnotu dátumu X naformátovanú podľa vzoru formátu dátumu Java PAT | |
| formatNumber(X,PAT) | vráti reťazcovú hodnotu čísla X naformátovanú podľa vzoru formátu čísla Java PAT | |
| getAnsOption(X) | Základný doplnok ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Základný doplnok ExpressionAnswerOptions | |
| getRelevance(X) | vráti rovnicu relevantnosti pre otázku X | |
| getStartTime() | vráti dátum zodpovedajúci systémovému času, kedy sa začal rozhovor | |
| getType(X) | vráti reťazcový názov dátového typu - napr. *NA*, ak isNA() | |
| gotoFirst() | skočí na prvú relevantnú skupinu otázok - porušuje bežný tok systému | |
| gotoNext() | skočí na ďalšiu relevantnú skupinu otázok - porušuje bežný tok systému | |
| gotoPrevious() | skočí na predchádzajúcu relevantnú skupinu otázok - porušuje bežný tok systému | |
| isAsked(X) | vráti true, ak odpoveď nie je typu *NA*, *INVALID* ani *UNASKED* | |
| isInvalid(X) | vráti true, ak je odpoveď typu *INVALID* | |
| isNA(X) | vráti true, ak je odpoveď typu *NA* | |
| isNotUnderstood(X) | vráti true, ak je odpoveď typu *HUH* | |
| isRefused(X) | vráti true, ak je odpoveď typu *REFUSED* | |
| isSpecial(X) | vráti true, ak je odpoveď typu *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* alebo *HUH* | |
| isUnknown(X) | vráti true, ak je odpoveď typu *UNKNOWN* | |
| jumpTo(X) | skočí na skupinu obsahujúcu pomenovanú otázku -- porušuje bežný tok systému | |
| jumpToFirstUnasked() | skočí na prvú nezobrazenú otázku |
|
| lastIndexOf(X,Y) | vráti posledný index (od 0) reťazca Y v reťazci X. Ak X neobsahuje Y, vráti -1 | |
| list(X,...) | reťazec obsahujúci zoznam kladných hodnôt oddelených čiarkou, pričom posledné dve sú oddelené slovom „and“ | |
| mean(X,...) | vráti priemer zoznamu hodnôt | |
| numAnsOptions(X) | vráti počet možností odpovede, ktoré má otázka X | |
| orlist(X,...) | reťazec obsahujúci zoznam kladných hodnôt oddelených čiarkou, pričom posledné dve sú oddelené slovom „or“ | |
| parseDate(X,PAT) | vráti hodnotu dátumu z reťazca X spracovaného podľa vzoru formátu dátumu Java PAT | |
| parseNumber(X,PAT) | vráti číselnú hodnotu z reťazca X spracovaného podľa vzoru formátu čísla Java PAT | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | ; attributeList = zoznam atribútov oddelených znakom | (napr. question#, title, text, type - môžete tak určiť, čo sa zobrazí); attributeTitleList = zoznam hlavičiek tabuľky oddelených znakom |, aby bolo možné report lokalizovať. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | ; attributeList = zoznam atribútov oddelených znakom | (napr. question#, title, text, type - môžete tak určiť, čo sa zobrazí); attributeTitleList = zoznam hlavičiek tabuľky oddelených znakom |, aby bolo možné report lokalizovať. |
Expression Manager vie, ktoré premenné sú lokálne
Aby mohol Expression Manager správne zostaviť JavaScript pre stránku, musí vedieť, ktoré premenné sú na stránke nastavené a aké je ich JavaScript ID (napr. pre document.getElementById(x)). Musí tiež vedieť, ktoré premenné sú nastavené na iných stránkach (aby zabezpečil, že potrebné polia <input type='hidden' value='x'> sú prítomné a vyplnené).
Kaskádové podmienky
Ak je ktorákoľvek z premenných nerelevantná, celá rovnica bude nerelevantná (false). V nasledujúcej tabuľke napríklad N/A znamená, že jedna z premenných nebola relevantná.
| Operátor | Príklad | a | b | Výsledok |
|---|---|---|---|---|
| + (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 |
| funkcia | sum(a,b,b) | N/A | 5 | false |
| funkcia | max(a,b) | N/A | 5 | false |
| funkcia | min(a,b) | N/A | 5 | false |
| funkcia | implode(', ',a,b,a,b) | N/A | 5 | false |
| funkcia | if(a,a,b) | N/A | 5 | false |
| funkcia | is_empty(a) | N/A | false | |
| funkcia | is_empty(a) | 0 (alebo prázdne) | true | |
| funkcia | !is_empty(a) | N/A | false |
Prepísanie kaskádových podmienok
Povedzme, že chcete zobraziť priebežný súčet všetkých relevantných odpovedí. Môžete skúsiť použiť rovnicu {sum(q1,q2,q3,...,qN)}. Tá sa však interne preloží na LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Ak je teda ktorákoľvek z hodnôt q1-qN nerelevantná, rovnica vždy vráti false. V tomto prípade sum() zobrazí 0, kým nebudú zodpovedané všetky otázky.
Aby ste sa tomu vyhli, ku každej premennej môžete pridať príponu „.NAOK“ (znamená, že Not Applicable je v poriadku). V takom prípade nastane nasledujúce správanie. Povedzme, že máte premennú q1.NAOK
- q1 sa nepridá do klauzuly LEManyNA()
- LEMval('q1') bude naďalej kontrolovať, či je odpoveď relevantná, a ak nie je, vráti '' (jednotlivé nerelevantné odpovede sa teda ignorujú, ale neznehodnotia celý výraz).
Riešením problému s priebežným súčtom je teda použiť rovnicu sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Použitie prípony .NAOK tiež umožňuje autorom navrhnúť prieskumy, ktoré majú niekoľko možných ciest, ktoré sa neskôr opäť zbiehajú do spoločných ciest. Povedzme napríklad, že respondenti odpovedia na prieskum spôsobom, ktorý je mimo bežného rozsahu odpovedí. Autor môže respondentov upozorniť, že nemusia dostať platné výsledky, a opýtať sa ich, či naozaj chcú v prieskume pokračovať. Ak odpovedia Áno, zobrazia sa zvyšné otázky. Podmienka pre „zvyšné otázky“ by overovala, či boli úvodné odpovede v bežnom rozsahu ALEBO či respondent odpovedal Áno na otázku, ktorá je relevantná, iba ak odpovedal mimo bežného rozsahu.
Ako Expression Manager podporuje podmienené mikro-prispôsobenie?
Tu je príklad mikro-prispôsobenia (kde Typ otázky=='expr' znamená rovnicu):
| Kód otázky | Relevantnosť | Typ otázky | Otázka |
|---|---|---|---|
| name | 1 | text | Ako sa voláte? |
| age | 1 | text | Koľko máte rokov? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Ľutujeme, {name}, na tento test máte príliš {if( (age<16),'málo rokov',if( (age>80),'veľa rokov','stredný vek') ) }. |
| kids | !badage | yesno | Máte deti? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Koľko máte detí? |
| kid1 | parents && numKids >= 1 | text | Koľko rokov má vaše prvé dieťa? |
| kid2 | parents && numKids >= 2 | text | Koľko rokov má vaše druhé dieťa? |
| kid3 | parents && numKids >= 3 | text | Koľko rokov má vaše tretie dieťa? |
| kid4 | parents && numKids >= 4 | text | Koľko rokov má vaše štvrté dieťa? |
| kid5 | parents && numKids >= 5 | text | Koľko rokov má vaše piate dieťa? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, uviedli ste, že máte {age} rokov a že máte {numKids} detí. Súčet veku vašich prvých {min(numKids,5)} detí je {sumage} |
Všetky tieto otázky môžu byť na jednej stránke (napr. v rovnakej skupine) a zobrazia sa iba relevantné otázky. Okrem toho, keď zadávate vek detí, výraz sum() v poslednej otázke sa na stránke dynamicky aktualizuje.
Expression Manager túto funkcionalitu poskytuje tak, že každý výraz obklopí pomenovaným prvkom <span>. Zakaždým, keď sa hodnota zmení, prepočíta výraz, ktorý sa má zobraziť v tomto prvku <span>, a zobrazenie sa obnoví. Na tej istej stránke môžete mať desiatky, ba až stovky takýchto prispôsobených výrazov a stránka ich všetky prekreslí jedným obnovením obrazovky.
Mapovanie funkcií LimeSurvey 1.91+ na Expression Manager
| Stará funkcia | Nová funkcia | Poznámky |
|---|---|---|
| Podmienky | Relevantnosť | Môžete používať veľmi zložité podmienené rovnice a získate prístup k širšiemu rozsahu premenných |
| Hodnotenia | Rovnica | Akékoľvek skóre hodnotenia je možné preštruktúrovať na rovnicu. Tým sa zabezpečí, že sa skóre zapíše do databázy, a zároveň uvidíte dynamické zmeny hodnoty skóre na aktuálnej stránke |
| Náhrady | Expression Manager | Jadro systému berie vstupný reťazec a všetko v zložených zátvorkách považuje za výraz - zvláda teda všetky historické typy náhrad. Aby sa nenarušil vložený JavaScript, Expression Manager spracúva obsah v zložených zátvorkách iba vtedy, ak (a) v zložených zátvorkách nie je na začiatku ani na konci medzera - napr. {expr} je výraz, ale { expr}, {expr } a { expr } výrazmi nie sú. Expression Manager navyše nespracúva obsah vo vlastných reťazcoch (napr. {list('hi','there {braces}')} vygeneruje „hi there {braces}“). Ignoruje tiež escapované zložené zátvorky (napr. \{this is not an expression\}) |
| Validácia | Expression Manager | Plán je vziať aktuálne atribúty otázky min/max a nechať ich spracovať Expression Managerom. Hodnoty min/max tak môžu byť samy výrazmi |
Zvýraznenie syntaxe
Na pomoc pri zadávaní a validácii výrazov poskytuje EM zvýraznenie syntaxe s nasledujúcimi funkciami:
Typy a významy zvýraznenia syntaxe
| Farba | Ukážka | Význam | Popisok | Poznámky |
|---|---|---|---|---|
| béžové pozadie | Ukážka | celá rovnica | žiadny | Všetko v zložených zátvorkách, čo je rozpoznané ako rovnica (t. j. na začiatku ani na konci nie je medzera), bude farebne označené béžovým pozadím, aby sa odlíšilo od okolitého textu |
| tučný červený text | Ukážka | chyba | Vysvetlenie chyby | Môže ísť o neznámu premennú alebo chybu vo funkcii, ... Prieskum môže byť úplne nefunkčný, verejnému používateľovi sa to nezobrazuje. |
| modrý text | Ukážka | názov funkcie | význam a povolená syntax | Názvy funkcií alebo veci, ktoré by mali byť funkciami, keďže za nimi nasleduje otváracia zátvorka, sú zobrazené tučným modrým textom. Popisky zobrazujú význam a povolenú syntax funkcie. |
| sivý text | Ukážka | reťazec | žiadny | reťazce v jednoduchých a dvojitých úvodzovkách sú zobrazené sivým textom |
| azúrový text | Ukážka | premenná nastavená na tej istej stránke, | [názov alebo kód SGQA]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná, ktorá je nastavená na tej istej stránke ako aktuálna otázka, je zobrazená azúrovým textom, čo znamená, že ju možno aktualizovať v JavaScripte. Popisok zobrazuje jej názov, samotnú otázku a jej súčasnú hodnotu (alebo prázdne, ak nie je nastavená). Ak typ otázky očakáva odpovede z vymenovanej množiny hodnôt, zobrazí sa priradenie kódov k zobrazovaným hodnotám. |
| zelený text | Ukážka | premenná nastavená na predchádzajúcej stránke | [názov alebo kód SGQA]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná, ktorá je nastavená na predchádzajúcej stránke, je zobrazená tučným zeleným textom. Popisok zobrazuje jej názov, samotnú otázku a jej súčasnú hodnotu (alebo prázdne, ak nie je nastavená). Ak typ otázky očakáva odpovede z vymenovanej množiny hodnôt, zobrazí sa priradenie kódov k zobrazovaným hodnotám. |
| tučný ružový text | Ukážka | premenná nastavená na neskoršej stránke vo všeobecnosti: na začiatku prieskumu je prázdna, ale môže byť vyplnená pomocou indexu alebo návratu späť | [názov alebo kód SGQA]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná, ktorá je nastavená na nasledujúcej stránke, je zobrazená tučným ružovým textom. Popisok zobrazuje jej názov, samotnú otázku a jej súčasnú hodnotu (alebo prázdne, ak nie je nastavená). Ak typ otázky očakáva odpovede z vymenovanej množiny hodnôt, zobrazí sa priradenie kódov k zobrazovaným hodnotám. |
| tučný hnedý text | Ukážka | náhradná hodnota Lime | hodnota | Náhradné reťazce Lime (ako {TOKEN:xxx}, {PRIVACY_MESSAGE}) sú zobrazené tučným hnedým textom. |
| červený text | Ukážka | operátor priradenia (=) | varovná správa | Ak použijete operátor priradenia (=), tento operátor sa zobrazí červeným textom. Má to pomôcť predísť náhodnému opätovnému priradeniu hodnôt, keď ste v skutočnosti chceli skontrolovať, či a == b, namiesto nastavenia hodnoty a = b. |
| normálny čierny text | Ukážka | interpunkcia | žiadny | Všetka ostatná interpunkcia vo výraze je zobrazená normálnym čiernym textom. |
| text v červenom rámčeku | okolo chyby je hrubá červená čiara | chyba syntaxe | popis chyby | Každá zistená chyba syntaxe je zobrazená červeným rámčekom okolo chyby. Popisok zobrazuje chybu. Medzi príklady patria neuzavreté zátvorky, použitie nedefinovaných funkcií, odovzdanie nesprávneho počtu argumentov funkciám, zle štruktúrované výrazy (napr. chýbajúce operátory medzi premennými), pokus o priradenie novej hodnoty premennej len na čítanie, pokus o priradenie hodnôt niečomu, čo nie je premenná, alebo použitie nepodporovanej syntaxe. Upozorňujeme, že systém na zisťovanie chýb syntaxe môže nahlásiť iba jednu chybu vo výraze, aj keď je chýb viac; ak sa však zistia nejaké chyby, zobrazí sa aspoň jedna. |
Ďalšie čítanie
Ukážkové prieskumy Expression Manageru
Prípady použitia a návody
Príklady krok za krokom
Štatistické funkcie Expression Manageru
Referenčná príručka pre vývojárov










