ExpressionScript - Esittely
From LimeSurvey Manual
Johdanto
LimeSurvey käyttää Lausekekoodia (Expression Script), jonka avulla LimeSurvey tukee monimutkaisempaa haarautumista, arviointeja, validointia ja räätälöintiä. Se korvaa tavan, jolla LimeSurvey hallitsee korvauksia, ehtoja ja arviointeja taustajärjestelmässä. Se myös nopeuttaa käsittelyä huomattavasti, koska se poistaa suurimman osan ajonaikaisista tietokantalukuista. Lausekekoodin kehitti tohtori Thomas White (TMSWhite).
Keskeiset määritelmät
- Lauseke: Mikä tahansa aaltosulkeiden ympäröimä sisältö:
- Edellyttäen, että heti aloittavan aaltosulkeen jälkeen tai ennen lopettavaa aaltosulkua ei ole tyhjää merkkiä.
- EM arvioi lausekkeen sisällön, joten se voi sisältää matemaattisia kaavoja, funktioita sekä monimutkaista merkkijono- ja päivämääräkäsittelyä.
- Räätälöinti: Kutsutaan joskus nimellä "piping". Se on prosessi, jossa tekstiä muokataan ehdollisesti:
- Käytettävissäsi ovat kaikki korvauskentät, osallistujatiedot ja vastaustiedot.
- Pääset myös helpommin käsiksi kysymyksiin, vastauksiin ja niiden ominaisuuksiin.
- Relevanssiyhtälö: Uusi kysymyksen attribuutti, joka ohjaa kysymyksen näkyvyyttä:
- Jos relevanssiyhtälö on olemassa, kysymys näytetään vain, jos relevanssi on tosi.
- Sisäisesti kaikista array_filter- ja array_filter_exclude-komennoista tulee alikysymystason relevanssia.
- SGQA (miten muuttujat nimettiin aiemmin):
- Tulee sanoista Survey-Group-Question-Answer (kysely-ryhmä-kysymys-vastaus)
- SGQA-muuttujien nimet näyttävät tältä: 123X5X382X971, ja niissä voi olla alikysymyksen loppuliitteitä.
- Nämä muuttujien nimet liittyvät tietokannan S/Q/G/A-koodeihin, joten niitä joudutaan usein muuttamaan
- Yhtälö-kysymystyyppi: Uusi kysymystyyppi, joka tallentaa laskutoimituksia tai raportteja tietokantaan:
- Se on kuin Boilerplate-kysymys, mutta sen sisältö tallennetaan tietokantaan, vaikka valitsisit "Piilota kysymys aina".
- Kysymyskoodi: Tämä on EM:n ensisijainen muuttujanimi:
- Se voi olla kuvaava nimi, joka kertoo kysymyksen tarkoituksen ja helpottaa monimutkaisen logiikan lukemista.
- Kelvolliset kysymyskoodit eivät saa alkaa numerolla, joten jos numeroit kysymyksesi kysymyskoodilla, käytä esimerkiksi muotoa "q1", "q1a" tai "g1q2".
- Tästä tulee muuttujan nimi, jos viet tiedot SPSS:ään tai R:ään. Jos siis teet tilastollista analyysia, kysymyskoodien on oltava yksilöllisiä.
Onko minun käytettävä Lausekekoodia?
Lyhyt vastaus on "ei". Se riippuu kuitenkin vahvasti luomasi kyselyn monimutkaisuudesta.
Esimerkiksi ehtoeditori kattaa joitakin perusLausekkeita, joita voidaan soveltaa kyselysi kysymyksiin. Ehtoeditori on kuitenkin rajallinen. Siksi käytetään Lausekekoodia - se laajentaa mukautusmahdollisuuksia.
Voinko sekoittaa ehtoja ja relevanssiyhtälöitä?
Kyllä. Voit käyttää ehtoeditoria joissakin kysymyksissä ja relevanssiyhtälöitä toisissa.
Samassa kysymyksessä ei voi olla sekä ehtoja että lausekkeita! Kun ehto on määritetty, se korvaa kaiken, mitä relevanssiyhtälö-kenttään on kirjoitettu. Lisäksi Relevanssiyhtälö-kenttää ei voi enää muokata manuaalisesti.
Kysymyksessä on kuitenkin mahdollista käyttää sekä lausekkeita että ehtoja. Kuten yllä mainittiin, ehto korvaa relevanssiyhtälö-kentän. Kun ehto on luotu, tarkista, mikä on uusi luotu yhtälö, ja kopioi se tekstieditoriin. Poista uusi ehto ehtoeditorista ja muokkaa sitten kysymystä lisäämällä ehtoihin perustuvat lausekkeet tekstieditoritiedostostasi muiden käyttämiesi lausekkeiden rinnalle.
Miten valitsen ehtojen ja relevanssin välillä?
Tässä on luettelo kummankin tavan eduista ja haitoista:
| Tapa | Edut | Haitat |
|---|---|---|
| Ehdot | 1. Kätevä käyttöliittymä yksinkertaisten ehtojen luomiseen. 2. Käyttöliittymä on hyvin dokumentoitu ja tukitiimi tuntee sen |
1. Tukee vain yksinkertaisia vertailuja eikä käsittele "JA"- ja "TAI"-ehtoja hyvin. 2. Kaskadiehdot toimivat epäluotettavasti 3. Hidas - kuormittaa tietokantaa - se voi hidastaa pitkiä kyselyjä. 4. Ehtojen uudelleenlataamisessa on raportoitu joitakin ongelmia. 5. Käyttöliittymä ei skaalaudu hyvin, kun kysymyksiä on kymmeniä, satoja tai tuhansia. 6. Paperikyselyjen muuntaminen voi olla hidasta, koska on käytettävä SGQA-nimiä. 7. Monimutkaiseen haarautumiseen tarvittava logiikka vaatii usein ohjelmoijaa. |
| Relevanssi | 1. Tukee erittäin monimutkaista logiikkaa, mukaan lukien yli 80 funktiota sekä matemaattisia ja merkkijono-operaattoreita. 2. Täydellinen tuki kaskadilogiikalle. 3. Nopea - ei ylimääräisiä tietokantakutsuja, tukee yli 1000 kysymyksen kyselyjä. 4. Ei ongelmia logiikan uudelleenlatauksessa, koska se ei vaadi SGQA-koodeja. 5. Syntaksikorostus skaalautuu yli 1000 kysymyksen kyselyihin. 6. Helppo ja nopea käyttää ryhmille, jotka haluavat digitoida olemassa olevia paperikyselyjä. 7. Tukee helposti puolistrukturoituja haastatteluja ja epidemiologisia kyselyjä ilman ohjelmoijaa. |
1. Ei käyttöliittymää yksinkertaisille ehdoille - se käyttää sen sijaan syntaksikorostusta. |
- Suosittelemme käyttämään sitä, mikä sopii tarpeisiisi paremmin.
- Lisätietoja EM:n ominaisuuksista saat napsauttamalla seuraavaa linkkiä.
Aloittaminen
Paras tapa aloittaa EM:n käyttö on:
- Asenna uusin vakaa versio osoitteesta https://www.limesurvey.org/en/download.
- Tuo ja tutki joitakin esimerkkikyselyjä.
- Tutustu käyttötapauksiin ja ohjeisiin sekä vaiheittaisiin esimerkkeihin.
- Tutustu EM:n dokumentaatioon (tämä sivu)
- Yksittäisten lausekkeiden yksikkötestit (edistyneille)
- näyttää esimerkkejä kaikkien EM:n funktioiden ja operaattorien käytöstä sekä PHP- ja JavaScript-tulokset;
- huomaa, että muutama funktio tuottaa erilaisia tuloksia PHP- ja JavaScript-versioissa, joten tämän sivun avulla voit suunnitella EM-logiikkasi sen mukaisesti.
- Yksittäisten lausekkeiden yksikkötestit (edistyneille)
Terminologia
Näitä sanoja käytetään yleisesti kuvaamaan EM:n ominaisuuksia:
- Relevanssiin perustuva haarautuminen - jos kysymys on relevantti, se esitetään, muuten ei (eli se piilotetaan ja merkitään tietokantaan arvolla NULL). Relevanssi-kentät löytyvät kysymyseditorin paneelista sekä kysymysryhmäeditorin paneelista. Jälkimmäistä käytetään ehtojoukon soveltamiseen koko ryhmään ilman, että samaa ehtoa tarvitsee kopioida jokaiseen kysymykseen, ja/tai ryhmä- ja kysymystason ehdollisen logiikan yhdistämiseen.
- Räätälöinti - Kun tiedät, mitkä kysymykset esitetään, räätälöinti (jota kutsutaan joskus nimellä piping) määrittää, miten kysymys esitetään. Sen avulla voit tukea paitsi yksinkertaista korvaamista (kuten {TOKEN:FIRSTNAME}), myös verbien taivutusta ja substantiivien muotoilua kohteiden sukupuolen tai lukumäärän perusteella. Sen avulla voit myös muuttaa kyselyn vastaajalle esitettävää viestiä sen perusteella, vastasiko hän muihin kysymyksiin (tai miten hän vastasi).
- Yhtälöt - EM lisää uuden kysymystyypin nimeltä Yhtälö, joka tallentaa lausekkeen tuloksen. Yhtälöiden tulokset lasketaan ja kirjoitetaan tietokantaan, vaikka piilottaisit ne sivulta. Siksi niitä käytetään piilotettuihin pisteytyslaskelmiin, monimutkaisiin yhtälöihin perustuvaan navigointiin, arviointeihin ja raportteihin, jotka luodaan ja tallennetaan tietokantaan.
Relevanssi ja kaskadirelevanssi
Jokaisella kysymystyypillä on nyt Relevanssi-asetus, joka määrittää, näytetäänkö kysymys vai ei. EM käsittelee jokaisen relevanssiyhtälön siinä järjestyksessä kuin ne esiintyvät kyselyssä. Jos lauseke on tosi (tai puuttuu - vanhojen kyselyjen tukemiseksi), kysymys näytetään. Jos se ei ole relevantti, kysymys piilotetaan ja arvo asetetaan tietokannassa arvoon NULL. Jos ryhmässä ei ole yhtään relevanttia kysymystä, koko ryhmä ohitetaan.
Lisäksi, jos jokin lausekkeen muuttujista ei ole relevantti, lauseke saa aina arvon epätosi. Tämä mahdollistaa kaskadirelevanssin, jolloin sinun ei tarvitse kirjoittaa erittäin pitkiä relevanssiyhtälöitä jokaiselle kysymykselle.
Oletetaan, että sinulla on viisi kysymystä Q1-Q5 ja haluat näyttää Q2:n vain, jos Q1:een on vastattu, Q3:n vain, jos Q2:een on vastattu, ja niin edelleen. Relevanssiyhtälöt voisivat olla seuraavat:
| Kysymyskoodi | Relevanssi | Kysymys |
|---|---|---|
| Q1 | 1 | Mikä on nimesi? |
| Q2 | Q1 | {Q1}, kuinka vanha olet? |
| Q3 | Q2 | Olet siis {Q2} vuotta vanha. Oletko naimisissa? |
| Q4 | Q3 == "Y" | {Q1}, kuinka kauan olet ollut naimisissa? |
| Q5 | Q4 | Kuinka monta lasta sinulla on, {Q1}? |
Ryhmätason relevanssi
ExpressionScript tukee myös ryhmätason relevanssia. Tämä helpottaa silmukoiden toteuttamista. Oletetaan, että haluat kerätä tietoja enintään 10 kohteesta (kuten tuotteista tai kotitalouden henkilöistä), jolloin selvität ensin, kuinka monesta kohteesta tarvitaan jatkokysymyksiä (esimerkiksi kysymällä, kuinka monta henkilöä kotitaloudessa asuu, tai pyytämällä vastaajia valitsemaan pitkästä listasta tuotteet, joista he pitävät). Kun tiedät, kuinka monesta kohteesta tarvitaan jatkokysymyksiä, voit käyttää ryhmätason relevanssia, kuten {count >= 1}, {count >=2}, ... {count >= 10}, kullekin jatkokysymysten 10 ryhmästä. Kunkin ryhmän sisällä voit käyttää kysymystason ehdollista logiikkaa (esim. sukupuoleen tai ikään perustuvia jatkokysymyksiä kullekin kohteelle). Kysymys- ja ryhmätason relevanssiyhtälöt yhdistetään JA-operaatiolla sen määrittämiseksi, mitkä näytetään.
Voit tutustua tällaiseen esimerkkiin tuomalla seuraavan kyselyn: Väestölaskentakyselyn esimerkki.
Alla olevasta kuvakaappauksesta nähdään, että ryhmä Person 1 näytetään (eli on relevantti), jos vastaaja asuu vähintään yhden toisen asukkaan kanssa:

