ExpressionScript – prezentace
From LimeSurvey Manual
Úvod
LimeSurvey používá Expression Script (skript výrazů), díky kterému LimeSurvey podporuje složitější větvení, hodnocení, ověření a přizpůsobení obsahu. Nahrazuje způsob, jakým LimeSurvey na pozadí spravuje nahrazování, podmínky a hodnocení. Také výrazně urychluje zpracování, protože odstraňuje většinu čtení z databáze za běhu. Expression Script vyvinul Dr. Thomas White (TMSWhite).
Klíčové definice
- Výraz: Cokoli uzavřené ve složených závorkách:
- Za předpokladu, že bezprostředně za levou složenou závorkou ani před pravou složenou závorkou není žádná mezera.
- Obsah výrazu vyhodnocuje EM, takže může obsahovat matematické vzorce, funkce a složité zpracování řetězců a dat.
- Přizpůsobení (tailoring): Někdy se nazývá „piping“. Jde o proces podmíněné úpravy textu:
- Máte přístup ke všem „nahrazovacím polím“, údajům o respondentech a datům odpovědí.
- Také máte snazší přístup k otázkám, odpovědím a jejich vlastnostem.
- Rovnice relevance: Nový atribut otázky, který řídí viditelnost otázky:
- Pokud existuje rovnice relevance, otázka se zobrazí, pouze pokud se relevance vyhodnotí jako pravda.
- Interně se všechny příkazy array_filter a array_filter_exclude mění na relevanci na úrovni dílčích otázek.
- SGQA (jak se proměnné pojmenovávaly dříve):
- Znamená Survey-Group-Question-Answer (průzkum-skupina-otázka-odpověď)
- Názvy proměnných SGQA vypadají například takto: 123X5X382X971 a mohou mít přípony dílčích otázek.
- Tyto názvy proměnných jsou specifické pro podkladové databázové kódy S/Q/G/A, takže je často nutné je měnit.
- Rovnice – typ otázky: Nový typ otázky, který ukládá výpočty nebo reporty do databáze:
- Je podobný otázce typu Boilerplate, ale jeho obsah se ukládá do databáze, i když nastavíte „Vždy skryje tuto otázku“.
- Kód otázky: Toto je upřednostňovaný název proměnné pro EM:
- Může to být popisný název označující účel otázky, což usnadňuje čtení složité logiky.
- Platné kódy otázek by NEMĚLY začínat číslicí, takže pro číslování otázek pomocí kódu otázky jednoduše použijte „q1“, „q1a“ nebo „g1q2“.
- Tento kód se stane názvem proměnné při exportu dat do SPSS nebo R. Pokud tedy provádíte statistickou analýzu, musíte vytvářet pouze jedinečné kódy otázek.
Musím používat Expression Script?
Stručná odpověď je „ne“. Silně to však závisí na složitosti průzkumu, který chcete vytvořit.
Například editor podmínek pokrývá některé základní výrazy, které lze použít u otázek vašeho průzkumu. Editor podmínek je však omezený. Proto se používá Expression Script – rozšiřuje možnosti přizpůsobení.
Mohu kombinovat podmínky a rovnice relevance?
Ano. U některých otázek můžete použít editor podmínek a u jiných rovnice relevance.
U jedné otázky nemůžete mít nastavené současně podmínky i výrazy! Jakmile je podmínka nastavena, nahradí jakýkoli výraz zapsaný v poli rovnice relevance. Pole rovnice relevance pak již také nelze ručně upravovat.
Existuje však způsob, jak v jedné otázce použít výrazy i podmínky. Jak bylo uvedeno výše, podmínka nahradí pole rovnice relevance. Poté si prohlédněte nově vytvořenou rovnici a zkopírujte ji do textového editoru. Nově vytvořenou podmínku smažte v editoru podmínek a poté upravte otázku tak, že výrazy založené na podmínce z textového souboru přidáte k ostatním výrazům, které chcete použít.
Jak si vybrat mezi podmínkami a relevancí?
Zde je seznam výhod a nevýhod jednotlivých způsobů:
| Způsob | Výhody | Nevýhody |
|---|---|---|
| Podmínky | 1. Pěkné grafické rozhraní pro vytváření jednoduchých podmínek. 2. Grafické rozhraní je dobře zdokumentované a podpůrný tým mu rozumí |
1. Podporuje pouze jednoduchá porovnání a nezvládá dobře podmínky „A“ a „NEBO“. 2. Kaskádové podmínky fungují nespolehlivě 3. Pomalé – náročné na databázi – může zpomalit dlouhé průzkumy. 4. Byly hlášeny některé problémy s opětovným načítáním podmínek. 5. Grafické rozhraní se špatně škáluje, pokud jsou k dispozici desítky, stovky nebo tisíce otázek. 6. Převod papírových průzkumů může být pomalý, protože musí používat názvy SGQA. 7. Pro složité větvení často potřebujete programátora, který logiku napíše na míru. |
| Relevance | 1. Podporuje velmi složitou logiku, včetně více než 80 funkcí a matematických/řetězcových operátorů. 2. Dokonalá podpora kaskádové logiky. 3. Rychlé – žádná další volání databáze, podpora průzkumů s více než 1000 otázkami. 4. Žádné problémy s opětovným načítáním logiky, protože nevyžaduje kódy SGQA. 5. Zvýraznění syntaxe se škáluje i na průzkumy s více než 1000 otázkami. 6. Snadné a rychlé použití pro skupiny, které chtějí převést stávající papírové průzkumy do elektronické podoby. 7. Snadno podporuje částečně strukturované rozhovory a epidemiologické průzkumy bez nutnosti programátora. |
1. Žádné grafické rozhraní pro jednoduché podmínky – místo toho využívá zvýraznění syntaxe. |
- Doporučujeme použít to, co lépe vyhovuje vašim potřebám.
- Podrobnější vysvětlení funkcí EM najdete na následujícím odkazu.
Začínáme
Nejlepší způsob, jak začít s EM:
- Nainstalujte nejnovější stabilní verzi z https://www.limesurvey.org/en/download.
- Importujte a prozkoumejte některé ukázkové průzkumy.
- Prozkoumejte případy použití a návody a příklady krok za krokem.
- Prozkoumejte dokumentaci EM (tuto stránku)
- Testy jednotek izolovaných výrazů (pokročilé)
- ukazují příklady použití všech funkcí a operátorů EM a výsledky v PHP a JavaScriptu;
- upozorňujeme, že několik funkcí generuje v PHP a JavaScriptu odlišné výsledky, takže vám tato stránka umožní naplánovat logiku EM odpovídajícím způsobem.
- Testy jednotek izolovaných výrazů (pokročilé)
Terminologie
Tyto pojmy se běžně používají k popisu možností EM:
- Větvení založené na relevanci – pokud je otázka relevantní, zobrazí se, jinak ne (např. je neviditelná a v databázi se označí jako NULL). Pole relevance najdete v panelu editoru otázky i v panelu editoru skupiny otázek. Druhé jmenované slouží k použití sady podmínek na celou skupinu bez nutnosti kopírovat stejnou podmínku do každé otázky a/nebo ke kombinaci podmíněné logiky na úrovni skupiny a otázky.
- Přizpůsobení – Jakmile víte, které otázky se mají položit, přizpůsobení (někdy nazývané piping) určuje, jak se má otázka položit. Podporuje nejen jednoduché nahrazení (například {TOKEN:FIRSTNAME}), ale také časování sloves a skloňování podstatných jmen podle pohlaví nebo počtu vašich subjektů. Také umožňuje změnit zprávu, kterou zobrazíte respondentovi průzkumu, podle toho, zda (nebo jak) odpověděl na jiné otázky.
- Rovnice – EM přidává nový typ otázky nazvaný Rovnice, který ukládá výsledek výrazu. Výsledky rovnic se vypočítají a zapíší do databáze, i když je na stránce skryjete. Používají se proto pro skryté výpočty skóre, navigaci založenou na složitých rovnicích, hodnocení a reporty, které budou vygenerovány a uloženy v databázi.
Relevance a kaskádová relevance
Každý typ otázky má nyní možnost relevance, která určuje, zda se otázka zobrazí, nebo ne. EM zpracovává každou rovnici relevance v pořadí, v jakém se objevují v průzkumu. Pokud je výraz pravdivý (nebo chybí – kvůli podpoře starších průzkumů), otázka se zobrazí. Pokud není relevantní, otázka bude skryta a hodnota v databázi bude nastavena na NULL. Pokud ve skupině nejsou žádné relevantní otázky, bude celá skupina přeskočena.
Pokud je navíc kterákoli proměnná ve výrazu nerelevantní, výraz se vždy vyhodnotí jako nepravda. Tím je umožněna kaskádová relevance, takže nemusíte psát velmi dlouhé rovnice relevance pro každou otázku.
Řekněme, že máte pět otázek Q1–Q5 a chcete zobrazit Q2, pouze pokud byla zodpovězena Q1, a Q3, pouze pokud byla zodpovězena Q2 atd. Rovnice relevance by mohly vypadat takto:
| Kód otázky | Relevance | Otázka |
|---|---|---|
| Q1 | 1 | Jak se jmenujete? |
| Q2 | Q1 | {Q1}, kolik je vám let? |
| Q3 | Q2 | Takže vám je {Q2} let. Jste ženatý/vdaná? |
| Q4 | Q3 == "Y" | {Q1}, jak dlouho jste ženatý/vdaná? |
| Q5 | Q4 | Kolik máte dětí, {Q1}? |
Relevance na úrovni skupiny
ExpressionScript podporuje také relevanci na úrovni skupiny. Usnadňuje to implementaci smyček. Řekněme, že chcete shromáždit informace až o 10 entitách (například o produktech nebo osobách z domácnosti), přičemž nejprve zjistíte, kolik entit vyžaduje doplňující otázky (například dotazem, kolik lidí žije v domácnosti, nebo tím, že respondenti zaškrtnou, které produkty se jim z dlouhého seznamu líbí). Jakmile víte, kolik entit vyžaduje doplňující otázky, můžete pro každou z 10 skupin doplňujících otázek použít relevanci na úrovni skupiny jako {count >= 1}, {count >=2}, ... {count >= 10}. V rámci každé skupiny můžete mít podmíněnou logiku na úrovni otázek (např. doplňující otázky specifické pro pohlaví nebo věk každého subjektu). Rovnice relevance na úrovni otázky a skupiny se spojují operátorem AND, aby se určilo, co se má zobrazit.
Chcete-li si takový příklad vyzkoušet, importujte následující průzkum: Příklad sčítacího průzkumu.
Na následujícím snímku obrazovky je vidět, že skupina Person 1 se zobrazí (je relevantní), pokud respondent žije alespoň s jednou další osobou ve společné domácnosti:

