Příklady ExpressionScript
From LimeSurvey Manual
Struktura
První část článku popisuje, k čemu lze výrazy použít a kde je najdete či přidáte. Druhá část obsahuje příklady, jak výrazy používat.
Kategorie výrazů
LimeSurvey používá výrazy k následujícím účelům:
Relevance
Účel: skrytí skupin otázek/otázek
Relevance určuje, zda se skupina otázek nebo otázka zobrazí, nebo skryje. Pokud je výsledkem výrazu „true“ (tj. 1), prvek se zobrazí. Jinak (pokud je výsledkem výrazu „false“, tj. 0) bude prvek skryt.
Ověření
Účel: ověření vstupu/akcí u otázek/dílčích otázek/odpovědí
Ověření určuje, zda je vstup respondenta do otázky nebo akce platný, či nikoli. Pokud je výsledkem výrazu „true“ (tj. 1), použije se na prvek a zprávu o ověření třída „good“. Jinak, pokud je výsledkem výrazu „false“ (tj. 0), použije se na prvek a zprávu o ověření třída „error“. Styl pro tyto třídy můžete definovat v souboru template.css.
Textový výstup
Účely: (provést nějakou akci a) vypsat text
Výraz lze použít k vypsání textu. Můžete například něco otestovat nebo vypočítat a podle výsledku testu či výpočtu určit výstup. Lze jej také použít k vložení textu otázky, odpovědí, typů otázek atd. u otázky použité před daným výrazem. Textový výstup lze použít všude, kde se zobrazuje text, a může vracet jakékoli výsledky.
| Případ užití | Popis |
|---|---|
| Mikro přizpůsobení | Úprava textu, např. napsání „pan“ nebo „paní“ podle dříve položené otázky na pohlaví |
| Výpočet | Výpočet hodnoty a její vypsání, např. „Příjem vaší rodiny je xxx“ |
| Odkaz | Vložení textu z prvku, např. „Jmenujete se xxx. Kolik je vám let?“ |
Ukládání odpovědí
Účely: (provést nějakou akci,) (vypsat text) a uložit něco do databáze
Typ otázky Rovnice lze použít k uložení hodnoty do databáze. Pomocí výrazu můžete něco provést, zobrazit otázku typu Rovnice (podobnou zobrazení textu) a výsledek výrazu uložit do databáze. Odpověď se uloží do tabulky odpovědí. Výsledek pak lze použít ve statistikách nebo jej exportovat do některého z formátů, které nabízí funkce exportu LimeSurvey.
Příklady výrazů
Vložení odpovědi z předchozí otázky
Použití skryté otázky typu Rovnice k automatickému vyplnění odpovědi
Problém: Představte si, že máte dvě otázky Q1 a Q2. Q1 se ptá respondentů na jejich věk. Q2 rozděluje respondenty do tří skupin: věk je nižší než 20 let, věk je 20, věk je vyšší než 20. Q2 by tedy měla používat hodnoty „1“, „2“, „3“, které odpovídají výše uvedeným podmínkám. Nesmíme také zapomenout Q2 skrýt (otázka se v průzkumu nezobrazí, ale hodnoty se do tabulky odpovědí uloží „na pozadí“).
Vyplnění databáze pomocí typu otázky Rovnice:
- Nejprve vytvořte otázku s kódem Q1 jako otázku typu Číselný vstup.
- Poté vytvořte další otázku s kódem Q2 jako otázku typu Rovnice.
- Na kartě „Nastavení zobrazení“ otázky Q2:
- nastavte pole „Vždy skryje tuto otázku“ na „Zapnuto“
- do pole „Rovnice“ zadejte výraz:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}
Vytvoření souhrnné stránky pomocí zástupných symbolů
Tento návod ukazuje, jak na konci průzkumu vytvořit přehled všech otázek a odpovědí pomocí zástupných symbolů ExpressionScript. Ukazuje také, jak takový přehled omezit pouze na zodpovězené otázky.
Náš příklad si můžete stáhnout zde: Příklad průzkumu se zástupnými znaky.
Zde použité typy otázek:
1. Otázky s výběrem jedné možnosti / jednoduché textové či číselné otázky
- Rozbalovací seznam
- Přepínačový seznam [L]
- Ano/Ne [Y]
- Dlouhý text [T]
- Krátký text [S]
- Číselný vstup [N]
- Rovnice [*]
2. Otázky s dílčími otázkami
- Vícenásobné krátké texty [Q]
- Vícenásobné možnosti [M]
- Pole [F]
- Pole (Ano/Ne/Nevím) [C]
- Pole (výběr z 10 možností) [B]
3. Otázky se 2 škálami
- Pole s dvojí škálou [1]
4. Otázky se škálami X a Y
- Pole (Čísla) [:]
5. Speciální otázky
- Zobrazení textu [X]
V tomto jednoduchém příkladu bude náš přehled tvořit jednoduchý seznam:
- Text otázky: odpověď uživatele
Otázky s výběrem jedné možnosti / jednoduché textové či číselné otázky
U všech těchto typů otázek uloží LimeSurvey jednu odpověď:
- Rozbalovací seznam
- Přepínačový seznam
- Seznam s komentářem
- Výběr z 5 možností
- Ano/Ne
- Krátký text
- Dlouhý text
- Textové pole (rozsáhlé)
- Číselný vstup
- Rovnice
- Datum
- Pohlaví
Pokud je kód otázky q1, můžeme na text otázky a odpověď odkazovat takto:
- {q1.question}: {q1.shown}
Příklad:
- Kolik je vám let?: 25
Pokud chcete zkontrolovat, zda byla otázka zodpovězena, můžete výstup obalit příkazem IF:
{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}
To se „přeloží“ takto: POKUD otázka s kódem q1 není prázdná, vypiš „- “ A text otázky A „: “ A text odpovědi (funkce join() spojí prvky do nového řetězce); JINAK nevypisuj nic ("" znamená prázdný řetězec).
Otázky s dílčími otázkami
U všech těchto typů otázek LimeSurvey používá dílčí otázky:
- Vícenásobné krátké texty
- Vícenásobné možnosti
- Vícenásobné možnosti s komentáři
- Pole
- Pole (výběr z 5 možností)
- Pole (výběr z 10 možností)
- Pole (Ano/Ne/Nevím)
- Pole (zvýšení, stejné, pokles)
- Pole po sloupcích
Pokud je kód otázky q2 a dílčí otázky jsou očíslovány SQ001, SQ002 (automatické číslování provádí LimeSurvey), můžeme na text otázky a odpověď odkazovat takto:
- {q2_SQ001.question}: {q2_SQ001.shown}
- {q2_SQ002.question}: {q2_SQ002.shown}
U otázek typu Vícenásobné možnosti dává smysl nezobrazovat text zaškrtnuté dílčí otázky, ale zobrazit Y pro každou vybranou možnost:
- {q2_SQ001.question}: {q2_SQ001}
- {q2_SQ002.question}: {q2_SQ002}
...
Upozorňujeme, že v současné době není možné vypsat text otázek s dílčími otázkami, viz tento požadavek na novou funkci.
Příklad 1 (za předpokladu, že typ otázky je vícenásobné možnosti)
- Znáte tyto automobilové značky?
-- Mercedes: Y
-- Audi: N
-- Volvo: Y
Pokud chcete vypsat pouze zaškrtnuté položky, můžete kolem výstupu použít příkaz IF a zkontrolovat hodnotu zaškrtávacího pole:
{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }
Pokud chcete vypsat seznam pouze vybraných položek, použijte funkci listifop, např.: Mercedes, Volvo
{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }
Kde that.q2 se rozbalí na všechny dílčí otázky otázky q2. Další podrobnosti naleznete v části self, this a that.
Příklad 2 (za předpokladu, že typ otázky je Pole (výběr z 10 možností))
- Ohodnoťte prosím kvalitu níže uvedených automobilových značek na škále od 1 = velmi špatná do 10 = velmi dobrá.
-- Mercedes: 7
-- Audi: 9
-- Volvo: 9
Pokud chcete vypsat pouze ohodnocené položky, můžete kolem výstupu použít příkaz IF a pomocí následujícího výrazu zkontrolovat, zda byla aktuální dílčí otázka zodpovězena:
{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }
Pokud chcete například vypsat seznam pouze vybraných položek s hodnotou větší než osm, použijte funkci listifop, např.: Audi / Volvo
{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }
Otázka se dvěma škálami
Předpokládejme, že se používají následující kódy:
- Kód otázky: q4
- Kódy dílčích otázek: SQ001, SQ002, ...
- Kódy odpovědí škály 1: A1, A2, ...
- Kódy odpovědí škály 2: B1, B2, ...
Příklad odkazu na odpověď třetí dílčí otázky a druhé škály: q4_SQ003_1 – otázka 4, dílčí otázka 3, druhá škála.
Vypišme výsledky pro obě škály a první dvě dílčí otázky:
- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}
- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}
Chcete-li vypsat text dílčí otázky, musíte k zástupnému symbolu přidat ID škály (i když jsou texty pro obě škály stejné). Místo {q4_SQ001.question} tedy musíme použít {q4_SQ001_0.question} nebo {q4_SQ001_1.question}.
Pokud chcete exportovat/zobrazit výsledky pouze těch dílčích otázek, které mají alespoň jednu odpověď, použijte pro každou dílčí otázku tuto syntaxi:
{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}
Otázka s měřítky X a Y
Platí pro všechny maticové otázky, které umožňují odpověď v každé buňce (nejen v každém řádku, jak bylo uvedeno dříve):
- Pole (Texty)
- Pole (Čísla)
Předpokládané použité kódy:
- Kód otázky: q5
- Kódy dílčích otázek: SQ001, SQ002, ...
- Kódy odpovědí: A1, A2, ...
Chcete-li odkázat na výsledek určité dílčí otázky z určitého sloupce, musíte použít KódOtázky . '_' . KódDílčíOtázky . '_' . KódOdpovědi. Příklad odkazu na odpověď třetí dílčí otázky a druhého sloupce: q5_SQ003_A2.
Vypišme výsledky pro sloupce 1–3 prvních dvou dílčích otázek:
- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}
- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}
Protože u těchto typů otázek každá buňka (kombinace osy X a osy Y) odpovídá jedné možnosti odpovědi, je nutné pro každou buňku provést test existence dat. Příklad:
{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}
Skrytí otázky, pokud je odpověď na předchozí otázku prázdná
| Účel | Skrýt otázku, pokud je odpověď na předchozí otázku prázdná |
| Typ | Relevance otázky |
| Příklad | Otázka jedna: kód otázky "name", text otázky "Jak se jmenujete?" Otázka dvě: text otázky "{name}, kolik je vám let?" Úkol: Skrýt otázku dvě, pokud je textové pole otázky jedna prázdné |
| Výraz | !is_empty(name) |
| Popis | is_empty() určuje, zda je proměnná považována za prázdnou. Znak "!" výsledek neguje. Pokud tedy proměnná není prázdná, výraz bude pravdivý a otázka se zobrazí |
| Postup | Vytvořte/upravte otázku dvě Do pole "Rovnice relevance" vložte "!is_empty(name)" |
| Ukázkový soubor | Hide_question_if_empty_question_group.zip |
![]()
| |
Skrytí skupiny otázek, pokud je odpověď na předchozí otázku Ano nebo Ne
| Účel | Skrýt skupinu otázek, pokud je odpověď na předchozí otázku Ano nebo Ne |
| Typ | Relevance skupiny otázek |
| Příklad | Stránka jedna, skupina otázek jedna, otázka jedna: kód otázky "PET", text otázky "Máte domácí zvíře?" -Ano -Ne Stránka dvě, skupina otázek dvě: název "O vašich domácích zvířatech" Úkol: Zobrazit/skrýt skupinu otázek dvě podle toho, zda je odpověď na otázku jedna Ano/Ne |
| Výraz | PET == "Y" |
| Popis | PET je kód otázky, jejíž odpověď chcete zkontrolovat. Pokud nepoužijete suffix, EM použije "Qcode.code". Porovnáváte tedy kód odpovědi otázky PET s hodnotou "Y". Pokud respondent odpoví "Ano", výraz je pravdivý a skupina otázek "O vašich domácích zvířatech" se zobrazí. |
| Postup | Vytvořte/upravte skupinu otázek dvě Do pole "Rovnice relevance" vložte "PET == "Y"" |
| Ukázkový soubor | Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip |
![]()
| |
Zobrazení hodnoty pole otázky s více vstupy odpovědí
| Účel | Zobrazit hodnotu pole otázky s více vstupy odpovědí |
| Typ | Odkaz |
| Příklad | Otázka jedna: kód otázky "AskChildAge", text otázky "Kolik let je vašim dětem?". Kódy dílčích otázek -Child1 -Child2 -Child3 - ChildXXX Otázka dvě: kód otázky "ReportChildAge", text otázky "O vašem prvním dítěti: - CHILD1 je AGE1." |
| Výraz | {AskChildAge_Child1.question}, {AskChildAge_Child1.value} |
| Popis | Chcete použít hodnotu dílčí otázky v následující otázce. K hodnotě dílčí otázky můžete přistupovat pomocí výrazu tohoto typu: KódOtázky_KódDílčíOtázky.value |
| Postup | Vytvořte/upravte druhou otázku Do popisu vložte tento text: "O vašem prvním dítěti: - {AskChildAge_Child1.question} je {AskChildAge_Child1.value}." |
| Ukázkový soubor | Display_value_of_a_multiple_answer_input_question_field.zip |
| |
Ověření počtu zaškrtnutých polí na řádek u otázky "Pole (Čísla) Checkbox"
| Účel | Ověřit počet zaškrtnutých polí na řádek |
| Typ | Ověření |
| Příklad | Otázka typu "Pole (Čísla) (Rozvržení checkboxu)" |
| Výraz | sum(...) |
| Popis | (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) určuje, zda je v řádku A zaškrtnuto alespoň X zaškrtávacích polí. Pokud chcete zkontrolovat všechny tři řádky (A, B, C), můžete výrazy spojit pomocí "&&": (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X) |
| Postup | Vytvořte/upravte otázku typu "Pole (Čísla) (Rozvržení checkboxu)". Výše uvedený výraz vložte do pole "Rovnice k ověření otázky" v pokročilém nastavení otázky (možná bude nutné upravit názvy proměnných!). |
| Ukázkový soubor | Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss |
![]()
| |
Výpočet rozdílu mezi dvěma daty
| Účel | Vypočítat rozdíl mezi dvěma daty |
| Typ | Relevance / Typ otázky Rovnice / Ověření |
| Příklad | Otázka jedna (datum/čas, kód: DOB): Jaké je vaše datum narození? Otázka dvě (datum/čas, kód: datetoday): Jaké je dnes datum? Otázka tři (boilerplate): Je vám XXXX dní. Úkol: Vypočítat a zobrazit počet dní mezi datem zadaným v otázce 1 a otázce 2. |
| Výraz | {(strtotime(datetoday)-strtotime(DOB))/60/60/24} |
| Popis | strtotime vypočítá počet sekund mezi 1. lednem 1970 a zadaným datem. Výše uvedený výraz vypočítá počet sekund mezi dvěma zadanými daty. Člen "/60/60/24" pouze převede počet sekund na počet dní. Místo dotazu na "datetoday" můžete také použít strtotime('now') nebo jednoduše time(), což přímo vrací počet sekund od ledna 1970 do současnosti (tj. do okamžiku vyplnění průzkumu). Tak můžete rychle zjistit věk osoby v letech pomocí rovnice {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} V každém z těchto případů je zásadní, aby bylo datum zadáno ve správném formátu, jinak funkce strtotime() nebude fungovat správně. |
| Postup | Vytvořte dvě otázky typu datum (pro datum narození a pro dnešní datum) a jednu boilerplate otázku. Do textu otázky boilerplate vložte: "Dne {datetoday} vám bylo {(strtotime(today)-strtotime(dob))/60/60/24} dní." Upozornění: Funkce strtotime si poradí s MNOHA, ale ne se všemi formáty data. Pokud narazíte na problémy, nastavte ve svém průzkumu Formát data na mm/dd/yyyy, yyyy-mm-dd nebo dd.mm.yyyy" |
| Ukázkový soubor | Date_difference.zip |
| |
Použití ExpressionScript pro hodnocení
Zde je další příklad použití ExpressionScript s otázkami typu Pole a hodnocením:</ br>
Řekněme, že máte 2 otázky typu pole a chcete uložit výsledky výpočtu do databáze. Je to vlastně jednoduché: vytvořte a otestujte svá pole a odešlete zkušební odpověď, abyste zjistili, zda vše funguje a zda se výsledky zobrazí na stránce po dokončení.
Podrobnosti implementace:
- přidejte otázku typu rovnice
- přidejte následující řádek za předpokladu, že Q1 je kód vaší první otázky typu pole a Q2 kód druhé:
{sum(Q1_SQ001.value,Q2_SQ001.value)}
Upozorňujeme, že SQ001 je výchozí kód každé dílčí otázky. Pokud kód dílčí otázky změníte, odpovídajícím způsobem upravte výše uvedenou rovnici.
Použití em_validation_q v poli
Pomocí rovnice k ověření otázky můžete řídit pole podle libovolné podmínky.
Podrobnosti implementace:
- pro první pole: pole s jednou volbou
- Kód otázky je ARRAY
- Kódy dílčích otázek jsou SQ01, SQ02, SQ03 a SQ04
- upravte Rovnici k ověření celé otázky a vložte
!is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03)
- pro druhé pole: pole s textem
- Kód otázky je ARRAYTEXT
- Kódy dílčích otázek na ose Y jsou SY01, SY02, SY03 a SY04
- Upravte Rovnici k ověření celé otázky a vložte
count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)








