ExpressionScript - Prezentácia
From LimeSurvey Manual
Úvod
LimeSurvey používa Skript výrazu (Expression Script), vďaka ktorému LimeSurvey podporuje zložitejšie vetvenie, hodnotenia, validáciu a prispôsobenie obsahu. Nahrádza spôsob, akým LimeSurvey na pozadí spravuje náhrady, podmienky a hodnotenia. Zároveň výrazne zrýchľuje spracovanie, pretože eliminuje väčšinu čítaní z databázy počas behu. Skript výrazu vyvinul Dr. Thomas White (TMSWhite).
Kľúčové definície
- Výraz: Čokoľvek uzavreté v zložených zátvorkách:
- Za predpokladu, že bezprostredne za otváracou zátvorkou ani pred zatváracou zložennou zátvorkou nie je medzera.
- Obsah výrazu vyhodnocuje EM, takže môže obsahovať matematické vzorce, funkcie a komplexné spracovanie reťazcov a dátumov.
- Prispôsobenie (Tailoring): Niekedy nazývané aj „piping“. Je to proces podmieneného upravovania textu:
- Máte prístup ku všetkým „náhradným poliam“, údajom respondenta a údajom o odpovediach.
- 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í iba vtedy, ak sa relevantnosť vyhodnotí ako pravda.
- Interne sa všetky príkazy array_filter a array_filter_exclude stávajú relevantnosťou na úrovni podotázky.
- SGQA (ako sa v minulosti pomenúvali premenné):
- Znamená Survey-Group-Question-Answer (prieskum-skupina-otázka-odpoveď)
- Názvy premenných SGQA vyzerajú ako 123X5X382X971 a môžu mať prípony podotázok.
- Tieto názvy premenných sú špecifické pre príslušné databázové kódy S/Q/G/A, preto sa často musia meniť
- Rovnica – typ otázky: Nový typ otázky, ktorý ukladá výpočty alebo reporty do databázy:
- Je podobný otázke typu Boilerplate, ale jej 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, vďaka čomu sa zložitá logika ľahšie číta.
- Platné kódy otázok by NEMALI začínať číslom, takže ak kód otázky používate na číslovanie otázok, jednoducho použite „q1“, „q1a“ alebo „g1q2“.
- Toto sa stáva názvom premennej, ak exportujete dáta do SPSS alebo R. Ak teda robíte štatistickú analýzu, musíte vytvoriť iba jedinečné kódy otázok.
Musím používať Skript výrazu?
Stručná odpoveď je „nie“. Závisí to však vo veľkej miere od zložitosti prieskumu, ktorý chcete vytvoriť.
Napríklad editor podmienok pokrýva niektoré základné výrazy, ktoré možno použiť na otázky vášho prieskumu. Editor podmienok je však obmedzený. Preto sa používa Skript výrazu – rozširuje možnosti prispôsobenia.
Môžem kombinovať podmienky a rovnice relevantnosti?
Áno. Pri niektorých otázkach môžete použiť editor podmienok a pri iných rovnice relevantnosti.
V jednej otázke nemôžete mať nastavené podmienky aj výrazy zároveň! Po nastavení podmienky nahradí akýkoľvek výraz zapísaný v poli rovnice relevantnosti. Pole rovnice relevantnosti sa navyše už nedá upravovať ručne.
Existuje však spôsob, ako v jednej otázke použiť výrazy aj podmienky. Ako bolo spomenuté vyššie, podmienka nahradí pole rovnice relevantnosti. Potom skontrolujte novovytvorenú rovnicu a skopírujte ju do textového editora. Novovytvorenú podmienku odstráňte z editora podmienok a potom upravte otázku tak, že výrazy založené na podmienke z textového súboru pridáte k ostatným výrazom, ktoré chcete použiť.
Ako si 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é GUI na vytváranie jednoduchých podmienok. 2. GUI je dobre zdokumentované a podporný tím mu rozumie |
1. Podporuje iba jednoduché porovnania a nezvláda dobre podmienky „A“ a „ALEBO“. 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. GUI sa zle škáluje, ak sú desiatky, stovky alebo tisíce otázok. 6. Prevod papierových prieskumov môže byť pomalý, pretože sa musia používať názvy SGQA. 7. Na zložité vetvenie často treba programátora, ktorý logiku naprogramuje na mieru. |
| Relevancia | 1. Podporuje veľmi zložitú logiku vrátane 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, podporuje prieskumy s 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 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átora. |
1. Žiadne GUI pre jednoduché podmienky – namiesto toho využíva zvýrazňovanie syntaxe. |
- Odporúčame použiť to, čo lepšie vyhovuje vašim potrebám.
- Podrobnejšie vysvetlenie funkcií EM nájdete na nasledujúcom odkaze.
Začíname
Najlepší spôsob, ako začať s EM, je:
- Nainštalovať najnovšiu stabilnú verziu z https://www.limesurvey.org/en/download.
- Importovať a preskúmať niektoré ukážkové prieskumy.
- Preskúmať prípady použitia a návody a príklady krok za krokom.
- Preskúmať dokumentáciu EM (táto stránka)
- Unit testy izolovaných výrazov (pokročilé)
- zobrazujú príklady použitia všetkých funkcií a operátorov EM a výsledky v PHP a JavaScripte;
- upozorňujeme, že niekoľko funkcií generuje v PHP a JavaScripte rôzne výsledky, takže vám táto stránka umožní naplánovať logiku EM zodpovedajúco.
- Unit testy izolovaných výrazov (pokročilé)
Terminológia
Tieto pojmy sa bežne používajú na opis možností EM:
- Vetvenie založené na relevantnosti – ak je otázka relevantná, položí sa, inak nie (napr. je neviditeľná a v databáze sa označí ako NULL). Polia relevantnosti nájdete v paneli editora otázky, ako aj v paneli editora skupiny otázok. Druhé z nich sa používa na použitie súboru podmienok na celú skupinu bez nutnosti kopírovať rovnakú podmienku do každej otázky a/alebo na kombinovanie podmienenej logiky na úrovni skupiny a otázky.
- Prispôsobenie (Tailoring) – Keď viete, ktoré otázky sa majú položiť, prispôsobenie (niekedy nazývané piping) určuje, ako sa má otázka položiť. Umožňuje podporu nielen jednoduchej substitúcie (ako {TOKEN:FIRSTNAME}), ale aj časovania slovies a skloňovania podstatných mien podľa pohlavia alebo čísla vašich subjektov. Umožňuje tiež zmeniť správu, ktorú zobrazíte respondentovi prieskumu, 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 rovníc sa vypočítajú a zapíšu do databázy, aj keď ich na stránke skryjete. Preto sa používajú na skryté bodovacie výpočty, navigáciu založenú na zložitých rovniciach, hodnotenia a reporty, ktoré sa vygenerujú a uložia v databáze.
Relevantnosť a kaskádová relevantnosť
Každý typ otázky má teraz možnosť relevantnosti, ktorá určuje, či sa otázka zobrazí, alebo nie. EM spracúva každú rovnicu relevantnosti v poradí, v akom sa objavujú 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 ktorákoľvek premenná vo výraze nerelevantná, výraz sa vždy vyhodnotí ako nepravda. 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 päť otázok Q1–Q5 a chcete zobraziť Q2 iba vtedy, ak bola zodpovedaná Q1, Q3 ak bola zodpovedaná 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 detí máte, {Q1}? |
Relevantnosť na úrovni skupiny
ExpressionScript podporuje aj relevantnosť na úrovni skupiny. To uľahčuje implementáciu cyklov. Povedzme, že chcete zbierať informácie až o 10 entitách (napríklad produktoch alebo osobách z 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 sa im páčia, z dlhého zoznamu). 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 subjektu). Rovnice relevantnosti na úrovni otázky a skupiny sa spájajú operátorom A (AND), aby sa určilo, ktoré sa majú zobraziť.
Ak si chcete takýto príklad pozrieť, importujte nasledujúci prieskum: Príklad prieskumu sčítania.
Na nižšie uvedenej snímke obrazovky vidno, že skupina Person 1 sa zobrazí (alebo je relevantná), ak respondent býva aspoň s ďalším spolubývajúcim:

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 a premenným (prostredníctvom viacerých 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ť respondentom prispôsobené správy na základe predchádzajúcich odpovedí;
- Vytvárať hodnotenia a zobrazovať ich výsledky (alebo na ich základe podmienene vetviť prieskum či zobrazovať správy), a to všetko bez použitia samotného modulu hodnotenia;
- Časovať slovesá a skloňovať podstatné mená v otázkach, odpovediach a správach;
- Zobraziť súhrny odpovedí pred stránkou „Zobraziť vaše odpovede“ na konci prieskumu.
Rovnice
Existuje nový typ otázky s názvom Rovnica. Predstavte si ho ako typ otázky Zobrazenie textu, len s tým rozdielom, že 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.
Syntax
Všetko v zložených zátvorkách sa teraz považuje za výraz (s jednou výnimkou: nesmie sa nachádzať žiadna úvodná ani koncová medzera - to je potrebné, aby sa ExpressionScript 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. Je to 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',
''
)
)
)
)
)
)
)
)}
ExpressionScript podporuje nasledujúcu syntax:
- Všetky štandardné matematické operátory (napr. +,-,*,/,!);
- Všetky štandardné porovnávacie operátory (napr. <,<=,==,!=,>,>=, ako aj ich ekvivalenty: lt, le, eq, ne, gt, ge);
- Zátvorky (na zoskupovanie podvýrazov);
- Podmienkové operátory (napr. &&,| | a ich ekvivalenty: and, or);
- Reťazce v jednoduchých a dvojitých úvodzovkách (do každého z nich možno vložiť reťazec s úvodzovkami druhého typu);
- 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. kódy SGQA;
- Preddefinované funkcie (už ich je viac ako 80 a ďalšie je jednoduché pridať).
Operátory
Syntax EM sa riadi bežnou prioritou operátorov:
| Úroveň | Operátor(y) | Popis |
|---|---|---|
| 1 | () | zátvorky na zoskupovanie alebo volanie funkcií |
| 2 | ! - + | unárne operátory: not, negácia, unárne plus |
| 3 | * / | krát, delené |
| 4 | + - | plus, mínus |
| 5 | < <= > >= lt le gt ge | relatívne porovnania |
| 6 | == != eq ne | porovnania rovnosti |
| 7 | and | logické AND |
| 8 | or | logické OR |
| 9 | = | operátor priradenia |
| 10 | , | operátor čiarky |
Upozornenie na nezhodu čísla a reťazca a abecedné/číselné porovnávanie
Ak chcete porovnávať hodnoty pomocou relatívnych porovnaní alebo porovnaní rovnosti, dávajte pozor na nezhody typov. Hodnotu zadanú používateľom (alebo poskytnutú prostredníctvom kódu odpovede) možno použiť ako číslo, ak je jednoznačne číslom.
Ak jednu z hodnôt uzatvoríte do ", uskutoční sa porovnanie textu/reťazca. Ak chcete porovnávať ako čísla, číslo nikdy neuzatvárajte do ".
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, a nie číselné.
Ak chcete mať istotu, že porovnávate celočíselné hodnoty, môžete použiť intval(Q0.NAOK) > 50. Nezabudnite, že ak Q0.NAOK nie je číslo (je prázdne alebo je reťazcom), 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 nevyhnutne potrebné, 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á relevantnosť a logika validácie medzi touto otázkou a aktuálnou otázkou sa neprepočítajú, takže môžete skončiť s vnútorne nekonzistentnými údajmi (napr. otázky, ktoré zostanú zodpovedané, ale mali byť vynulované na NULL, alebo otázky, ktoré sú preskočené, ale mali byť zodpovedané). Vo všeobecnosti, ak chcete priradiť hodnotu premennej, 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 syntaxi rovníc červeným písmom (aby ste ho nezamenili s „==“).
Používanie operátora priradenia
Hlavné dôvody, prečo môžete chcieť použiť operátor priradenia, sú:
- Potrebujete nastaviť predvolenú hodnotu pomocou rovnice pre otázku, ktorá predvolené hodnoty neakceptuje (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 generuje niektorú z povolených odpovedí pre danú otázku;
- Potrebujete násilne zmeniť odpoveď na predchádzajúcu otázku na základe neskoršej odpovede;
- atď...
Na tento účel môžete použiť celý systém správcu výrazov. Je však lepšie použiť na to Rovnicu.
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 proti XSS
Pri zapnutom XSS nemožno použiť niektoré časti systému správcu výrazov:
- začatie HTML značky vo výraze, ale jej ukončenie v inom výraze;
- použitie zložitého výrazu v rámci adresy URL.
Príklady a riešenia:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}nefunguje pri zabezpečení 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
ExpressionScript poskytuje prístup len na čítanie k všetkým premenným, ktoré môžete potrebovať. Kvôli spätnej kompatibilite poskytuje prístup k nasledujúcim:
- TOKEN:xxx - hodnota TOKENU (napr. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (len pre prieskumy, ktoré nie sú anonymné).
- Všetky hodnoty {XXX} používané motívmi.
- V texte otázky môžete použiť {QID}, ktoré sa nahradí ID otázky, a {SGQ}, ktoré sa nahradí SGQA otázky.
- {SAVEDID} pre ID aktuálnej odpovede
ExpressionScript vám navyše umožňuje odkazovať sa na premenné pomocou kódu otázky (stĺpec 'title' v tabuľke otázok v databáze). Toto je tiež označenie premennej používané pri exporte údajov do SPSS, R alebo SAS. Ak máte napríklad otázky na meno, vek a pohlavie, môžete tieto premenné nazvať name, age a gender namiesto 12345X13X22, 12345X13X23 a 12345X13X24. Vďaka tomu sú rovnice pre každého čitateľnejšie a logiku je jednoduchšie overiť, a navyše je možné premiešať otázky bez nutnosti sledovať čísla skupín alebo otázok.
Dôležité: Bezpečnejšie je odkazovať na premenné, ktoré sa nachádzajú na predchádzajúcich stránkach alebo v predchádzajúcich otázkach.
ExpressionScript 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 | vybraný kód odpovede na otázku, ak je relevantná (inak prázdne), alebo textová hodnota, ak nejde o kódovanú otázku | {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 kódovanú otázku | {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 | č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 | č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 pre túto otázku | {gender.sgqa} | '1827X3X337' |
Problém s HTML editorom
Ak používate HTML editor, niektoré znaky sa nahradia HTML entitami.
- & za &
- < za <
- > za >
Ak používate HTML editor, musíte použiť:
- and namiesto &
- lt namiesto <
- le namiesto <=
- gt namiesto >
- ge namiesto >=
Odporúča sa vyčistiť výraz od HTML, ktoré sa v ňom objaví. Ak používate HTML editor LimeSurvey, kliknite na tlačidlo „Zdroj“ (nachádza sa v ľavej hornej časti editora) a odstráňte všetky znaky, ktoré nesúvisia s vaším výrazom (napr.
,
a podobne).
Pomenovanie premenných Qcode
Tu sú podrobnosti o tom, ako zostaviť Qcode (a pristupovať k niektorým vlastnostiam) podľa typu otázky. Vo všeobecnosti sa Qcode zostavuje takto:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Pre komentár a iné sú zodpovedajúce 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é popisky) s dvojitou škálou | 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 | Textová otázka (zobrazenie textu) | 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 | Pohlavie (rozbaľovací zoznam) | 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ý typ otázky | 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'} |
Použitie NAOK
NAOK --> „Not Applicable“ (NA, nevzťahuje sa) je v poriadku (OK)
Použitie NAOK znamená, že všetky alebo niektoré premenné sú nerelevantné (napr. „Not Applicable“ (NA, nevzťahuje sa) je v poriadku (OK)).
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 počtu zaškrtnutých podotázok v takejto otázke možno použiť count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Ak je podotázka skrytá, EM vráti prázdny reťazec.
Bez NAOK, ak je jedna otázka alebo jedna podotázka skrytá, EM vždy vráti prázdny reťazec (čo je to isté ako vrátenie hodnoty 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 dobrý nápad pridať .NAOK za kód otázky (okrem prípadu, keď to potrebujete a viete, čo robíte).
Viac informácií nájdete v podkapitole Prepísanie kaskádových podmienok.
Vyhradené premenné „this“, „self“ a „that“
Pomerne často chcete 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 vyhradené premenné tento proces relatívne zjednodušujú.
Premenná „this“
Premenná „this“ sa používa výhradne v možnostiach „Rovnica na overenie otázky“ a „Rovnica overenia podotázky“ (druhá z nich nie je možná z grafického rozhrania). Rozbalí sa na názvy premenných všetkých buniek v týchto otázkach. Ak teda chcete zabezpečiť, aby bol každý záznam väčší ako tri, nastavíte „Rovnicu overenia podotázky“ na (this > 3).
Premenná „self“
Premenné „self“ a „that“ sú výkonnejšie a slúžia ako makrá, ktoré sa rozbalia pred spracovaním rovníc. Možnosti syntaxe pre premennú „self“ 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 môže byť jedným z nasledujúcich:
- comments - iba podotázky, ktoré sú komentármi (napr. možnosť výberu viacerých možností s komentárom a zoznam 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 prebieha na úplnom identifikátore kódu, takže sq_X zodpovedá podotázkam nX, X, Xn (napr. ak použijete sq_1, zahrnuté budú podotázky a1, 1a, 1, 11 alebo 001). Dávajte pozor pri type otázky s dvojitou škálou, kde kódy podotázok majú tvar QCODE_SQCODE_1 a QCODE_SQCODE_1, a pri type otázky poradie, kde kódy podotázok majú tvar QCODE_1, QCODE_2 ....
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"
Premenná "that" je podobná premennej "self", ale umožňuje odkazovať sa 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 rozšírení podotázok. Vytvorme teda otázku 'q1', pričom 'q' predstavuje aj 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 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" možno použiť v každej relevantnosti, validácii alebo prispôsobení textu.
Jediným upozornením je, že keď použijete funkciu Show logic file, zobrazí sa rozbalená hodnota "self" a "that". Vďaka tomu uvidíte skutočnú rovnicu, ktorá sa vygeneruje, aby ste (a EM) mohli overiť, či premenné existujú. Môže to pôsobiť zmätočne, pretože môžete vidieť pomerne dlhé rovnice. Ak však otázku upravíte, uvidíte pôvodnú rovnicu používajúcu "self" a/alebo "that".
- chcete výslovne pomenovať každú premennú použitú v rovnici, alebo
- používate premenné, ktoré nemajú podotázky (napr. otázky s jednou odpoveďou). V takých prípadoch je pridanie predpony "that" zbytočné a riskujete neočakávané výsledky.
Prístup k funkciám
ExpressionScript poskytuje prístup k matematickým funkciám, funkciám pre prácu s reťazcami a používateľom definovaným funkciám, ako je uvedené nižšie. Pre tieto funkcie existujú ekvivalenty v PHP aj JavaScripte, takže fungujú rovnako na strane servera (PHP) aj na strane klienta (JavaScript). Pridať nové funkcie je jednoduché.
Implementované funkcie
Momentálne sú k dispozícii 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 true(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 príslušné znaky (vždy používa ENT_QUOTES a UTF-8) | string html_entity_decode(string) |
| htmlentities | Previesť všetky prísluš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 | Funkcia 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 | Zistiť, č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 čiarkou | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Vrátiť zoznam hodnôt zadanej vlastnosti otázky (retProp) z otázok v zozname, ktoré spĺňajú kritériá (cmpProp op value), oddelených znakom 'glue' | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| 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 nové riadky 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 si tento príklad | int rand() OR int rand(min, max) |
| regexMatch | porovná 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 malých a veľkých písmen (počítané od 0, ak sa nenájde, vráti false) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Zrušiť citovanie citovaného reťazca | string stripslashes(string) |
| stristr | Strstr nerozliš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 (počítané od 0, ak sa nenájde, vráti false) | 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 | Previesť 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 | Previesť 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) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Vytvorenie nových funkcií výrazov pomocou doplnku (New in 4.0.0 )
Ak potrebujete novú funkciu, ktorá v jadre neexistuje, môžete ju vytvoriť pomocou doplnku. Takáto nová funkcia sa vytvára pomocou udalosti expressionManagerStart.
ExpressionScript vie, ktoré premenné sú lokálne
Aby bolo možné správne zostaviť JavaScript pre stránku, EM musí vedieť, ktoré premenné sú nastavené na danej stránke 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). Napríklad v nasledujúcej tabuľke 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 |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
Prepísanie kaskádových podmienok
Povedzme, že chcete zobraziť priebežný súčet všetkých relevantných odpovedí. Mohli by ste skúsiť použiť rovnicu {sum(q1,q2,q3,...,qN)}. Interne sa to však 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 bude sum() zobrazovať „0“, kým nebudú zodpovedané všetky otázky.
Aby ste sa tomu vyhli, každá premenná môže mať pridanú príponu „.NAOK“ (znamená, že Not Applicable je OK). 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 neanulujú 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. Predstavte si 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á, len ak odpovedal mimo bežného rozsahu.
Ako ExpressionScript 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 | Aké je vaše meno? |
| 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 ste príliš {if( (age<16),'mladý',if( (age>80),'starý','strednej vekovej kategórie') ) }. |
| 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 | text | {name}, uviedli ste, že máte {age} rokov a že máte detí: {numKids}. Súčet vekov vašich prvých {min(numKids,5)} detí je {sumage} |
Ak si chcete stiahnuť uvedený príklad prieskumu, kliknite na nasledujúci odkaz: Príklad prieskumu s počtom detí.
Všetky tieto otázky môžu byť na jednej stránke (napr. v rovnakej skupine) a zobrazia sa len relevantné otázky. Okrem toho, ako zadávate vek detí, výraz sum() v poslednej otázke sa bude dynamicky aktualizovať.
ExpressionScript poskytuje túto funkcionalitu tak, že každý výraz obklopí pomenovaným prvkom <span>. Vždy, keď sa hodnota zmení, prepočíta výraz, ktorý sa má zobraziť v tomto prvku <span>, a znova vykreslí zobrazenie. Na jednej stránke môžete mať desiatky alebo dokonca stovky takto prispôsobených výrazov.
Zvýrazňovanie syntaxe
Na uľahčenie zadávania a overovania výrazov poskytuje EM zvýrazňovanie syntaxe s nasledujúcimi funkciami:
Typy a významy zvýrazňovania syntaxe
| Farba | Ukážka | Význam | Popis (tooltip) | Poznámky |
|---|---|---|---|---|
| béžové pozadie | Ukážka | celá rovnica | žiadny | Všetko v zložených zátvorkách, čo je rozpoznané ako rovnica (napr. nie sú tam medzery na začiatku ani na konci), bude 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 je nefunkčný a otázky, ktoré závisia od príslušného výrazu, sa respondentom nezobrazia. |
| modrý text | Ukážka | názov funkcie | význam a povolená syntax | Označuje názvy funkcií alebo veci, ktoré by mali byť funkciami, keďže za nimi nasleduje otváracia zátvorka. Zobrazujú sa tučným modrým textom. Tooltipy zobrazujú význam a povolenú syntax funkcie. |
| sivý text | Ukážka | reťazec | žiadny | Reťazce v jednoduchých a dvojitých úvodzovkách sa zobrazujú sivým textom. |
| azúrový text | Ukážka | premenná nastavená na tej istej stránke, | [name]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná nastavená na tej istej stránke ako otázka, ktorú práve upravujete, sa zobrazuje azúrovým textom (môže sa aktualizovať v JavaScripte). Tooltip 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 | [name]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná nastavená na predchádzajúcej stránke sa zobrazuje tučným zeleným textom. Tooltip 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 prázdna, ale môže byť vyplnená pomocou indexu alebo návratu späť | [name alebo kód SGQA]: otázka; hodnota; answerList zobrazujúci kódy pre každú hodnotu | Každá premenná nastavená na neskoršej stránke sa zobrazuje tučným ružovým textom. Tooltip 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ý béžový text | Ukážka | náhradná hodnota Lime | hodnota | Náhradné reťazce Lime (ako {TOKEN:xxx}, {PRIVACY_MESSAGE}) sa zobrazujú tučným béžovým textom. |
| červený text | Ukážka | operátor priradenia (=) | varovná správa | Ak použijete operátor priradenia (=), zobrazí sa č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šetky ostatné interpunkčné znamienka vo výraze sa zobrazujú normálnym čiernym textom. |
| text v červenom rámčeku | tučná červená čiara obklopuje chybu | chyba syntaxe | popis chyby | Všetky zistené chyby syntaxe sa zobrazujú v červených rámčekoch. Tooltip zobrazuje chybu. Medzi príklady patria nespárované 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 určenej len na čítanie, pokus o priradenie hodnôt k veciam, ktoré nie sú premenné, alebo použitie nepodporovanej syntaxe. Upozorňujeme, že systém detekcie chýb syntaxe môže nahlásiť iba jednu chybu vo výraze, aj keď ich je viac; ak však nejaké chyby zistí, zobrazí sa aspoň jedna. |
Ďalšie čítanie
Ukážkové prieskumy ExpressionScript
Prípady použitia a návody
Príklady krok za krokom
Referencia pre vývojárov