Přizpůsobení/Piping
Cokoli ve složených závorkách se nyní považuje za výraz (s jednou výjimkou popsanou níže). Výrazy mají přístup ke všem LimeReplacementFields a proměnným (prostřednictvím několika aliasů), ke všem typickým operátorům rovnic (matematickým, logickým i porovnávacím) a k desítkám funkcí (které dokonce fungují dynamicky na straně klienta).
Pomocí těchto rovnic můžete například:
- Podmíněně zobrazovat respondentům přizpůsobené zprávy na základě předchozích odpovědí;
- Vytvářet hodnocení a zobrazovat jeho výsledky (nebo na jejich základě podmíněně větvit průzkum či zobrazovat zprávy), a to zcela bez použití samotného modulu hodnocení;
- Skloňovat podstatná jména a časovat slovesa v otázkách, odpovědích a reportech;
- Zobrazit souhrny odpovědí před stránkou „Zobrazit vaše odpovědi“ na konci průzkumu.
Rovnice
Existuje nový typ otázky nazvaný Rovnice. Představte si ji jako typ otázky Zobrazení textu s tím rozdílem, že hodnotu zobrazeného obsahu ukládá do databáze. Pokud tedy text otázky typu Rovnice obsahuje výpočet hodnocení, bude tato hodnota uložena v databázi v proměnné, kterou lze zobrazit ve veřejných nebo soukromých statistikách.
Syntaxe
Cokoli uvnitř složených závorek se nyní považuje za výraz (s jednou výjimkou: na začátku ani na konci nesmí být žádné mezery - to je nutné, aby se ExpressionScript nepokoušel zpracovávat vložený JavaScript).
Upozorňujeme, že výrazy mohou být napsány na více řádcích, pokud za otevírací složenou závorkou ani před zavírací složenou závorkou není žádná mezera. To je užitečné zejména u vnořených příkazů „if()“, například takto:
{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 následující syntaxi:
- Všechny standardní matematické operátory (např. +,-,*,/,!);
- Všechny standardní porovnávací operátory (např. <,<=,==,!=,>,>=, plus jejich ekvivalenty: lt, le, eq, ne, gt, ge);
- Závorky (takže můžete seskupovat dílčí výrazy);
- Podmíněné operátory (např. &&,| | a jejich ekvivalenty: and, or);
- Řetězce v jednoduchých i dvojitých uvozovkách (do každého lze vnořit řetězec s druhým typem uvozovek);
- Operátor čárky (takže můžete mít seznam výrazů a vrátit jen konečný výsledek);
- Operátor přiřazení (=);
- Předdefinované proměnné (pro odkazy na otázky, atributy otázek a odpovědi) - např. kódy SGQA;
- Předdefinované funkce (již jich je více než 80 a další lze snadno přidat).
Operátory
Syntaxe EM se řídí běžnou prioritou operátorů:
| Úroveň | Operátor(y) | Popis |
|---|---|---|
| 1 | () | závorky pro seskupení nebo volání funkcí |
| 2 | ! - + | unární operátory: negace (not), záporné znaménko, kladné znaménko |
| 3 | * / | násobení, dělení |
| 4 | + - | sčítání, odčítání |
| 5 | < <= > >= lt le gt ge | relační porovnání |
| 6 | == != eq ne | porovnání rovnosti |
| 7 | and | logické AND |
| 8 | or | logické OR |
| 9 | = | operátor přiřazení |
| 10 | , | operátor čárky |
Upozornění na nesoulad čísla a řetězce a na abecední/číselné porovnání
Když porovnáváte hodnoty pomocí relačních operátorů nebo operátorů rovnosti, dávejte pozor na nesoulad typů. Hodnotu zadanou uživatelem (nebo poskytnutou prostřednictvím kódu odpovědi) lze použít jako číslo, pokud je zjevně číslem.
Pokud některou z hodnot uzavřete do ", provede se porovnání textu/řetězců. Chcete-li porovnávat jako čísla, nikdy číslo do " neuzavírejte.
Například Q0.NAOK > "50" platí, pokud je Q0.NAOK číselná otázka s hodnotou 9. Je to proto, že operátor > předpokládá abecední porovnání, nikoli číselné.
Abyste měli jistotu, že porovnáváte celočíselné hodnoty, můžete použít intval(Q0.NAOK) > 50. Pamatujte, že pokud Q0.NAOK není číslo (je prázdné nebo je řetězec), pak intval(Q0.NAOK) === 0. Pro porovnání řetězců ("A" < "B") použijte přímo strcmp: strcmp(Q0.NAOK,"B") nebo strcmp(Q0.NAOK,"A5").
Upozornění k používání operátoru přiřazení (=)
Operátorům přiřazení byste se měli vyhýbat, pokud to není nezbytně nutné, protože mohou způsobit neočekávané vedlejší účinky. Pokud například změníte hodnotu předchozí odpovědi, kaskádová relevance a logika ověření mezi touto otázkou a aktuální otázkou se znovu nevypočítají, takže můžete skončit s vnitřně nekonzistentními daty (např. otázky, které zůstanou zodpovězené, ale měly být nastaveny na NULL, nebo otázky, které jsou přeskočeny, ale měly být zodpovězeny). Obecně platí, že pokud chcete proměnné přiřadit hodnotu, měli byste vytvořit otázku typu Rovnice a pomocí výrazu nastavit její hodnotu. Přesto existují vzácné případy, kdy lidé tento operátor skutečně potřebují, proto jsme jej zpřístupnili.
Aby vás na tento operátor upozornil, je v rovnicích se zvýrazněním syntaxe zobrazen červeným písmem (abyste ho nezaměnili s „==“).
Použití operátoru přiřazení
Hlavní důvody, proč můžete chtít použít operátor přiřazení:
- Potřebujete pomocí rovnice nastavit výchozí hodnotu u otázky, která výchozí hodnoty nepřijímá (například seznam s přepínači, kde vám uživatelské rozhraní umožňuje vybrat jednu z možností odpovědí, ale nedovoluje zadat rovnici). Buďte však opatrní, protože LimeSurvey nebude schopen ověřit, že vaše rovnice vytvoří jednu z povolených odpovědí pro danou otázku;
- Potřebujete násilně změnit odpověď na předchozí otázku na základě pozdější odpovědi;
- atd...
K tomuto účelu můžete použít celý systém Expression Manageru. Je však lepší použít Rovnici.
Některé příklady:
- Nastavení odpovědi na otázku typu krátký text malými písmeny :
{QCODE=strtolower(QCODE.NAOK)}; - Nastavení výchozí hodnoty odpovědi u otázky typu pole na začátku průzkumu :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Nastavení výchozí hodnoty odpovědi u otázky typu pole textů na začátku průzkumu :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Nastavení odpovědi s podmínkou :
{QCODE=if(YesNo="Y","A1","")}.
Zabezpečení XSS
Při zapnuté ochraně XSS nelze některé části systému Expression Manageru použít:
- zahájení HTML značky v jednom výrazu a její ukončení v jiném výrazu;
- použití složitého výrazu v adrese URL.
Příklady a náhradní řešení:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}nefunguje se zabezpečením XSS, zde můžete použít{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, zde můžete použít otázku typu rovnice, protože použití úplného kódu otázky je v pořádku:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Přístup k proměnným
ExpressionScript poskytuje přístup pouze pro čtení ke všem proměnným, které můžete potřebovat. Z důvodu zpětné kompatibility poskytuje přístup k následujícímu:
- TOKEN:xxx - hodnota TOKENu (např. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (pouze pro neanonymní průzkum).
- Všechny hodnoty {XXX} používané šablonami.
- V textu otázky můžete použít {QID}, které se nahradí ID otázky, a {SGQ}, které se nahradí SGQA otázky.
- {SAVEDID} pro ID aktuální odpovědi
ExpressionScript navíc umožňuje odkazovat na proměnné pomocí kódu otázky (sloupec 'title' v tabulce otázek v databázi). Je to také označení proměnné, které se použije při exportu dat do SPSS, R nebo SAS. Pokud máte například otázky na jméno, věk a pohlaví, můžete tyto proměnné nazvat name, age a gender místo 12345X13X22, 12345X13X23 a 12345X13X24. Díky tomu jsou rovnice srozumitelnější a logiku může snáze ověřit kdokoli, navíc lze otázky libovolně přesouvat, aniž byste museli sledovat čísla skupin nebo otázek.
Důležité: Bezpečnější je odkazovat na proměnné, které se vyskytují na předchozích stránkách nebo v předchozích otázkách.
ExpressionScript dále umožňuje přístup k mnoha vlastnostem otázky:
| Syntaxe | Význam | Příklad | Výsledek příkladu |
|---|---|---|---|
| Qcode | alias pro Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | vybraný kód odpovědi na otázku, pokud je relevantní (jinak prázdné), nebo textová hodnota, pokud nejde o kódovanou otázku | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | totéž jako Qcode - viz popis NAOK | {gender.NAOK} | 'M' |
| Qcode.value | hodnota hodnocení otázky, pokud je relevantní (jinak prázdné), nebo textová hodnota, pokud nejde o kódovanou otázku | {gender.value} | '1' |
| Qcode.valueNAOK | totéž jako Qcode.value - viz popis 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 | zda je otázka povinná (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | interní číslo otázky (ne pořadové číslo) | {gender.qid} | 337 |
| Qcode.type | typ otázky | {gender.type} | 'G' |
| Qcode.jsName | správný název otázky v JavaScriptu bez ohledu na to, zda je deklarována na této stránce či nikoli | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | interní číslo skupiny (ne pořadové číslo) | {gender.gid} | 3 |
| Qcode.qseq | pořadové číslo otázky, počínaje 0 | {gender.qseq} | 5 |
| Qcode.gseq | pořadové číslo skupiny, počínaje 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | zda je otázka aktuálně relevantní (0 nebo 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | rovnice relevance na úrovni otázky | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | rovnice relevance na úrovni skupiny | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | hodnota SGQA této otázky | {gender.sgqa} | '1827X3X337' |
Problém s HTML editorem
Pokud používáte HTML editor, některé znaky se nahradí HTML entitami.
- & za &
- < za <
- > za >
Pokud používáte HTML editor, musíte použít:
- and pro &
- lt pro <
- le pro <=
- gt pro >
- ge pro >=
Doporučujeme odstranit z výrazu veškeré HTML, které se v něm objevuje. Pokud používáte HTML editor LimeSurvey, klikněte na tlačítko „Zdroj“ (v levé horní části editoru) a smažte všechny znaky, které nesouvisejí s vaším výrazem (např.
,
a podobně).
Pojmenování proměnných Qcode
Zde jsou podrobnosti o tom, jak sestavit Qcode (a získat přístup k některým vlastnostem) podle typu otázky. Obecně se Qcode sestavuje takto:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Pro komentář a jiné jsou odpovídající kódy otázek QuestionCode_comment a QuestionCode_other.
| Typ | Popis | Kód | Dílčí otázky | Možnosti odpovědí | Škály | Kód odpovědi | Zobrazená odpověď | Relevance |
|---|---|---|---|---|---|---|---|---|
| 5 | Výběr z 5 možností, přepínače | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Pole (výběr z 10 možností), přepínače | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Pole (výběr z 5 možností), přepínače | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Pole (flexibilní popisky), 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 sloupců | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Pole (flexibilní) - formát řádků | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Pole (zvýšení, stejné, pokles), přepínače | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Pole (více flexibilních) 1 až 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Pole (více flexibilních) text | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Pole (ano/nejisté/ne), přepínače | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Zobrazení textu | Q11 | {Q11.shown} | |||||
| D | Datum | Q12 | {Q12} | {Q12.shown} | ||||
| * | Rovnice | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Načtení souboru (zaznamenává počet nahraných souborů) | Q14 | {Q14} | {Q14>0} | ||||
| G | Rozbalovací seznam pohlaví | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Textové pole (rozsáhlé) | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Otázka na jazyk | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Seznam - rozbalovací | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Seznam, rozbalovací seznam/přepínače | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Seznam s komentářem, rozbalovací seznam/přepínače + textové pole | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Dlouhý text | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Vícenásobné možnosti, zaškrtávací pole | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Vícenásobné možnosti s komentáři, zaškrtávací pole + text | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Vícenásobné číselné otázky | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Vícenásobné krátké texty | 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 | Pořadí | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Krátký text | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Ano/Ne, přepínače | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Použití NAOK
NAOK --> „Not Applicable“ (NA, nepoužitelné) je v pořádku (OK)
Použití NAOK znamená, že všechny nebo některé proměnné jsou irelevantní (tj. „Not Applicable“ (NA) je v pořádku (OK)).
Například: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) vždy vrátí prázdný řetězec, pokud je jedna dílčí otázka otázky Q1 odfiltrována. Pro spočítání zaškrtnutých dílčích otázek v takové otázce lze použít count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Pokud je dílčí otázka skrytá, EM vrátí prázdný řetězec.
Bez NAOK, pokud je jedna otázka nebo jedna dílčí otázka skrytá, EM vždy vrátí prázdný řetězec (což je totéž jako vrácení false).
Přípona .shown vždy používá systém NAOK (prázdný řetězec, pokud je skrytá), ale pokud potřebujete kód odpovědi, je vždy dobré přidat .NAOK za kód otázky (kromě případů, kdy to potřebujete jinak a víte, co děláte).
Další informace najdete v podkapitole Přepsání kaskádových podmínek.
Rezervované proměnné „this“, „self“ a „that“
Často potřebujete vyhodnotit všechny části otázky, například spočítat, na kolik dílčích otázek bylo odpovězeno, nebo sečíst skóre. Jindy chcete zpracovat jen určité řádky nebo sloupce otázky (například získat součty řádků či sloupců a uložit je do databáze). Tyto rezervované proměnné tento postup značně usnadňují.
Proměnná „this“
Proměnná „this“ se používá výhradně v možnostech „Rovnice k ověření otázky“ a „Validační rovnice podotázky“ (druhá z nich není z grafického rozhraní dostupná). Rozvine se na názvy proměnných jednotlivých buněk v těchto otázkách. Pokud tedy chcete zajistit, aby každá položka byla větší než tři, nastavte „Validační rovnici podotázky“ na (this > 3).
Proměnná „self“
Proměnné „self“ a „that“ jsou výkonnější a slouží jako makra, která se rozvinou před zpracováním rovnic. Možnosti syntaxe proměnné „self“ jsou:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix je libovolná z běžných přípon qcode (např. NAOK, value, shown)
- sub-selector může být jedním z následujících:
- comments - pouze dílčí otázky, které jsou komentáři (např. vícenásobné možnosti s komentáři a seznam s komentářem);
- nocomments - pouze dílčí otázky, které nejsou komentáři;
- sq_X - kde X je identifikátor řádku nebo sloupce. Vybrány jsou pouze dílčí otázky odpovídající vzoru X. Vyhledávání probíhá v úplném identifikátoru kódu, takže sq_X odpovídá dílčím otázkám nX, X, Xn (např. pokud použijete sq_1, budou zahrnuty dílčí otázky a1, 1a, 1, 11 nebo 001). Dávejte pozor na typ otázky s dvojitou škálou, kde kódy dílčích otázek jsou QCODE_SQCODE_1 a QCODE_SQCODE_1, a na typ otázky s pořadím, kde kódy dílčích otázek jsou QCODE_1, QCODE_2 ....
Příklady:
- Byla zodpovězena nějaká část otázky? -> {count(self.NAOK)>0}
- Jaké je skóre hodnocení pro tuto otázku? -> {sum(self.value)}
Pomocí nich můžete také získat součty řádků a sloupců. Předpokládejme, že máte pole čísel s řádky A-E a sloupci 1-5.
- Jaký je celkový součet? -> {sum(self.NAOK)}
- Jaký je součet řádku B? -> {sum(self.sq_B.NAOK)}
- Jaký je součet sloupce 3? -> {sum(self.sq_3.NAOK)}
Proměnná „that“
Proměnná „that“ je podobná proměnné „self“, ale umožňuje odkazovat na jiné otázky. Její syntaxe je:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname je název otázky bez jakýchkoli přípon dílčích otázek. Vytvořme tedy otázku „q1“, kde „q“ představuje také její qname.
Příklady:
- Byla zodpovězena nějaká část otázky q1? -> {count(that.q1.NAOK)>0}
- Jaké je skóre hodnocení pro q2? -> {sum(that.q2.NAOK)}
- Jaký je celkový součet otázky q3? -> {sum(that.q3.NAOK)}
- Jaký je součet řádku C v q4? -> {sum(that.q4.sq_C.NAOK)}
- Jaký je součet sloupce 2 v q4? -> {sum(that.q4.sq_2.NAOK)}
Proměnné „self“ a „that“ lze použít v jakékoli relevanci, ověření nebo přizpůsobení textu.
Jediným upozorněním je, že při použití funkce Show logic file se zobrazí rozbalená hodnota proměnných „self“ a „that“. Díky tomu uvidíte skutečnou rovnici, která bude vygenerována, a můžete (spolu s EM) ověřit, zda proměnné existují. Může to působit matoucím dojmem, protože můžete vidět velmi dlouhé rovnice. Pokud však otázku upravíte, uvidíte původní rovnici používající „self“ a/nebo „that“.
- chcete explicitně pojmenovat každou proměnnou použitou v rovnici, nebo
- používáte proměnné, které nemají dílčí otázky (např. otázky s jednou odpovědí). V takových případech je předpona „that“ zbytečná a riskujete neočekávané výsledky.
Přístup k funkcím
ExpressionScript poskytuje přístup k matematickým funkcím, funkcím pro práci s řetězci a uživatelsky definovaným funkcím, jak je uvedeno níže. Pro tyto funkce existují ekvivalenty v PHP a JavaScriptu, takže fungují stejně na straně serveru (PHP) i klienta (JavaScript). Přidávání nových funkcí je snadné.
Implementované funkce
V současné době jsou k dispozici následující funkce:
| Funkce | Význam | Syntaxe |
|---|---|---|
| abs | Absolutní hodnota | number abs(number) |
| acos | Arkus kosinus | number acos(number) |
| addslashes | Uvození řetězce pomocí zpětných lomítek | string addslashes(string) |
| asin | Arkus sinus | number asin(number) |
| atan | Arkus tangens | number atan(number) |
| atan2 | Arkus tangens dvou proměnných | number atan2(number, number) |
| ceil | Zaokrouhlit směrem nahoru | number ceil(number) |
| checkdate | Vrátí pravdu (1), pokud jde o platné datum v gregoriánském kalendáři | bool checkdate(month,day,year) |
| convert_value | Převede číselnou hodnotu pomocí vstupní a výstupní tabulky číselných hodnot | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Kosinus | number cos(number) |
| count | Spočítá počet zodpovězených (neprázdných) otázek v seznamu | number count(arg1, arg12, ..., argN) |
| countif | Spočítá počet zodpovězených otázek v seznamu, které se rovnají prvnímu argumentu | number countif(matches, arg1, arg2, ... argN) |
| countifop | Spočítá počet zodpovězených otázek v seznamu, které splňují kritérium (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formátovat lokální datum/čas | string date(format [, timestamp=time()]) |
| exp | Vypočítá exponent e | number exp(number) |
| fixnum | V případě potřeby zobrazí čísla s čárkou jako oddělovačem desetinných míst | string fixnum(number) |
| floor | Zaokrouhlit směrem dolů | number floor(number) |
| gmdate | Formátovat GMT datum/čas | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Převede všechny HTML entity na odpovídající znaky (vždy používá ENT_QUOTES a UTF-8) | string html_entity_decode(string) |
| htmlentities | Převede všechny vhodné znaky na HTML entity (vždy používá ENT_QUOTES a UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Převede speciální znaky na HTML entity (vždy používá ENT_QUOTES a UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Převede speciální HTML entity zpět na znaky (vždy používá ENT_QUOTES a UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formátovat místní čas/datum jako celočíselné | string idate(string [, timestamp=time()]) |
| if | Podmínka ve stylu Excelu if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Spojit položky pole řetězcem | string implode(glue,arg1,arg2,...,argN) |
| intval | Získat číselnou hodnotu řetězce | int intval(number [, base=10]) |
| is_empty | Zjistí, zda je proměnná považována za prázdnou | bool is_empty(var) |
| is_float | Zjistí, zda je typ proměnné float | bool is_float(var) |
| is_int | Zjistí, zda je typ proměnné celé číslo | bool is_int(var) |
| is_nan | Zjistit jestli proměnná není číslo | bool is_nan(var) |
| is_null | Zjistit jestli je proměnná hodnoty NULL | bool is_null(var) |
| is_numeric | Zjistí, zda je proměnná číslo nebo číselný řetězec | bool is_numeric(var) |
| is_string | Zjistí, zda je typ proměnné řetězec | bool is_string(var) |
| join (New in 2.0 build 130129) | Spojí prvky do nového řetězce | join(arg1, arg2, ... argN) |
| list | Vrátí seznam neprázdných hodnot oddělených čárkami | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Vrátí seznam zadané vlastnosti otázky (retProp) oddělený znakem 'glue' z otázek v seznamu, které splňují kritérium (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Odstraní bílé znaky (nebo jiné znaky) ze začátku řetězce | string ltrim(string [, charlist]) |
| max | Najít nejvyšší hodnotu | number max(arg1, arg2, ... argN) |
| min | Najít nejnižší hodnotu | number min(arg1, arg2, ... argN) |
| mktime | Získá UNIX timestamp pro datum (každý ze 6 argumentů je volitelný) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Funkce modulo zatím není podporována. Místo ní můžete použít funkci floor() | floor(x/y)==(x/y) |
| nl2br | Vloží HTML zalomení řádku před všechny nové řádky v řetězci | string nl2br(string) |
| number_format | Formátuje číslo s oddělovačem tisíců | string number_format(number) |
| pi | Získá hodnotu pí | number pi() |
| pow | Exponenciální výraz | number pow(base, exp) |
| quoted_printable_decode | Převede řetězec ve formátu quoted-printable na 8bitový řetězec | string quoted_printable_decode(string) |
| quoted_printable_encode | Převede 8bitový řetězec na řetězec ve formátu quoted-printable | string quoted_printable_encode(string) |
| quotemeta | Uveďte meta znaky | string quotemeta(string) |
| rand | Generovat náhodné číslo, viz tento příklad | int rand() OR int rand(min, max) |
| regexMatch | porovná řetězec s regulárním výrazem | bool regexMatch(pattern,input) |
| round | Zaokrouhlit číslo na volitelnou přesnost | number round(val [, precision]) |
| rtrim | Odstraní bílé znaky (nebo jiné znaky) z konce řetězce | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Vrátit formátovaný řetězec | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Odmocnina | number sqrt(arg) |
| stddev | Vypočítá výběrovou směrodatnou odchylku pro seznam čísel | number stddev(arg1, arg2, ... argN) |
| str_pad | Doplní řetězec na určitou délku jiným řetězcem | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Zopakovat řetězec | string str_repeat(input, multiplier) |
| str_replace | Nahradí všechny výskyty hledaného řetězce náhradním řetězcem | string str_replace(search, replace, subject) |
| strcasecmp | Binárně bezpečné velikost-neřešící (case-insensitive) porovnání řetězců | int strcasecmp(str1, str2) |
| strcmp | Binárně bezpečné porovnání řetězců | int strcmp(str1, str2) |
| strip_tags | Odebrat HTML a PHP značky z řetězce | string strip_tags(str, allowable_tags) |
| stripos | Najde pozici prvního výskytu unicode řetězce bez ohledu na velikost písmen (počítáno od 0, pokud nenalezeno, vrací false) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Od-cituje citovaný text | string stripslashes(string) |
| stristr | Velikost-neřešící strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Získat délku řetězce | int strlen(string) |
| strpos | Najde pozici prvního výskytu unicode řetězce (počítáno od 0, pokud nenalezeno, vrací false) | int strpos(haystack, needle [ offset=0]) |
| strrev | Převrátit řetězec | string strrev(string) |
| strstr | Najít první výskyt řetězce | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Převede řetězec na malá písmena | string strtolower(string) |
| strtotime | Převede téměř jakýkoli anglický textový popis data a času na Unix timestamp | int strtotime(string) |
| strtoupper | Převede řetězec na velká písmena | string strtoupper(string) |
| substr | Vrátí část unicode řetězce | string substr(string, start [, length]) |
| sum | Vypočítat součet hodnot pole | number sum(arg1, arg2, ... argN) |
| sumifop | Sečte hodnoty zodpovězených otázek v seznamu, které splňují kritérium (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangens | number tan(arg) |
| time | Vrátit aktuální UNIX timestamp | number time() |
| trim | Odstraní bílé znaky (nebo jiné znaky) ze začátku a konce řetězce | string trim(string [, charlist]) |
| ucwords | Převede první znak každého slova v řetězci na velké písmeno | string ucwords(string) |
| unique | Vrátí pravdu, jsou-li všechny neprázdné odpovědi unikátní | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Vytvoření nových funkcí výrazů pomocí zásuvného modulu (New in 4.0.0 )
Pokud potřebujete novou funkci, která v jádru neexistuje, můžete ji vytvořit pomocí zásuvného modulu. Taková nová funkce se vytváří pomocí události expressionManagerStart.
ExpressionScript ví, které proměnné jsou lokální
Aby bylo možné správně sestavit JavaScript pro stránku, musí EM vědět, které proměnné jsou na stránce nastaveny a jaké je jejich JavaScript ID (např. pro document.getElementById(x)). Musí také vědět, které proměnné jsou nastaveny na jiných stránkách (aby mohl zajistit, že potřebná pole <input type='hidden' value='x'> jsou přítomna a vyplněna).
Kaskádové podmínky
Pokud je některá z proměnných nerelevantní, bude nerelevantní (nepravdivá) celá rovnice. Například v následující tabulce N/A znamená, že jedna z proměnných nebyla relevantní:
| Operátor | Příklad | a | b | Výsledek |
|---|---|---|---|---|
| + (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 |
Přepsání kaskádových podmínek
Řekněme, že chcete zobrazit průběžný součet všech relevantních odpovědí. Můžete zkusit použít rovnici {sum(q1,q2,q3,...,qN)}. Ta se však interně přeloží na LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Pokud je tedy některá z hodnot q1-qN nerelevantní, rovnice vždy vrátí false. V tomto případě bude sum() zobrazovat „0“, dokud nebude zodpovězeny všechny otázky.
Abyste se tomu vyhnuli, můžete ke každé proměnné přidat suffix „.NAOK“ (což znamená, že Not Applicable je OK). V takovém případě nastane následující chování. Řekněme, že máte proměnnou q1.NAOK:
- q1 se nepřidá do klauzule LEManyNA()
- LEMval('q1') bude nadále kontrolovat, zda je odpověď relevantní, a pokud není, vrátí "" (jednotlivé nerelevantní odpovědi tedy budou ignorovány, ale neznehodnotí celý výraz).
Řešením problému s průběžným součtem je tedy použít rovnici sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Použití suffixu .NAOK také umožňuje autorům navrhovat průzkumy, které mají několik možných cest, ale později se opět sbíhají do společných cest. Řekněme například, že respondenti odpoví na průzkum způsobem, který je mimo běžný rozsah odpovědí. Autor může respondenty upozornit, že nemusí získat platné výsledky, a zeptat se jich, zda opravdu chtějí v průzkumu pokračovat. Pokud odpoví „Ano“, zobrazí se zbývající otázky. Podmínka pro „zbývající otázky“ by kontrolovala, zda počáteční odpovědi byly v běžném rozsahu NEBO zda respondent odpověděl „Ano“ na otázku, která je relevantní pouze tehdy, pokud odpověděl mimo běžný rozsah.
Jak ExpressionScript podporuje podmíněné mikro-přizpůsobení?
Zde je příklad mikro-přizpůsobení (kde Question Type=='expr' znamená rovnici):
| Kód otázky | Relevance | Typ otázky | Otázka |
|---|---|---|---|
| name | 1 | text | Jak se jmenujete? |
| age | 1 | text | Kolik je vám let? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Je nám líto, {name}, na tento test jste příliš {if( (age<16),'mladý',if( (age>80),'starý','středního věku') ) }. |
| kids | !badage | yesno | Máte děti? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Kolik máte dětí? |
| kid1 | parents && numKids >= 1 | text | Kolik let je vašemu prvnímu dítěti? |
| kid2 | parents && numKids >= 2 | text | Kolik let je vašemu druhému dítěti? |
| kid3 | parents && numKids >= 3 | text | Kolik let je vašemu třetímu dítěti? |
| kid4 | parents && numKids >= 4 | text | Kolik let je vašemu čtvrtému dítěti? |
| kid5 | parents && numKids >= 5 | text | Kolik let je vašemu pátému dítěti? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, uvedli jste, že je vám {age} a že máte {numKids} dětí. Součet věku vašich prvních {min(numKids,5)} dětí je {sumage} |
Chcete-li si stáhnout výše uvedený příklad průzkumu, klikněte na následující odkaz: Příklad průzkumu s počtem dětí.
Všechny tyto otázky mohou být na jedné stránce (např. ve stejné skupině) a zobrazí se pouze relevantní otázky. Navíc se při zadávání věku dětí bude výraz sum() v poslední otázce dynamicky aktualizovat.
ExpressionScript tuto funkci poskytuje tak, že každý výraz obalí pojmenovaným prvkem <span>. Při každé změně hodnoty znovu vypočítá výraz, který se má v tomto prvku <span> zobrazit, a obnoví zobrazení. Na jedné stránce můžete mít desítky nebo dokonce stovky takto přizpůsobených výrazů.
Zvýraznění syntaxe
Pro usnadnění zadávání a ověřování výrazů nabízí EM zvýraznění syntaxe s následujícími vlastnostmi:
Typy a významy zvýraznění syntaxe
| Barva | Ukázka | Význam | Popisek | Poznámky |
|---|---|---|---|---|
| béžové pozadí | Sample | celá rovnice | žádný | Cokoli ve složených závorkách, co je rozpoznáno jako rovnice (např. není na začátku ani na konci mezera), bude barevně označeno béžovým pozadím, aby se odlišilo od okolního textu |
| tučný červený text | Sample | chyba | Vysvětlení chyby | Může jít o neznámou proměnnou nebo chybu ve funkci. Průzkum je nefunkční a otázky závislé na příslušném výrazu nebudou respondentům zobrazeny. |
| modrý text | Sample | název funkce | význam a povolená syntaxe | Označuje názvy funkcí nebo věci, které by měly být funkcemi, protože za nimi následuje otevírací závorka. Zobrazují se tučným modrým textem. Popisky zobrazují význam a povolenou syntaxi funkce. |
| šedý text | Sample | řetězec | žádný | Řetězce v jednoduchých a dvojitých uvozovkách se zobrazují šedým textem. |
| azurový text | Sample | proměnná nastavená na stejné stránce | [name]: otázka; hodnota; answerList zobrazující kódy pro každou hodnotu | Jakákoli proměnná nastavená na stejné stránce jako otázka, kterou právě upravujete, se zobrazuje azurovým textem (lze ji aktualizovat v JavaScriptu). Popisek zobrazuje její název, samotnou otázku a její současnou hodnotu (nebo prázdné, pokud není nastavena). Pokud typ otázky očekává odpovědi z výčtu hodnot, zobrazí se mapování kódů na zobrazované hodnoty. |
| zelený text | Sample | proměnná nastavená na předchozí stránce | [name]: otázka; hodnota; answerList zobrazující kódy pro každou hodnotu | Jakákoli proměnná nastavená na předchozí stránce se zobrazuje tučným zeleným textem. Popisek zobrazuje její název, samotnou otázku a její současnou hodnotu (nebo prázdné, pokud není nastavena). Pokud typ otázky očekává odpovědi z výčtu hodnot, zobrazí se mapování kódů na zobrazované hodnoty. |
| tučný růžový text | Sample | proměnná nastavená na pozdější stránce obecně: na začátku průzkumu prázdná, ale může být vyplněna pomocí indexu nebo návratu zpět | [name nebo kód SGQA]: otázka; hodnota; answerList zobrazující kódy pro každou hodnotu | Jakákoli proměnná nastavená na pozdější stránce se zobrazuje tučným růžovým textem. Popisek zobrazuje její název, samotnou otázku a její současnou hodnotu (nebo prázdné, pokud není nastavena). Pokud typ otázky očekává odpovědi z výčtu hodnot, zobrazí se mapování kódů na zobrazované hodnoty. |
| tučný hnědý text | Sample | náhradní hodnota LimeSurvey | hodnota | Náhradní řetězce LimeSurvey (např. {TOKEN:xxx}, {PRIVACY_MESSAGE}) se zobrazují tučným hnědým textem. |
| červený text | Sample | operátor přiřazení (=) | varovná zpráva | Pokud použijete některý z operátorů přiřazení (=), bude tento operátor zobrazen červeným textem. Má to pomoci předejít nechtěnému přepsání hodnot, když jste ve skutečnosti chtěli zkontrolovat, zda a == b, místo nastavení hodnoty a = b. |
| normální černý text | Sample | interpunkce | žádný | Všechna ostatní interpunkční znaménka ve výrazu se zobrazují normálním černým textem. |
| text v červeném rámečku | tučná červená čára obklopuje chybu | syntaktická chyba | popis chyby | Jakékoli zjištěné syntaktické chyby se zobrazují v červených rámečcích. Popisek zobrazuje chybu. Příklady zahrnují nespárované závorky, použití nedefinovaných funkcí, předání nesprávného počtu argumentů funkcím, špatně strukturované výrazy (např. chybějící operátory mezi proměnnými), pokus o přiřazení nové hodnoty proměnné pouze pro čtení, pokus o přiřazení hodnot neproměnným nebo použití nepodporované syntaxe. Všimněte si, že systém detekce syntaktických chyb může ve výrazu nahlásit pouze jednu chybu, i když jich je více; pokud však jsou zjištěny nějaké chyby, bude zobrazena alespoň jedna. |
Další četba
Ukázkové průzkumy ExpressionScript
Případy použití a návody
Příklady krok za krokem
Reference pro vývojáře