Räätälöinti/Piping
Kaikki aaltosulkeiden sisällä oleva käsitellään nyt lausekkeena (yhtä jäljempänä kuvattua poikkeusta lukuun ottamatta). Lausekkeilla on pääsy kaikkiin LimeReplacementFields-kenttiin ja muuttujiin (useiden aliasten kautta), kaikkiin tyypillisiin yhtälöoperaattoreihin (matemaattisiin, loogisiin ja vertailuoperaattoreihin) sekä kymmeniin funktioihin (jotka toimivat dynaamisesti jopa asiakaspuolella).
Näiden yhtälöiden avulla voit esimerkiksi:
- Näyttää vastaajille ehdollisesti räätälöityjä viestejä aiempien vastausten perusteella;
- Luoda arvioita ja näyttää arvioiden tuloksia (tai haarauttaa kyselyä tai näyttää viestejä ehdollisesti niiden perusteella) ilman, että käytät itse arviointimoduulia;
- Taivuttaa verbejä ja substantiiveja kysymyksissä, vastauksissa ja raporteissa;
- Näyttää yhteenvetoja vastauksista ennen kyselyn lopussa olevaa "Näytä vastauksesi" -sivua.
Yhtälöt
Uusi kysymystyyppi on nimeltään Yhtälö. Ajattele sitä Tekstin näyttö -kysymystyyppinä, paitsi että se tallentaa näytetyn arvon tietokantaan. Jos siis Yhtälö-kysymyksen kysymysteksti sisältää arviointilaskennan, kyseinen arvo tallennetaan tietokantaan muuttujaan, joka voidaan näyttää julkisissa tai yksityisissä tilastoissa.
Syntaksi
Kaikki aaltosulkeiden sisällä oleva katsotaan nyt lausekkeeksi (yhtä poikkeusta lukuun ottamatta: alussa tai lopussa ei saa olla tyhjiä merkkejä - tämä varmistaa, ettei ExpressionScript yritä käsitellä upotettua JavaScriptiä).
Huomaa, että lausekkeet voivat jatkua usealle riville, kunhan avaavan aaltosulkeen jälkeen tai sulkevan aaltosulkeen edessä ei ole tyhjiä merkkejä. Tämä on erityisen hyödyllistä sisäkkäisissä "if()"-lauseissa, kuten tässä:
{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 tukee seuraavaa syntaksia:
- Kaikki tavalliset matemaattiset operaattorit (esim. +,-,*,/,!);
- Kaikki tavalliset vertailuoperaattorit (esim. <,<=,==,!=,>,>=, sekä niiden vastineet: lt, le, eq, ne, gt, ge);
- Sulkeet (joiden avulla voit ryhmitellä osalausekkeita);
- Ehdolliset operaattorit (esim. &&,| | ja niiden vastineet: and, or);
- Yksin- ja kaksoislainausmerkeillä ympäröidyt merkkijonot (joihin voi kumpaankin upottaa toisen lainaustyypin merkkijonoja);
- Pilkkuoperaattori (jolloin voit antaa lausekkeiden luettelon ja palauttaa vain viimeisen tuloksen);
- Sijoitusoperaattori (=);
- Ennalta määritetyt muuttujat (viittaamaan kysymyksiin, kysymysattribuutteihin ja vastauksiin) - esim. SGQA-koodit;
- Ennalta määritetyt funktiot (niitä on jo yli 80, ja lisää on helppo lisätä).
Operaattorit
EM-syntaksi noudattaa tavallista operaattorien suoritusjärjestystä:
| Taso | Operaattorit | Kuvaus |
|---|---|---|
| 1 | () | sulkeet ryhmittelyyn tai funktioiden kutsumiseen |
| 2 | ! - + | unaariset operaattorit: ei, negaatio, unaarinen plus |
| 3 | * / | kerto- ja jakolasku |
| 4 | + - | yhteen- ja vähennyslasku |
| 5 | < <= > >= lt le gt ge | suuruusvertailut |
| 6 | == != eq ne | yhtäsuuruusvertailut |
| 7 | and | looginen JA |
| 8 | or | looginen TAI |
| 9 | = | sijoitusoperaattori |
| 10 | , | pilkkuoperaattori |
Varoitus numeron ja merkkijonon sekoittumisesta sekä aakkosellisesta/numeerisesta vertailusta
Kun vertaat arvoja suuruus- tai yhtäsuuruusvertailuilla, kiinnitä huomiota epäsopivuuksiin. Käyttäjän syöttämää arvoa (tai vastauskoodin kautta annettua arvoa) voidaan käyttää lukuna, jos se on selvästi luku.
Jos ympäröit jonkin arvon merkillä ", suoritetaan teksti-/merkkijonovertailu. Jos haluat verrata lukuna, älä koskaan ympäröi lukua merkillä ".
Esimerkiksi Q0.NAOK > "50" on tosi, jos Q0.NAOK on numeerinen kysymys, jonka arvo on 9. Tämä johtuu siitä, että operaattori > olettaa vertailun aakkoselliseksi eikä numeeriseksi.
Varmistaaksesi, että vertaat kokonaislukuarvoja, voit käyttää lauseketta intval(Q0.NAOK) > 50. Muista, että jos Q0.NAOK ei ole luku (tyhjä tai merkkijono), intval(Q0.NAOK) === 0. Merkkijonoarvojen vertailuun ("A" < "B") käytä suoraan funktiota strcmp: strcmp(Q0.NAOK,"B") tai strcmp(Q0.NAOK,"A5").
Varoitus sijoitusoperaattorin (=) käytöstä
Sinun tulisi välttää sijoitusoperaattoreiden käyttöä, ellei se ole ehdottoman välttämätöntä, koska ne voivat aiheuttaa odottamattomia sivuvaikutuksia. Jos esimerkiksi muutat aiemman vastauksen arvoa, kyseisen kysymyksen ja nykyisen kysymyksen välistä porrastettua relevanssi- ja validointilogiikkaa ei lasketa uudelleen, joten tiedot voivat muuttua sisäisesti ristiriitaisiksi (esim. kysymykset, jotka pysyvät vastattuina mutta olisi pitänyt tyhjentää NULL-arvoon, tai kysymykset, jotka ohitetaan mutta joihin olisi pitänyt vastata). Yleensä, jos haluat sijoittaa arvon muuttujaan, kannattaa luoda Yhtälö-kysymystyyppi ja asettaa sen arvo lausekkeella. On kuitenkin harvoja tilanteita, joissa tätä operaattoria todella tarvitaan, joten teimme sen saataville.
Varoittaaksemme tästä operaattorista se näytetään punaisella fontilla syntaksiyhtälöissä (jotta et sekoita sitä operaattoriin "==").
Sijoitusoperaattorin käyttö
Tärkeimmät syyt sijoitusoperaattorin käyttöön ovat:
- Sinun täytyy asettaa oletusarvo yhtälöllä kysymykselle, joka ei hyväksy oletusarvoja (kuten lista (radiopainikkeet), jossa käyttöliittymä antaa valita yhden vastausvaihtoehdoista mutta ei salli yhtälön syöttämistä). Ole kuitenkin varovainen, sillä LimeSurvey ei voi validoida, että yhtälösi tuottaa jonkin kyseisen kysymyksen sallituista vastauksista;
- Sinun täytyy pakottaa aiemman kysymyksen vastaus muuttumaan myöhemmän vastauksen perusteella;
- jne...
Voit käyttää tähän tarkoitukseen koko lausekehallintajärjestelmää. On parempi käyttää tähän Yhtälö-kysymystyyppiä.
Joitakin esimerkkejä:
- Aseta lyhyen tekstin kysymyksen vastaus pienillä kirjaimilla :
{QCODE=strtolower(QCODE.NAOK)}; - Aseta taulukkokysymystyypin oletusvastaus kyselyn alussa :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Aseta tekstitaulukkokysymystyypin oletusvastaus kyselyn alussa :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Aseta vastaus ehdolla :
{QCODE=if(YesNo="Y","A1","")}.
XSS-suojaus
Kun XSS on käytössä, joitakin lausekehallinnan osia ei voi käyttää:
- HTML-tagin aloittaminen lausekkeessa mutta sen päättäminen toisessa lausekkeessa;
- monimutkaisen lausekkeen käyttö URL-osoitteessa.
Esimerkkejä ja kiertotapoja:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}ei toimi XSS-suojauksen kanssa. Voit käyttää sen sijaan seuraavaa:{if(1,"<strong>information</strong>","information")};<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, tässä voit käyttää yhtälökysymystä, koska kokonaisen kysymyskoodin käyttö on sallittua:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Muuttujien käyttö
ExpressionScript tarjoaa vain luku -oikeuden mihin tahansa tarvitsemaasi muuttujaan. Taaksepäin yhteensopivuuden vuoksi se tarjoaa pääsyn seuraaviin:
- TOKEN:xxx - TOKENin arvo (esim. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (vain kyselyille, jotka eivät ole anonyymejä).
- Kaikki teemojen käyttämät {XXX}-arvot.
- Kysymystekstissä voit käyttää {QID}-tunnistetta, joka korvataan kysymyksen tunnisteella, ja {SGQ}-tunnistetta, joka korvataan kysymyksen SGQA-tunnisteella.
- {SAVEDID} nykyisen vastauksen tunnisteelle
Lisäksi ExpressionScriptin avulla voit viitata muuttujiin kysymyskoodin avulla (tietokannan kysymystaulun 'title'-sarake). Tämä on myös muuttujan nimi, jota käytetään, kun viet tietosi SPSS-, R- tai SAS-ohjelmaan. Jos esimerkiksi kysyt nimeä, ikää ja sukupuolta, voit kutsua näitä muuttujia nimillä name, age ja gender nimien 12345X13X22, 12345X13X23 ja 12345X13X24 sijaan. Tämä tekee yhtälöistä helpommin luettavia ja logiikasta helpommin tarkistettavaa. Lisäksi kysymysten järjestystä voi muuttaa ilman, että ryhmien tai kysymysten numeroita tarvitsee seurata.
Tärkeää: On turvallisempaa viitata muuttujiin, jotka esiintyvät edellisillä sivuilla tai edellisissä kysymyksissä.
Lisäksi ExpressionScriptin avulla voit käyttää monia kysymyksen ominaisuuksia:
| Syntaksi | Merkitys | Esimerkki | Esimerkin tulos |
|---|---|---|---|
| Qcode | Qcode.code-muuttujan alias | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | kysymyksen valittu vastauskoodi, jos kysymys on relevantti (muuten tyhjä), tai tekstiarvo, jos kysymys ei ole koodattu | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | sama kuin Qcode - katso NAOK:n kuvaus | {gender.NAOK} | 'M' |
| Qcode.value | kysymyksen arviointiarvo, jos kysymys on relevantti (muuten tyhjä), tai tekstiarvo, jos kysymys ei ole koodattu | {gender.value} | '1' |
| Qcode.valueNAOK | sama kuin Qcode.value - katso NAOK:n kuvaus | {gender.valueNAOK} | '1' |
| Qcode.shown | kysymyksen näytettävä arvo | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | kysymyksen teksti | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | onko kysymys pakollinen (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | kysymyksen sisäinen tunnusnumero (ei järjestysnumero) | {gender.qid} | 337 |
| Qcode.type | kysymyksen tyyppi | {gender.type} | 'G' |
| Qcode.jsName | kysymyksen oikea javascript-nimi riippumatta siitä, onko se määritelty tällä sivulla vai ei | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | ryhmän sisäinen tunnusnumero (ei järjestysnumero) | {gender.gid} | 3 |
| Qcode.qseq | kysymyksen järjestysnumero alkaen nollasta | {gender.qseq} | 5 |
| Qcode.gseq | ryhmän järjestysnumero alkaen nollasta | {gender.gseq} | 1 |
| Qcode.relevanceStatus | onko kysymys tällä hetkellä relevantti (0 tai 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | kysymystason relevanssiyhtälö | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | ryhmätason relevanssiyhtälö | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | kysymyksen SGQA-arvo | {gender.sgqa} | '1827X3X337' |
HTML-editorin ongelma
Jos käytät HTML-editoria, jotkin merkit korvataan HTML-entiteeteillä.
- & merkillä &
- < merkillä <
- > merkillä >
Jos käytät HTML-editoria, sinun on käytettävä seuraavia:
- and merkin & sijaan
- lt merkin < sijaan
- le merkin <= sijaan
- gt merkin > sijaan
- ge merkin >= sijaan
On suositeltavaa poistaa lausekkeen sisältä kaikki HTML-koodi. Jos käytät LimeSurveyn HTML editoria, napsauta "Source"-painiketta (editorin vasemmassa yläkulmassa) ja poista kaikki merkit, jotka eivät liity lausekkeeseesi (esim.
,
jne.).
Qcode-muuttujien nimeäminen
Seuraavassa kerrotaan, miten Qcode muodostetaan (ja miten joihinkin ominaisuuksiin päästään käsiksi) kysymystyypeittäin. Yleisesti Qcode muodostetaan seuraavasti:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
Kommentti ja muu -vaihtoehdoille vastaavat kysymyskoodit ovat QuestionCode_comment ja QuestionCode_other.
| Tyyppi | Kuvaus | Koodi | Alikysymykset | Vastausvaihtoehdot | Asteikot | Vastauskoodi | Näytetty vastaus | Relevanssi |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 pisteen valinta, valintanapit | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Taulukko (10 pisteen valinta), valintanapit | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Taulukko (5 pisteen valinta), valintanapit | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Taulukko (joustavat nimikkeet), kaksoisasteikko | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Taulukko (joustava) - sarakemuoto | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Taulukko (joustava) - rivimuoto | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Taulukko (Kasvata/Sama/Pienennä), valintanapit | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Taulukko (useita joustavia) 1–10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Taulukko (useita joustavia), teksti | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Taulukko (Kyllä/epävarma/ei), valintanapit | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Vakioteksti-kysymys | Q11 | {Q11.shown} | |||||
| D | Päivämäärä | Q12 | {Q12} | {Q12.shown} | ||||
| * | Yhtälö | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Tiedoston lähetys (tallentaa lähetettyjen tiedostojen määrän) | Q14 | {Q14} | {Q14>0} | ||||
| G | Sukupuoli, pudotusvalikko | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Hyvin pitkä vapaateksti | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Kielikysymys | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Lista - pudotusvalikko | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Lista, pudotusvalikko/valintanapit | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Lista kommentilla, pudotusvalikko/valintanapit + tekstialue | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Pitkä vapaateksti | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Monivalinta, valintalaatikot | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Monivalinta kommenteilla, valintalaatikko + teksti | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Useita numeerisia kysymyksiä | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Useita lyhyitä tekstikenttiä | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Numeerinen kysymystyyppi | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Sijoitus | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Lyhyt vapaateksti | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Kyllä/Ei, valintanapit | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
NAOK:n käyttö
NAOK --> "Not Applicable" (NA) is alright (OK), eli "ei sovellettavissa" on sallittu
NAOK:n käyttö tarkoittaa, että kaikki muuttujat tai osa niistä voi olla ei-relevantteja (esim. "Not Applicable" (NA) is alright (OK)).
Esimerkiksi: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) palauttaa aina tyhjän merkkijonon, jos yksi kysymyksen Q1 alikysymyksistä on suodatettu pois. Valittujen alikysymysten määrän laskemiseen tällaisessa kysymyksessä voi käyttää lauseketta count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Jos alikysymys on piilotettu, EM palauttaa tyhjän merkkijonon.
Ilman NAOK:ta, jos yksi kysymys tai alikysymys on piilotettu, EM palauttaa aina tyhjän merkkijonon (sama kuin false-arvon palauttaminen).
Pääte .shown käyttää aina NAOK-järjestelmää (tyhjä merkkijono, jos piilotettu). Jos kuitenkin tarvitset vastauksen koodin, on aina hyvä idea lisätä .NAOK kysymyskoodin perään (paitsi jos tarvitset toisenlaista toimintaa ja tiedät, mitä teet).
Lisätietoja on Porrastettujen ehtojen ohittaminen -osiossa.
Varatut muuttujat "this", "self" ja "that"
Usein haluat arvioida kaikki kysymyksen osat, esimerkiksi laskea, kuinka monta alikysymystä on vastattu, tai summata pisteet. Toisinaan haluat käsitellä vain tiettyjä kysymyksen rivejä tai sarakkeita (esimerkiksi laskea rivi- tai sarakesummat ja tallentaa ne tietokantaan). Nämä varatut muuttujat tekevät tästä suhteellisen vaivatonta.
"This"-muuttuja
"this"-muuttujaa käytetään yksinomaan asetuksissa "Koko kysymyksen validointiyhtälö" ja "Alikysymyksen validoinnin kaava" (jälkimmäinen ei ole mahdollinen graafisesta käyttöliittymästä). Se laajenee kaikkien kyseisten kysymysten solujen muuttujien nimiksi. Jos siis haluat varmistaa, että jokainen arvo on suurempi kuin kolme, asetat kohtaan "Alikysymyksen validoinnin kaava" arvon (this > 3).
"Self"-muuttuja
"self"- ja "that"-muuttujat ovat tehokkaampia ja toimivat makroina, jotka laajennetaan ennen yhtälöiden käsittelyä. "Self"-muuttujan syntaksivaihtoehdot ovat:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- suffix on mikä tahansa tavallisista qcode-jälkiliitteistä (esim. NAOK, value, shown)
- sub-selector voi olla jokin seuraavista:
- comments - vain ne alikysymykset, jotka ovat kommentteja (esim. monivalinta kommenteilla ja lista kommentilla);
- nocomments - vain ne alikysymykset, jotka eivät ole kommentteja;
- sq_X - jossa X on rivin tai sarakkeen tunniste. Valitaan vain alikysymykset, jotka vastaavat kaavaa X. Huomaa, että haku tehdään koko koodin tunnisteesta, joten sq_X vastaa ja sisältää alikysymykset nX, X ja Xn (esim. jos käytät sq_1, mukaan otetaan alikysymykset a1, 1a, 1, 11 tai 001). Kiinnitä huomiota kaksoisasteikkoiseen kysymystyyppiin, jossa alikysymysten koodit ovat QCODE_SQCODE_1 ja QCODE_SQCODE_1, sekä sijoituskysymystyyppiin, jossa alikysymysten koodit ovat QCODE_1, QCODE_2 ....
Esimerkkejä:
- Onko kysymykseen vastattu miltään osin? -> {count(self.NAOK)>0}
- Mikä on tämän kysymyksen arviointipistemäärä? -> {sum(self.value)}
Näillä voi myös laskea rivi- ja sarakesummia. Oletetaan, että sinulla on lukujen taulukko, jossa on rivit A–E ja sarakkeet 1–5.
- Mikä on kokonaissumma? -> {sum(self.NAOK)}
- Mikä on rivin B summa? -> {sum(self.sq_B.NAOK)}
- Mikä on sarakkeen 3 summa? -> {sum(self.sq_3.NAOK)}
Muuttuja "that"
Muuttuja "that" on kuin muuttuja "self", mutta sen avulla voit viitata muihin kysymyksiin. Sen syntaksi on:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname on kysymyksen nimi ilman alikysymyspäätteitä. Luodaan siis kysymys 'q1', jossa 'q' edustaa myös sen qname-nimeä.
Esimerkkejä:
- Onko kysymykseen q1 vastattu miltään osin? -> {count(that.q1.NAOK)>0}
- Mikä on kysymyksen q2 arviointipistemäärä? -> {sum(that.q2.NAOK)}
- Mikä on kysymyksen q3 kokonaissumma? -> {sum(that.q3.NAOK)}
- Mikä on kysymyksen q4 rivin C summa? -> {sum(that.q4.sq_C.NAOK)}
- Mikä on kysymyksen q4 sarakkeen 2 summa? -> {sum(that.q4.sq_2.NAOK)}
Muuttujia "self" ja "that" voi käyttää missä tahansa relevanssi-, validointi- tai räätälöintilausekkeessa.
Yksi huomioitava seikka on, että kun käytät Show logic file -toimintoa, se näyttää muuttujien "self" ja "that" laajennetun arvon. Näin näet varsinaisen muodostettavan yhtälön, jolloin sinä (ja EM) voitte tarkistaa, onko muuttujia olemassa. Tämä voi tuntua sekavalta, koska yhtälöt voivat olla melko pitkiä. Jos kuitenkin muokkaat kysymystä, näet alkuperäisen yhtälön, jossa käytetään muuttujia "self" ja/tai "that".
- haluat nimetä yhtälössä käytettävät muuttujat yksitellen, tai
- käytät muuttujia, joilla ei ole alikysymyksiä (esim. yksittäisen vastauksen kysymykset). Näissä tapauksissa muuttujan etuliitteeksi lisättävä "that" on liioittelua, ja saatat saada odottamattomia tuloksia.
Funktioiden käyttö
ExpressionScript tarjoaa käyttöösi matemaattisia funktioita, merkkijonofunktioita ja käyttäjän määrittelemiä funktioita, kuten alla on esitetty. Näille funktioille on PHP- ja JavaScript-vastineet, joten ne toimivat samalla tavalla palvelinpuolella (PHP) ja asiakaspuolella (JavaScript). Uusien funktioiden lisääminen on helppoa.
Toteutetut funktiot
Seuraavat funktiot ovat tällä hetkellä käytettävissä:
| Funktio | Merkitys | Syntaksi |
|---|---|---|
| abs | Absoluuttinen arvo | number abs(number) |
| acos | Arkuskosini | number acos(number) |
| addslashes | Lisää merkkijonoon kenoviivat lainausta varten | string addslashes(string) |
| asin | Arkussini | number asin(number) |
| atan | Arkustangentti | number atan(number) |
| atan2 | Arc tangent kahdesta muuttujasta | number atan2(number, number) |
| ceil | Pyöristä ylöspäin | number ceil(number) |
| checkdate | Palauttaa true(1), jos kyseessä on kelvollinen päivämäärä gregoriaanisessa kalenterissa | bool checkdate(month,day,year) |
| convert_value | Muuntaa numeerisen arvon numeeristen arvojen lähtötaulukon (inputTable) ja kohdetaulukon (outputTable) avulla | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Kosini | number cos(number) |
| count | Laskee listan vastattujen (ei-tyhjien) kysymysten määrän | number count(arg1, arg12, ..., argN) |
| countif | Laskee listan vastattujen kysymysten määrän, jotka vastaavat ensimmäistä argumenttia | number countif(matches, arg1, arg2, ... argN) |
| countifop | Laskee listan vastattujen kysymysten määrän, jotka täyttävät ehdon (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Paikallisen päivämäärän/ajan muotoilu | string date(format [, timestamp=time()]) |
| exp | Laskee e:n eksponentin | number exp(number) |
| fixnum | Näyttää numerot desimaalierottimena pilkku tarvittaessa | string fixnum(number) |
| floor | Pyöristä alaspäin | number floor(number) |
| gmdate | Muoto GMT päivämäärä/aika | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Muuntaa kaikki HTML-entiteetit vastaaviksi merkeiksi (käyttää aina ENT_QUOTES ja UTF-8) | string html_entity_decode(string) |
| htmlentities | Muuntaa kaikki soveltuvat merkit HTML-entiteeteiksi (käyttää aina ENT_QUOTES ja UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Muuntaa erikoismerkit HTML-entiteeteiksi (käyttää aina ENT_QUOTES ja UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Muuntaa HTML-erikoisentiteetit takaisin merkeiksi (käyttää aina ENT_QUOTES ja UTF-8) | string htmlspecialchars_decode(string) |
| idate | Muotoile paikallinen aika/päivä kokonaislukuna | string idate(string [, timestamp=time()]) |
| if | Excel-tyylinen if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | Liitä taulukkoelementit merkkijonolla | string implode(glue,arg1,arg2,...,argN) |
| intval | Hanki muuttujan kokonaislukuarvo | int intval(number [, base=10]) |
| is_empty | Selvittää, onko muuttuja tyhjä | bool is_empty(var) |
| is_float | Selvittää, onko muuttujan tyyppi liukuluku | bool is_float(var) |
| is_int | Selvittää, onko muuttujan tyyppi kokonaisluku | bool is_int(var) |
| is_nan | Selivät onko arvo ei-numero | bool is_nan(var) |
| is_null | Selvitä onko muuttuja NULL | bool is_null(var) |
| is_numeric | Selvittää, onko muuttuja luku tai numeerinen merkkijono | bool is_numeric(var) |
| is_string | Selvittää, onko muuttujan tyyppi merkkijono | bool is_string(var) |
| join (New in 2.0 build 130129) | Liittää elementit uudeksi merkkijonoksi | join(arg1, arg2, ... argN) |
| list | Palauttaa pilkuilla erotellun listan ei-tyhjistä arvoista | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Palauttaa 'glue'-merkillä erotellun listan määritetystä kysymyksen ominaisuudesta (retProp) niistä listan kysymyksistä, jotka täyttävät ehdon (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Poistaa tyhjätilan (tai muita merkkejä) merkkijonon alusta | string ltrim(string [, charlist]) |
| max | Etsi suurin arvo | number max(arg1, arg2, ... argN) |
| min | Etsi pienin arvo | number min(arg1, arg2, ... argN) |
| mktime | Hakee päivämäärän UNIX-aikaleiman (kaikki 6 argumenttia ovat valinnaisia) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Modulo-funktiota ei tueta vielä. Voit käyttää sen sijaan floor()-funktiota | floor(x/y)==(x/y) |
| nl2br | Lisää HTML-rivinvaihdot ennen kaikkia merkkijonon rivinvaihtoja | string nl2br(string) |
| number_format | Esitä numero tuhatluvut ryhmiteltynä | string number_format(number) |
| pi | Piin likiarvo | number pi() |
| pow | Eksponentiaalilauseke | number pow(base, exp) |
| quoted_printable_decode | Muuntaa quoted-printable-merkkijonon 8-bittiseksi merkkijonoksi | string quoted_printable_decode(string) |
| quoted_printable_encode | Muuntaa 8-bittisen merkkijonon quoted-printable-merkkijonoksi | string quoted_printable_encode(string) |
| quotemeta | Lainausmerkin metamerkit | string quotemeta(string) |
| rand | Luo satunnainen kokonaisluku, katso tämä esimerkki | int rand() OR int rand(min, max) |
| regexMatch | Vertaa merkkijonoa säännölliseen lausekkeeseen | bool regexMatch(pattern,input) |
| round | Pyöristä valinaisella tarkkuudella | number round(val [, precision]) |
| rtrim | Poistaa tyhjätilan (tai muita merkkejä) merkkijonon lopusta | string rtrim(string [, charlist]) |
| sin | Sini | number sin(arg) |
| sprintf | Palauta muotoiltu merkkijono | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Neliöjuuri | number sqrt(arg) |
| stddev | Laskee lukujen listan otoskeskihajonnan | number stddev(arg1, arg2, ... argN) |
| str_pad | Täyttää merkkijonon tiettyyn pituuteen toisella merkkijonolla | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Toista merkkijono | string str_repeat(input, multiplier) |
| str_replace | Korvaa kaikki hakumerkkijonon esiintymät korvaavalla merkkijonolla | string str_replace(search, replace, subject) |
| strcasecmp | Binääriturvallinen merkkikoosta riippumaton merkkijonojen vertailu | int strcasecmp(str1, str2) |
| strcmp | Binaariturvallinen merkkijonovertailu | int strcmp(str1, str2) |
| strip_tags | Poista HTML- ja PHP-tagit merkkijonosta | string strip_tags(str, allowable_tags) |
| stripos | Etsii ensimmäisen esiintymän sijainnin merkkikokoa erottelemattomasta unicode-merkkijonosta (alkaa nollasta, palauttaa false, jos ei löydy) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Poista lainausmerkein merkitystä merkkijonosta kenoviivat | string stripslashes(string) |
| stristr | Merkkikokoriippumaton strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Hanki merkkijonon pituus | int strlen(string) |
| strpos | Etsii ensimmäisen esiintymän sijainnin unicode-merkkijonosta (alkaa nollasta, palauttaa false, jos ei löydy) | int strpos(haystack, needle [ offset=0]) |
| strrev | Käännä merkkijono | string strrev(string) |
| strstr | Löydä ensimmäinen merkkijonon esiintymä | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Muuntaa merkkijonon pieniksi kirjaimiksi | string strtolower(string) |
| strtotime | Muuntaa lähes minkä tahansa englanninkielisen päivämäärän ja ajan tekstikuvauksen Unix-aikaleimaksi | int strtotime(string) |
| strtoupper | Muuntaa merkkijonon isoiksi kirjaimiksi | string strtoupper(string) |
| substr | Palauttaa osan unicode-merkkijonosta | string substr(string, start [, length]) |
| sum | Laske taulukon arvojen summa | number sum(arg1, arg2, ... argN) |
| sumifop | Laskee yhteen listan vastattujen kysymysten arvot, jotka täyttävät ehdon (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangentti | number tan(arg) |
| time | Palauta tämänhetkinen UNIX aikaleima | number time() |
| trim | Poistaa tyhjätilan (tai muita merkkejä) merkkijonon alusta ja lopusta | string trim(string [, charlist]) |
| ucwords | Muuttaa merkkijonon jokaisen sanan ensimmäisen kirjaimen isoksi | string ucwords(string) |
| unique | Palauttaa 'true', jos kaikki ei-tyhjät vastaukset ovat uniikkeja | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Uusien lausekefunktioiden luominen lisäosalla (New in 4.0.0 )
Jos tarvitset uuden funktion, jota ei ole ytimessä, voit luoda sen lisäosalla. Tällainen uusi funktio luodaan käyttämällä expressionManagerStart-tapahtumaa.
ExpressionScript tietää, mitkä muuttujat ovat paikallisia
JavaScript-koodin muodostamiseksi sivulle oikein EM:n täytyy tietää, mitkä muuttujat on asetettu sivulla ja mikä niiden JavaScript-tunniste on (esim. document.getElementById(x)). Sen täytyy tietää myös, mitkä muuttujat on asetettu muilla sivuilla, jotta se voi varmistaa, että tarvittavat <input type='hidden' value='x'> -kentät ovat olemassa ja täytettyinä.
Ketjutetut ehdot
Jos jokin muuttujista on epärelevantti, koko yhtälö on epärelevantti (false). Esimerkiksi seuraavassa taulukossa N/A tarkoittaa, että jokin muuttujista ei ollut relevantti:
| Operaattori | Esimerkki | a | b | Tulos |
|---|---|---|---|---|
| + (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 |
Ketjutettujen ehtojen ohittaminen
Oletetaan, että haluat näyttää kaikkien relevanttien vastausten juoksevan summan. Voisit yrittää käyttää yhtälöä {sum(q1,q2,q3,...,qN)}. Tämä kuitenkin muunnetaan sisäisesti muotoon LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Jos siis jokin arvoista q1-qN on epärelevantti, yhtälö palauttaa aina false. Tässä tapauksessa sum() näyttää arvon "0", kunnes kaikkiin kysymyksiin on vastattu.
Tämän kiertämiseksi jokaiseen muuttujaan voi lisätä jälkiliitteen ".NAOK" (tarkoittaa, että Not Applicable on OK). Tällöin tapahtuu seuraavaa. Oletetaan, että sinulla on muuttuja q1.NAOK:
- q1:tä ei lisätä LEManyNA()-lausekkeeseen
- LEMval('q1') tarkistaa edelleen, onko vastaus relevantti, ja palauttaa "", jos se ei ole (yksittäiset epärelevantit vastaukset siis ohitetaan, mutta ne eivät mitätöi koko lauseketta).
Juoksevan summan ongelman ratkaisu on siis käyttää yhtälöä sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Jälkiliitteen .NAOK avulla kyselyn laatija voi myös suunnitella kyselyitä, joissa on useita mahdollisia polkuja, jotka yhtyvät myöhemmin yhteisiin polkuihin. Oletetaan esimerkiksi, että vastaajat vastaavat kyselyyn tavalla, joka on tavanomaisen vastausalueen ulkopuolella. Laatija voisi varoittaa vastaajia, etteivät tulokset ehkä ole päteviä, ja kysyä, haluavatko he todella jatkaa kyselyä. Jos he vastaavat "Kyllä", loput kysymykset näytetään. "Loppujen kysymysten" ehto tarkistaisi, vastattiinko alkuvastaukset tavanomaisella alueella TAI vastasiko vastaaja "Kyllä" kysymykseen, joka on relevantti vain, jos hän vastasi tavanomaisen alueen ulkopuolelta.
Miten ExpressionScript tukee ehdollista mikrosovitusta?
Tässä on esimerkki mikrosovituksesta (jossa kysymystyyppi 'expr' tarkoittaa yhtälöä):
| Kysymyskoodi | Relevanssi | Kysymyksen tyyppi | Kysymys |
|---|---|---|---|
| name | 1 | text | Mikä on nimesi? |
| age | 1 | text | Kuinka vanha olet? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Valitettavasti {name}, olet liian {if( (age<16),'nuori',if( (age>80),'vanha','keski-ikäinen') ) } tähän testiin. |
| kids | !badage | yesno | Onko sinulla lapsia? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Kuinka monta lasta sinulla on? |
| kid1 | parents && numKids >= 1 | text | Kuinka vanha ensimmäinen lapsesi on? |
| kid2 | parents && numKids >= 2 | text | Kuinka vanha toinen lapsesi on? |
| kid3 | parents && numKids >= 3 | text | Kuinka vanha kolmas lapsesi on? |
| kid4 | parents && numKids >= 4 | text | Kuinka vanha neljäs lapsesi on? |
| kid5 | parents && numKids >= 5 | text | Kuinka vanha viides lapsesi on? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, kerroit olevasi {age}-vuotias ja että sinulla on {numKids} lasta. Ensimmäisen {min(numKids,5)} lapsesi ikien summa on {sumage} |
Voit ladata yllä olevan kyselyesimerkin napsauttamalla seuraavaa linkkiä: Lasten lukumäärä -kyselyesimerkki.
Kaikki nämä kysymykset voivat olla samalla sivulla (esim. samassa ryhmässä), ja vain relevantit kysymykset näytetään. Lisäksi kun syötät lasten ikiä, viimeisen kysymyksen sum()-lauseke päivittyy dynaamisesti.
ExpressionScript toteuttaa tämän ympäröimällä jokaisen lausekkeen nimetyllä <span>-elementillä. Aina kun arvo muuttuu, se laskee uudelleen lausekkeen, jonka pitää näkyä kyseisessä <span>-elementissä, ja päivittää näkymän. Samalla sivulla voi olla kymmeniä tai jopa satoja tällaisia sovitettuja lausekkeita.
Syntaksin korostus
Lausekkeiden syöttämisen ja tarkistamisen helpottamiseksi EM tarjoaa syntaksin korostuksen seuraavilla ominaisuuksilla:
Syntaksin korostuksen tyypit ja merkitykset
| Väri | Esimerkki | Merkitys | Työkaluvihje | Kommentit |
|---|---|---|---|---|
| ruskeanbeige tausta | Esimerkki | koko yhtälö | ei mitään | Kaikki aaltosulkeiden sisällä oleva, joka tunnistetaan yhtälöksi (esim. alussa tai lopussa ei ole välilyöntejä), väritetään beigellä taustalla, jotta se erottuu ympäröivästä tekstistä |
| lihavoitu punainen teksti | Esimerkki | Virhe | Selitys virheestä | Voi olla tuntematon muuttuja tai virhe funktiossa. Kysely on rikki, eikä kyseiseen lausekkeeseen perustuvia kysymyksiä näytetä vastaajille. |
| sininen teksti | Esimerkki | funktion nimi | merkitys ja sallittu syntaksi | Tarkoittaa funktioiden nimiä tai asioita, joiden pitäisi olla funktioita, koska niitä seuraa alkusulku. Ne näytetään lihavoidulla sinisellä tekstillä. Työkaluvihjeet näyttävät funktion merkityksen ja sallitun syntaksin. |
| harmaa teksti | Esimerkki | merkkijono | ei mitään | Yksittäisillä ja kaksinkertaisilla lainausmerkeillä merkityt merkkijonot näytetään harmaalla tekstillä. |
| syaani teksti | Esimerkki | muuttuja, joka on asetettu samalla sivulla, | [name]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki muuttujat, jotka on asetettu samalla sivulla kuin muokkaamasi kysymys, näytetään syaanilla tekstillä (ne voidaan päivittää JavaScriptillä). Työkaluvihje näyttää sen nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia luetellusta arvojoukosta, näytetään koodien ja näyttöarvojen vastaavuus. |
| vihreä teksti | Esimerkki | muuttuja, joka on asetettu edellisellä sivulla | [name]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki muuttujat, jotka on asetettu edellisellä sivulla, näytetään lihavoidulla vihreällä tekstillä. Työkaluvihje näyttää sen nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia luetellusta arvojoukosta, näytetään koodien ja näyttöarvojen vastaavuus. |
| lihavoitu vaaleanpunainen teksti | Esimerkki | muuttuja, joka on asetettu myöhemmällä sivulla yleensä tyhjä kyselyn alussa, mutta voidaan täyttää hakemiston kautta tai siirryttäessä taaksepäin | [name tai SGQA-koodi]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki muuttujat, jotka on asetettu edellisellä sivulla, näytetään lihavoidulla vaaleanpunaisella tekstillä. Työkaluvihje näyttää sen nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia luetellusta arvojoukosta, näytetään koodien ja näyttöarvojen vastaavuus. |
| lihavoitu beige teksti | Esimerkki | Lime-korvausarvo | arvo | Lime-korvausmerkkijonot (kuten {TOKEN:xxx}, {PRIVACY_MESSAGE}) näytetään lihavoidulla ruskealla tekstillä. |
| punainen teksti | Esimerkki | sijoitusoperaattori (=) | varoitusviesti | Jos käytät sijoitusoperaattoria (=), se näytetään punaisella tekstillä. Tämä auttaa estämään arvojen vahingossa tapahtuvan uudelleenasettamisen, kun tarkoitit tarkistaa, onko a == b, eikä asettaa arvoa a = b. |
| normaali musta teksti | Esimerkki | välimerkit | ei mitään | Kaikki muut lausekkeen sisällä olevat välimerkit näytetään normaalilla mustalla tekstillä. |
| punaiseen laatikkoon merkitty teksti | lihavoitu punainen viiva ympäröi virheen | syntaksivirhe | virheen kuvaus | Kaikki havaitut syntaksivirheet näytetään punaisissa laatikoissa. Työkaluvihje näyttää virheen. Esimerkkejä ovat pariton sulkumerkki, määrittelemättömien funktioiden käyttö, väärän argumenttimäärän välittäminen funktioille, huonosti jäsennellyt lausekkeet (esim. operaattorit puuttuvat muuttujien väliltä), uuden arvon yrittäminen asettaa vain luku -muuttujalle, arvojen yrittäminen asettaa muille kuin muuttujille tai ei tuetun syntaksin käyttö. Huomaa, että syntaksivirheiden tunnistus voi raportoida lausekkeesta vain yhden virheen, vaikka virheitä olisi useita; jos kuitenkin virheitä havaitaan, vähintään yksi virhe näytetään. |
Lisälukemista
ExpressionScript-esimerkkikyselyt
Käyttötapaukset ja ohjeet
Vaiheittaiset esimerkit
Kehittäjän opas