Expression Manager
From LimeSurvey Manual
Pikaopas
Yleiskatsaus
Kyselyjä mukauttaessasi tarvitset yleensä keinon määrittää seuraavat asiat:
- Navigointi/haarautuminen - annetaan vastaajan vastausten muuttaa kysymysten esittämisjärjestystä
- Räätälöinti/putkitus - kysymyksen muotoilu (esimerkiksi viittaaminen aiempiin vastauksiin tai lauseiden taivuttaminen vastaajien lukumäärän tai sukupuolen mukaan) tai mukautettujen raporttien luominen (kuten arviopisteet tai räätälöidyt neuvot).
- Vahvistus - varmistetaan, että vastaukset täyttävät tietyt ehdot, kuten pienimmän ja suurimman arvon tai syötemallin mukaisuuden
Expression Manager (EM) tarjoaa intuitiivisen tavan määrittää logiikka kullekin näistä ominaisuuksista. Lähes mikä tahansa tavallisena matemaattisena yhtälönä kirjoitettava lauseke on kelvollinen lauseke, vaikka kutsuisit funktioita. EM tarjoaa tällä hetkellä käyttöön 80 funktiota, ja sitä voidaan helposti laajentaa useammilla. Sen avulla voit myös käyttää muuttujiasi ihmisen luettavissa olevilla muuttujien nimillä (SGQA-nimien sijaan).
Seuraavissa osioissa esitellään tärkeimmät paikat, joissa Expression Manageria käytetään
Joissakin kyselyissä käytetään "Goto-logiikkaa", jossa esimerkiksi jos vastaat kysymykseen 1 vaihtoehdolla C, siirrytään kysymykseen 5. Tämä lähestymistapa on hyvin rajoittava, koska sitä on vaikea vahvistaa ja se rikkoutuu helposti, kun kysymysten järjestystä pitää muuttaa. EM käyttää totuusarvoista relevanssiyhtälöä määrittämään kaikki ehdot, joilla kysymys voi olla voimassa. Jos kysymys on relevantti, kysymys näytetään, muuten se on ei-sovellettava (Not Applicable) ja tietokantaan tallennetaan arvo NULL. Tämä on samankaltaista kuin mitä voi tehdä Ehdot-editorilla, mutta EM:n avulla voit helposti määrittää paljon monimutkaisempia ja tehokkaampia ehtoja (ja käyttää muuttujan nimeä SGQA-nimeämisen sijaan).
Tämä kuva näyttää yhden tavan tarkastella kyselyn relevanssilogiikkaa. Se laskee painoindeksin. Relevanssiyhtälö näytetään hakasulkeissa heti muuttujan nimen (joka on vihreällä) jälkeen. Muuttujien weight, weight_units, height ja height_units relevanssi on kaikissa 1, eli nämä kysymykset esitetään aina. BMI:n relevanssi on kuitenkin {!is_empty(height) and !is_empty(weight)}, mikä tarkoittaa, että BMI lasketaan vain, jos vastaaja syöttää arvon sekä pituudelle että painolle (näin vältetään nollalla jaon virheen riski). Lisäksi Report-kysymys näytetään vain, jos vastaaja vastaa kaikkiin neljään pääkysymykseen (height, height_units, weight, weight_units).
Relevanssi näkyy ja on muokattavissa seuraavissa paikoissa:
Kysymystason relevanssin tarkastelu / muokkaus
Tämä yhtälö laskee painoindeksin (BMI). Se kysytään vain, jos henkilö on ensin syöttänyt pituutensa ja painonsa.
Tämä on BMI-kysymyksen muokkausnäkymä.
Huomaa, että aaltosulkeita ei käytetä, kun syötät relevanssiyhtälön.
Ryhmätason relevanssin tarkastelu / muokkaus
Tämä on esimerkki väestölaskentakyselystä. Ensimmäisellä sivulla kysytään, kuinka monta ihmistä asuu kanssasi, ja tulos tallennetaan muuttujaan "cohabs". Tämä sivu näytetään vain, jos asuinkumppaneita on useampi kuin yksi (eli se näytetään toiselle kanssasi asuvalle henkilölle), ja lisäksi vain, jos olet määrittänyt, miten ensimmäinen henkilö on sukua sinulle (p1_rel).
Kuten näet, ryhmällä on myös kysymystason relevanssiehtoja, joiden mukaan kukin kysymys tulee näkyviin vasta, kun olet vastannut sitä edeltävään kysymykseen (esim. {!is_empty(p1_sex)}). EM yhdistää ryhmä- ja kysymystason relevanssin puolestasi. Ryhmän kysymykset esitetään vain, jos ryhmä kokonaisuutena on relevantti. Sen jälkeen esitetään vain ne ryhmän kysymykset, jotka ovat relevantteja.
Tässä on näkymä, jossa muokataan kyseisen kysymyksen ryhmätason relevanssia:
Huomaa, että aaltosulkeita ei käytetä, kun syötät relevanssiyhtälön.
Räätälöinti/putkitus
EM:n avulla voit helposti räätälöidä kysymyksiäsi ehdollisesti sekä yksinkertaisilla että monimutkaisilla tavoilla. Joskus tarvitset vain yksinkertaisen korvauksen, kuten "Sanoit ostaneesi [tuote]. Mistä pidit siinä eniten?". Joskus tarvitset ehdollisen korvauksen, kuten "[Herra/Rouva] [Sukunimi], olisitteko valmis täyttämään kyselymme?". Tässä tapauksessa haluat käyttää sanaa Herra tai Rouva henkilön sukupuolen mukaan. Toisinaan tarvitset vielä monimutkaisemman korvauksen (esimerkiksi matemaattiseen laskentaan perustuvan). EM tukee kaikkia näitä räätälöinnin/putkituksen tyyppejä.
Ehdolliset yhtälöt
Painoindeksiesimerkki osoittaa, että henkilön BMI voidaan laskea, vaikka hän syöttäisi pituutensa ja painonsa metrisinä tai ei-metrisinä yksiköinä.
Tässä weight_kg on {if(weight_units == 'kg', weight, weight * .453592)}. Tämä if()-funktio tarkoittaa, että jos vastaaja ilmoitti painon kiloina, käytetään kyseistä arvoa. Muussa tapauksessa syötetty arvo (joka oli paunoina) kerrotaan luvulla .453592, jolloin se muunnetaan kiloiksi. Muuttuja height_m käyttää samanlaista tapaa laskeakseen henkilön pituuden metreinä, vaikka hän olisi syöttänyt pituutensa tuumina.
BMI laskee painoindeksin kaavalla {weight_kg / (height_m * height_m)}.
Lopuksi raportti mukauttaa vastaajalle näytettävän viestin ehdollisesti ja kertoo hänelle, mitä hän syötti. ("Kerroit olevasi 2 metriä pitkä ja painavasi 70 kg.")
Vaikka se ei näy hyvin yllä olevassa kuvassa, weight_status käyttää sisäkkäisiä if()-lausekkeita luokitellakseen henkilön alipainoisesta vaikeasti lihavaan. Voit nähdä sen yhtälön Näytä logiikka -näkymässä.
Tämän kysymyksen muokkausikkunasta näet kaksi asiaa:
- Mukauttamisessa ilmaukset on ympäröitävä aaltosulkeilla
- Ilmaukset voivat jatkua usealle riville, jos haluat, kuten tässä tapauksessa, helpottaa sisäkkäisen ehtologiikan lukemista.
Mukautetut kysymykset, vastaukset ja raportit
Tämä esimerkki näyttää BMI-raportin.
Tässä on saman kysymyksen muokkausikkuna.
Kuten näet, kaikki aaltosulkeissa oleva käsitellään ilmauksena, joten se on syntaksikorostettu (värikoodattu) edellisessä kuvassa. Jos sinulla on kirjoitusvirheitä (kuten väärin kirjoitettuja tai määrittelemättömiä muuttujien tai funktioiden nimiä), EM näyttää virheen, kuten tässä, jossa height_unit on määrittelemätön muuttuja (oikea nimi on height_units) ja rnd() on määrittelemätön funktio (oikea funktion nimi on round()). Kummassakin tapauksessa virheet on ympäröity punaisella laatikolla, jotta ne on helpompi havaita ja korjata.
Näet myös, että voit luoda nopeasti monimutkaisia raportteja, kuten taulukon syötetyistä arvoista tai räätälöityjä neuvoja.
Muista, että kaikessa mukauttamisessa ilmaukset on ympäröitävä aaltosulkeilla, jotta LimeSurvey tietää, mitkä kysymyksen osat ovat vapaata tekstiä ja mitkä käsitellään Expression Managerin kautta.
Validointi
EM ohjaa useimpien kysymysten lisäasetusten toimintaa. Niillä hallitaan esimerkiksi vastausten vähimmäis- ja enimmäismääriä, yksittäisten arvojen vähimmäis- ja enimmäisarvoja, summien vähimmäis- ja enimmäisarvoja sekä sitä, vastaavatko syötetyt arvot määritettyjä merkkijonomalleja. Syötät nämä kysymysten lisäasetukset edelleen tavalliseen tapaan. Nyt kuitenkin mikä tahansa kyseisissä kentissä oleva arvo käsitellään ilmauksena, joten voit määrittää vähimmäis- ja enimmäisehtoja, jotka riippuvat monimutkaisesti muista kysymyksistä.
Kaikissa näissä tapauksissa kysymyksen lisäasetus käsitellään aina ilmauksena, joten et käytä aaltosulkeita sitä määrittäessäsi.
Esimerkkikyselyt-sivuilla on useita toimivia esimerkkejä ilmausten käytöstä validoinnissa.
Johdanto
LimeSurvey käyttää uutta Expression Manager (EM) -moduulia, jonka ansiosta LimeSurvey tukee monimutkaisempaa haarautumista, arviointeja, validointia ja mukauttamista. Se korvaa tavan, jolla LimeSurvey hallitsee korvauksia, ehtoja ja arviointeja taustajärjestelmässä. Se myös nopeuttaa käsittelyä huomattavasti, koska se poistaa useimmat ajonaikaiset tietokantalukemiset. EM:n kehitti tohtori Thomas White (TMSWhite).
Tämä wiki-sivu on ensisijainen viite Expression Managerin syntaksille ja toiminnoille.
Keskeiset määritelmät
- Ilmaus: Mikä tahansa aaltosulkeiden ympäröimä sisältö
- Kunhan heti avaavan aaltosulun jälkeen tai sulkevan aaltosulun edellä ei ole tyhjää merkkiä
- EM arvioi ilmausten sisällön, joten ne voivat sisältää matemaattisia kaavoja, funktioita sekä monimutkaista merkkijono- ja päivämääräkäsittelyä.
- Mukauttaminen: Joskus kutsutaan nimellä "piping". Tämä on tekstin ehdollisen muokkaamisen prosessi
- Sinulla on käytössäsi 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 määritetty, kysymys näytetään vain, jos relevanssi on tosi.
- Sisäisesti kaikki array_filter- ja array_filter_exclude-komennot muuttuvat alikysymystason relevanssiksi
- Yhtälö-kysymystyyppi: Uusi kysymystyyppi, joka tallentaa laskelmia tai raportteja tietokantaan
- Se on kuin Boilerplate-kysymys, mutta sen sisältö tallennetaan tietokantaan, vaikka asettaisit asetuksen "Piilota kysymys aina"
- Kysymyskoodi: Tämä on EM:n ensisijainen muuttujan nimi
- Se voi olla kuvaava nimi, joka ilmaisee kysymyksen tarkoituksen, mikä helpottaa monimutkaisen logiikan lukemista
- Kelvolliset kysymyskoodit eivät saa alkaa numerolla, joten numeroidessasi kysymyksiä kysymyskoodilla käytä esimerkiksi muotoa "q1", "q1a" tai "g1q2".
- Tästä tulee tällä hetkellä muuttujan nimi, kun viet tietoja SPSS:ään tai R:ään, joten jos teet tilastollista analyysia, olet todennäköisesti jo tehnyt siitä yksilöllisen.
Onko minun käytettävä EM:ää?
Lyhyt vastaus on ei (mutta myös kyllä).
EM on täysin taaksepäin yhteensopiva olemassa olevien kyselyjen kanssa. Jos siis haluat käyttää ehtoja ja arviointeja samaan tapaan kuin LimeSurveyn versioissa <= 1.91+, voit jatkaa niiden käyttöä.
EM kuitenkin korvaa kokonaan tavan, jolla LimeSurvey käsittelee ehtoja sisäisesti. Vaikka voit edelleen käyttää ehtoeditoria ehtojen luomiseen ja hallintaan, LimeSurvey 1.92 muuntaa ne vastaaviksi relevanssiyhtälöiksi. Päivityksen yhteydessä LimeSurvey 1.92 muuntaa automaattisesti kaikki olemassa olevat ehdot relevanssiyhtälöiksi.
Näin saat molempien maailmojen parhaat puolet: voit jatkaa LimeSurveyn käyttöä totuttuun tapaan, mutta näet vastaavan relevanssiyhtälön, jolloin voit siirtyä vähitellen käyttämään relevanssiyhtälöitä suoraan, kun katsot sen sopivaksi.
Voinko käyttää ehtoja ja relevanssia yhdessä?
Kyllä. Voit käyttää ehtojen muokkausta joissakin kysymyksissä ja relevanssin muokkausta toisissa. Ehdot muunnetaan automaattisesti relevanssiksi, kun tallennat kysymyksen.
Huomaa, että jos käytät ehtojen muokkausta, oletamme sinun haluavan ehtojen korvaavan kaikki käsin syötetyt relevanssiyhtälöt. Jos siis sinulla on olemassa olevia ehtoja ja haluat muokata relevanssia käsin, poista ensin kyseisen kysymyksen ehdot. Kopioi tarkemmin sanottuna luotu relevanssiyhtälö tekstieditoriin, poista Ehdot-valikon avulla kaikki kyseisen kysymyksen ehdot (tämä poistaa myös relevanssin), muokkaa sitten kysymystä ja liitä luotu relevanssiyhtälö tekstieditorista takaisin kyseisen kysymyksen relevanssikenttään (ja tallenna kysymys). Jos ehtojen poistamiselle ilman luodun relevanssiyhtälön poistumista on riittävästi kysyntää, voimme lisätä massamuunnostoiminnon.
Kuinka valitsen ehtojen ja relevanssin välillä?
Tässä on luettelo kummankin tavan eduista ja haitoista:
| Tapa | Edut | Haitat |
|---|---|---|
| Ehdot | 1. Kätevä graafinen käyttöliittymä yksinkertaisten ehtojen luomiseen 2. Käyttöliittymä on hyvin dokumentoitu ja tukitiimi tuntee sen hyvin |
1. Tukee vain yksinkertaisia vertailuja eikä käsittele AND/OR-ehtoja hyvin 2. Ketjutetut ehdot toimivat epäluotettavasti 3. Hidas - kuormittaa tietokantaa voimakkaasti, joten pitkät kyselyt voivat hidastua 4. Joitakin ilmoitettuja ongelmia ehtojen uudelleenlataamisessa 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 tarvitaan usein ohjelmoija räätälöimään logiikka |
| Relevanssi | 1. Tukee erittäin monimutkaista logiikkaa, mukaan lukien yli 80 funktiota sekä matemaattiset ja merkkijono-operaattorit 2. Täydellinen tuki ketjutetulle logiikalle 3. Nopea - ei ylimääräisiä tietokantakutsuja, joten tukee yli 1000 kysymyksen kyselyjä 4. Ei ongelmia logiikan uudelleenlataamisessa, koska SGQA-koodeja ei tarvita 5. Syntaksikorostus skaalautuu yli 1000 kysymyksen kyselyihin 6. Helppo ja nopea käyttää ryhmille, jotka haluavat digitalisoida olemassa olevia paperikyselyjä. 7. Tukee helposti puolistrukturoituja haastatteluja ja epidemiologisia kyselyjä ilman ohjelmoijaa |
1. Ei graafista käyttöliittymää yksinkertaisille ehdoille - käytä sen sijaan syntaksikorostusta 2. Uusi, joten tukitiimit eivät ole vielä sisäistäneet EM:ää. |
Lopputulos on, että jos olet tyytyväinen LimeSurvey 1.91+:n toimintaan, ei ole syytä muuttaa tapaasi toimia.
Mitä muita etuja EM:n käytöstä on?
Tässä muita syitä, joiden vuoksi saatat haluta käyttää EM:ää.
- Laskutoimitukset - voit luoda minkä tahansa mieleesi tulevan laskutoimituksen:
- Käytössäsi on kaikki yleiset matemaattiset operaattorit ja funktiot
- Käytössäsi on yli 70 matemaattista, päivämäärä- ja merkkijonofunktiota
- Kehittäjien on melko helppo lisätä uusia funktioita, jos käyttäjät tarvitsevat niitä
- Laskutoimitusten tallentaminen tietokantaan
- Voit nyt laskea yksinkertaisia ja monimutkaisia laskutoimituksia ja/tai asteikkopisteitä JA tallentaa ne tietokantaan ilman JavaScriptiä.
- Tähän käytetään Yhtälö-kysymystyyppiä.
- Arviot
- Voit nyt luoda arvioita tai asteikkopisteitä mistä tahansa kysymystyypistä, ei vain aiemmin tuetusta osajoukosta
- Voit käyttää räätälöintiä näyttämään kertyviä tai kokonaisarviopisteitä missä tahansa tarvittaessa - jopa samalla sivulla
- Sinulla on enemmän hallintaa näihin arviopisteisiin perustuviin raportteihin
- Voit tallentaa arviopisteet tietokantaan ilman JavaScriptiä
- Voit piilottaa arviopisteet ilman JavaScriptiä tai CSS:ää
- Korvauskentät
- Käytä kysymyskoodia lisätäksesi aiempien kysymysten vastauksien arvoja - tämä helpottaa lukemista ja tarkistamista.
- Räätälöinti - voit näyttää tekstiä ehdollisesti muiden arvojen perusteella
- Käytä vastaajalle sopivaa puhuttelua, esimerkiksi (esim. "Hei [Herra/Rouva] Virtanen")
- Tuota kieliopillisesti oikeita lauseita, kun yksikkö/monikko on merkityksellinen: (esim. "Sinulla on 1 lapsi" vs. "Sinulla on 2 lasta")
- Taivuta verbejä ja substantiiveja asianmukaisesti aiheen sukupuolen ja luvun mukaan.
- Uudet muuttujien ominaisuudet - voit käyttää seuraavia räätälöintiin:
- (ei jälkiliitettä) - alias kohteelle qcode.code
- .code - kysymyksen valittu vastauskoodi, jos se on relevantti (muuten tyhjä), tai tekstiarvo, jos kysymys ei ole koodattu
- .NAOK - sama kuin .code, mutta voi olla osa laskutoimituksia tai listoja, vaikka se ei olisi relevantti
- .value - kysymyksen arviointiarvo, jos se on relevantti (muuten tyhjä), tai tekstiarvo, jos kysymys ei ole koodattu -- saatavilla, jos arvioinnit on otettu käyttöön kyselyssä, muuten aina nolla
- .valueNAOK - sama kuin .value, mutta voi olla osa laskutoimituksia tai listoja, vaikka se ei olisi relevantti
- .shown - käyttäjälle näytettävä vastaus
- .qid - kysymyksen tunniste
- .gid - ryhmän tunniste
- .sgqa - kysymyksen SGQA-arvo
- .jsName - kysymyksen oikea javascript-muuttujan nimi riippumatta siitä, onko se määritelty tällä sivulla vai toisella
- .qseq - kysymyksen järjestysnumero (alkaen nollasta)
- .gseq - ryhmän järjestysnumero (alkaen nollasta)
- .mandatory - onko kysymys pakollinen (Y/N)
- .question - kysymyksen teksti
- .relevance - kysymyksen relevanssiyhtälö
- .grelevance - ryhmän relevanssiyhtälö
- .relevanceStatus - onko kysymys tällä hetkellä relevantti (totuusarvo (voi olla erilainen PHP:ssä ja JS:ssä))
- .type - kysymyksen tyyppi (yhden merkin koodi)
- Dynaamiset muutokset sivulla
- Kaikki relevanssi, laskenta ja räätälöinti toimii dynaamisesti sivulla - arvojen muutokset päivittävät sivun välittömästi
- Kysymykset siis ilmestyvät tai katoavat dynaamisesti sen mukaan, ovatko ne relevantteja
- Kysymykset räätälöidään myös dynaamisesti sivun vastausten perusteella, joten voit nähdä kertyvät summat, räätälöidyt lauseet ja mukautetut raportit.
- Uusi tietojen syöttönäyttö
- Nykyisen tietojen syöttöjärjestelmän lisäksi voit käyttää Survey-All-In-One-tilaa.
- Tämä tukee sivun relevanssia ja räätälöintiä, joten tietojen syöttäjät voivat siirtyä nopeasti kentästä toiseen ja heidän tarvitsee syöttää vain relevantit vastaukset
- Tämä voi olla ratkaisevan tärkeää, jos tietojen syöttäjän täytyy nähdä räätälöinti, joka on myös dynaaminen.
- Poistaa tarpeen useimmille mukautetuille JavaScript-ratkaisuille
- EM tukee helposti monimutkaisia laskentoja, pisteytystä, räätälöintiä ja ehdollista logiikkaa.
- Jotkin asiat vaativat edelleen JavaScriptiä (kuten mukautetut asettelut ja kysymyksen osien ehdollinen piilottaminen), mutta JavaScriptisi voi käyttää EM-funktioita, jolloin voit käyttää kysymyksiä Qcoden eikä SGQA:n avulla sekä käyttää kaikkia edellä lueteltuja kysymyksen ominaisuuksia.
Mitä muita hyödyllisiä uusia ominaisuuksia EM mahdollistaa?
Riippumatta siitä, jatkatko Ehtojen muokkaimen käyttöä vai kirjoitatko relevanssiyhtälöt käsin, saat seuraavat lisäedut:
- Voit luoda monimutkaisempia validointikriteereitä
- Kaikki kysymyksen lisäattribuutit (kuten max_answers, min_num_value_n, max_num_value) voivat käyttää lausekkeita. Näin min/max-kriteerejä voi helposti mukauttaa aiempien vastausten perusteella, vaikka ne olisivat samalla sivulla.
- EM hoitaa myös kaiken säännöllisiin lausekkeisiin perustuvan validoinnin, joten voit yhdistää luotettavasti preg- ja yhtälöpohjaisia kysymyksen attribuutteja.
- Kysymysten ja ryhmien helppo uudelleenjärjestäminen (tai poistaminen)
- Ennen versiota 1.92 kysymyksiä tai ryhmiä ei voinut järjestää uudelleen, jos LimeSurvey katsoi uudelleenjärjestämisen voivan rikkoa ehdot, joissa niitä käytettiin. Vastaavasti kysymyksiä ei voinut poistaa, jos jokin toinen kysymys oli riippuvainen niistä.
- EM:n syntaksikorostuksen avulla on helppo nähdä ja tarkistaa, yritätkö käyttää kysymyksiä ennen kuin ne on määritelty. Siksi kysymykset ja ryhmät voi nyt järjestää uudelleen tai poistaa milloin tahansa. EM päivittää kaikki syntaksikorostukset ja näyttää mahdolliset virheet.
- Kysymysten uudelleenjärjestämisnäkymää on parannettu tällaista tarkistusta varten. Se näyttää nyt kysymyksen relevanssiyhtälön ja räätälöinnin, joten näet heti, muuttuvatko jotkin muuttujat vaaleanpunaisiksi (eli niitä käytetään ennen kuin ne on määritelty).
- Kysymys- ja ryhmäindeksi on aina saatavilla ja tarkka
- Ennen versiota 1.92 nämä indeksit eivät olleet saatavilla, jos ehdot olivat monimutkaisia.
- EM:n avulla voimme taata, että ne ovat tarkkoja.
- Vastaajat voivat jopa hypätä taaksepäin aiempaan kysymykseen, muuttaa vastausta ja hypätä sitten eteenpäin (tai lähettää kyselyn)
- Eteenpäin hypättäessä EM validoi uudelleen kaikki välissä olevat kysymykset/ryhmät.
- Jos jokin kysymys muuttuu epärelevantiksi, sen arvoksi asetetaan tietokannassa NULL, jotta tietosi pysyvät sisäisesti johdonmukaisina.
- Jos jokin kysymys muuttuu relevantiksi tai ei enää täytä pakollisuus- tai validointisääntöjä, EM pysäyttää vastaajan kyseiselle sivulle ja pakottaa hänet vastaamaan näihin kysymyksiin ennen siirtymistä lopulliseen määränpäähän.
- Ehtojen automaattinen muuntaminen relevanssiksi
- Kun päivität tietokannan, kaikille olemassa oleville kyselyille, joissa on ehtoja, luodaan relevanssiyhtälöt
- Aina kun tuot kyselyn, relevanssiyhtälöt luodaan tarvittaessa
- Aina kun lisäät, poistat tai muokkaat ehtoja, EM luo asianmukaisen relevanssiyhtälön.
- Kätevä syntaksikorostus
- Kun EM näyttää relevanssiyhtälön, se näyttää Qcoden, vaikka olisit syöttänyt SGQA-koodin, koska oletamme sen olevan helpompi lukea.
- Kaikki muuttujat on väritetty sen mukaan, onko ne määritelty ennen vai jälkeen nykyisen kysymyksen (tai ennen vai jälkeen nykyisen ryhmän). Näin huomaat ja korjaat nopeasti tapaukset, joissa yrität käyttää muuttujia relevanssi- (mukaan lukien array_filter), räätälöinti- tai validointiyhtälöissä ennen niiden määrittelyä.
- Lisäksi, kun viet hiiren värikoodatun muuttujan päälle, näet kysymyksen tärkeimmät metatiedot. Näitä ovat ryhmän järjestysnumero, kysymyksen järjestysnumero, Qcode, kysymyksen teksti ja kaikki käytettävissä olevat vastausvaihtoehdot (jos kysymystyypissä on lueteltuja vastausvaihtoehtoja).
- Vastausvaihtoehtojen luettelo käyttää tätä syntaksia: 'answers':{key:val, ... }.
- key:n syntaksi on 'scale~code', jossa scale on vastausskaala (esim. kaksoisskaalassa) ja code on vastauskoodi.
- val:n syntaksi on 'value~shown', jossa value on arviointiarvo (jos arviointeja käytetään, muuten code) (esim. Qcode.value) ja shown on vastaajalle näytettävä arvo (esim. Qcode.shown)
- Tämä tarkoittaa, että monet kyselyt voivat käyttää laskutoimituksia ilman arviointitilaa. Jos sinulla on lueteltuja vastausvaihtoehtoja, jotka ovat yksilöllisiä, ei-desimaalisia ja ei-negatiivisia, voit tehdä laskutoimitukset suoraan Qcode.code-arvoilla.
- Koko kyselyn logiikan ja sisällön helppo tarkastelu
- Uusi Näytä kyselyn logiikka -toiminto näyttää kaiken kyselystä (tai ryhmästä tai kysymyksestä) yhdellä sivulla.
- Se näyttää ryhmän, kysymyksen, alikysymyksen ja vastauksen tason tiedot valitulle laajuudelle (kysely, ryhmä tai kysymys)
- Se näyttää myös relevanssin, alikysymystason relevanssin (array_filter ja array_filter_exclude), luodun validointiyhtälön (preg sekä validointisäännöt kuten arvojen summan tai lukumäärän min/max) ja kaikki ei-tyhjät kysymyksen attribuutit.
- Kaikki on syntaksikorostettu, jotta näet mahdolliset syntaksivirheet (kuten tasapainottomat sulkeet tai muuttujien käytön ennen niiden määrittelyä)
- Syntaksikorostus mahdollistaa kyselyn nopean selaamisen ja muokkaamisen.
- Jos napsautat muuttujan nimeä, avautuu selainikkuna (tai välilehti), joka näyttää kyseisen kysymyksen ja antaa sinun muokata sitä.
- Jos napsautat ryhmän nimeä, avautuu selainikkuna (tai välilehti), joka näyttää ryhmän uudelleenjärjestämisnäkymän, jossa voit helposti siirtää kysymyksiä.
- Myös kaikki kysymyksen attribuutit on syntaksikorostettu. Näin voit asettaa ja nähdä lausekkeita kysymyksen lisäasetuksissa (esimerkiksi perustaa arvojen enimmäis-/vähimmäismäärän tai -summan lausekkeeseen)
- EM:n kehittäjä käytti vastaavaa (hieman siistimpää) näkymää, jotta hänen yhteistyökumppaninsa epidemiologit ja eettinen toimikunta voivat validoida ja hyväksyä tuhansien kysymysten kyselyjä, jotka ovat vahvasti haarautuvia ja räätälöityjä strukturoituja haastatteluja
Aloitus
Paras tapa aloittaa EM:n käyttö on:
- Asenna uusin vakaa versio osoitteesta http://www.limesurvey.org/en/download
- Tuo ja tutustu esimerkkikyselyihin.
- Tutustu käyttötapauksiin ja ohjeisiin sekä vaiheittaisiin esimerkkeihin.
- Tutustu EM-dokumentaatioon (tämä sivu)
- Tutustu sisäänrakennettuun EM-testisarjaan
- Valitse mistä tahansa kyselystä työkalujen alta EM-vaihtoehto
- Käytettävissä olevat toiminnot -kohta listaa yli 70 funktiota ja niiden syntaksin
- Eristettyjen lausekkeiden yksikkötestit
- näyttää esimerkkejä kaikkien EM-funktioiden ja operaattoreiden käytöstä sekä PHP- ja JavaScript-tulokset
- huomaa, että muutama funktio tuottaa eri tuloksen PHP- ja JavaScript-versioissa, joten tämän sivun avulla voit suunnitella EM-logiikkasi sen mukaisesti.
Mitä toiminnallisuutta Expression Manager laajentaa/korvaa? (LimeSurvey <= 1.91+)
Ehdot => Relevanssi
Ehdot määrittivät, mitkä kysymykset olivat näkyvissä. Yleinen syntaksi oli SGQA operaattori arvo, kuten 111X2X3 == "Y". Ehdot voitiin yhdistää AND- tai OR-operaattoreilla, mutta AND:n ja OR:n sekoittaminen oli vaikeaa. Ehdot itse tallennettiin erilliseen tauluun, ja suuri osa LimeSurveyn koodista oli omistettu ehtojen hallintaan. Runsaan tietokantakäytön vuoksi suuren ehtomäärän käsittely saattoi aiheuttaa havaittavia suorituskykyongelmia. Lisäksi kun kysymyksille tai ryhmille oli määritetty ehtoja, niitä ei useinkaan saanut järjestää uudelleen tai poistaa.
Arvioinnit => Yhtälöt ja mikroräätälöinti
Arviointien avulla käyttäjät voivat luoda skaalapisteitä kysymyskokoelmasta. Ne eivät kuitenkaan voineet muuttua dynaamisesti nykyisellä sivulla, eikä niiden arvoja tallennettu tietokantaan.
Korvaukset => Mikroräätälöinti
Käyttäjät pystyivät räätälöimään joitakin viestejä ja kysymyksiä aiempien vastausten perusteella. Kysymys saattoi olla esimerkiksi {TOKEN:FIRSTNAME}, sanoit, että {SPORT.shown} oli lempilajisi. Ehdollinen räätälöinti (esimerkiksi "Herra" tai "Rouva" henkilön sukupuolen mukaan) tai verbien taivuttaminen ja substantiivien muotojen valinta ei kuitenkaan ollut mahdollista ilman monimutkaista JavaScriptiä. Tekijät pystyivät toteuttamaan kyselyjä, jotka näyttivät räätälöivän kysymyksiä, mutta se vaati erillisen kysymyksen jokaiselle vaihtoehdolle ja monimutkaiset ehdot sen päättämiseksi, mitkä kysymykset näytetään.
Validointi
Kysymykset voitiin validoida säännöllisillä lausekkeilla tai minimi-/maksimiarvoilla, tai antaa vastauksen toimia minimi- tai maksimiarvona. Validointeja ei kuitenkaan voitu perustaa muiden muuttujien laskutoimituksiin ilman monimutkaista JavaScriptiä.
Yhtälöt
Yhtälöitä ei tuettu ilman monimutkaista JavaScriptiä.
Yhtälö-kysymystyyppi
Yhtälöitä (esim. arvioinnin loppupisteitä) ei voitu tallentaa tietokantaan ilman monimutkaista JavaScriptiä.
Miten Expression Manager korvaa/laajentaa tämän toiminnallisuuden?
Expression Manager on LimeSurveyn uusi ydinmoduuli, joka helpottaa huomattavasti sellaisen monimutkaisen toiminnallisuuden tukemista, joka ennen vaati räätälöityä JavaScriptiä. Se myös korvaa tavan, jolla LimeSurvey nykyisin hallitsee ehtoja ja arviointeja.
Uusi terminologia Expression Manageria (EM) käsiteltäessä
EM "ajattelee" toiminnallisuuttaan seuraavin termein:
- Relevanssiin perustuva haarautuminen - jos kysymys on relevantti, se esitetään, muuten ei (eli se piilotetaan ja merkitään tietokantaan arvolla NULL). Kaikilla kysymystyypeillä sekä jokaisella ryhmällä on uusi Relevanssi-kenttä (jolloin voit soveltaa ehtoja koko ryhmään kopioimatta samaa ehtoa jokaiseen kysymykseen ja/tai yhdistää ryhmä- ja kysymystason ehdollista logiikkaa).
- 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 korvausta (kuten {TOKEN:FIRSTNAME}), myös verbien taivutusta ja substantiivien muotojen valintaa vastaajien sukupuolen tai lukumäärän perusteella. Voit myös muuttaa 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. Nämä yhtälöiden tulokset lasketaan ja kirjoitetaan tietokantaan, vaikka piilottaisit ne sivulta. Siksi ne sopivat piilotettuihin pisteytyslaskelmiin, monimutkaisiin yhtälöihin perustuvaan navigointiin, arviointeihin ja raportteihin, jotka halutaan luoda ja saada helposti tietokannasta.
Relevanssi ja kaskadoituva relevanssi
Jokaisella kysymystyypillä on nyt Relevanssi-asetus, joka määrittää, näytetäänkö kysymys. EM käsittelee jokaisen relevanssiyhtälön siinä järjestyksessä, jossa 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 sen arvoksi asetetaan tietokannassa NULL. Jos ryhmässä ei ole yhtään relevanttia kysymystä, koko ryhmä ohitetaan.
Lisäksi jos jokin lausekkeen muuttujista on epärelevantti, lauseke arvioidaan aina epätodeksi. Tämä mahdollistaa kaskadoituvan relevanssin, jolloin sinun ei tarvitse kirjoittaa erittäin pitkiä relevanssiyhtälöitä jokaiselle kysymykselle.
Oletetaan, että sinulla on 5 kysymystä Q1–Q5 ja haluat näyttää Q2:n vain, jos Q1:een on vastattu, Q3:n vain, jos Q2:een on vastattu, jne. Relevanssiyhtälöt voisivat olla:
| Kysymyskoodi | Relevanssi | Kysymys |
|---|---|---|
| Q1 | 1 | Mikä on nimesi? |
| Q2 | Q1 | {Q1}, minkä ikäinen 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}? |
Relevanssilaskelmat toimivat myös JavaScriptissä - joten kaikki yllä olevat kysymykset voisi laittaa yhdelle sivulle ja ne toimisivat silti odotetusti. Itse asiassa EM korvaa kokonaan tavan, jolla kysely-, ryhmä- ja kysymys kerrallaan -kyselymuodot käsitellään. Ne kaikki käyttävät nyt täsmälleen samaa navigointimoottoria, joten ne toimivat identtisesti kyselyn tyylistä riippumatta.
Niin kauan kuin olet samalla sivulla, kaikki antamasi tiedot ovat edelleen olemassa, vain piilotettuina. Jos siis syötät tietoja, valitset sitten vaihtoehdon, joka tekee ne epärelevanteiksi, ja teet ne sitten uudelleen relevanteiksi, vastauksesi ovat edelleen saatavilla. Heti kun siirryt toiselle sivulle, kaikki epärelevantit vastaukset kuitenkin menetetään aineiston eheyden vuoksi.
Ryhmätason relevanssi
Expression Manager 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ä) ja selvität ensin, kuinka monesta kohteesta tarvitaan lisäkysymyksiä (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 lisäkysymyksiä, voit käyttää ryhmätason relevanssia, kuten {count >= 1}, {count >=2}, ... {count >= 10}, kullekin kymmenestä lisäkysymysryhmästä. Kunkin ryhmän sisällä voit käyttää kysymystason ehdollista logiikkaa (esim. sukupuoleen tai ikään perustuvia lisäkysymyksiä kullekin henkilölle). Kysymys- ja ryhmätason relevanssiyhtälöt yhdistetään AND-operaattorilla sen selvittämiseksi, mitä näytetään.
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, kaikkiin muuttujiin (usean aliaksen kautta), kaikkiin tavallisiin yhtälöoperaattoreihin (matemaattisiin, loogisiin ja vertailuoperaattoreihin) sekä kymmeniin funktioihin (jotka toimivat dynaamisesti jopa asiakaspuolella).
Näiden yhtälöiden avulla voit tehdä esimerkiksi seuraavaa:
- Näyttää vastaajille ehdollisesti räätälöityjä viestejä aiempien vastausten perusteella
- Luoda arvioita ja näyttää arviotulokset (tai haarauttaa tai näyttää viestejä ehdollisesti niiden perusteella) ilman itse Arviot-moduulin käyttöä
- Taivuttaa verbejä ja substantiiveja kysymyksissä, vastauksissa ja raporteissa.
- Näyttää yhteenvedon vastauksista ennen kyselyn lopussa olevaa "Näytä vastauksesi" -sivua
Yhtälöt
Uusi kysymystyyppi on nimeltään Yhtälö. Se on kuin Boilerplate-kysymys, mutta se tallentaa näytettävän arvon tietokantaan. Jos siis yhtälökysymyksen kysymysteksti sisältää arvion laskennan, kyseinen arvo tallennetaan tietokantaan muuttujaan, joka voidaan näyttää julkisissa tai yksityisissä tilastoissa.
Tämä ratkaisee yleisen toiveen arviopisteiden tallentamisesta tietokantaan.
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 Expression Manager yritä käsitellä upotettua JavaScriptiä).
Huomaa, että lausekkeet voivat ulottua usealle riville, kunhan avaavan aaltosulkeen jälkeen tai sulkevan aaltosulkeen edellä 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',
''
)
)
)
)
)
)
)
)}
- Kaikki tavalliset matemaattiset operaattorit (esim. +,-,*,/,!)
- Kaikki tavalliset vertailuoperaattorit (esim. <,<=,==,!=,>,>=, sekä nämä vastineet: lt,le,eq,ne,gt,ge)
- Sulkeet (joilla voit ryhmitellä osalausekkeita)
- Ehdolliset operaattorit (esim. &&,| | ja nämä vastineet: and,or)
- Yksin- ja kaksinkertaisilla lainausmerkeillä merkityt merkkijonot (joihin voi kumpaankin upottaa toisen lainausmerkkityypin merkkijonoja)
- Pilkkuoperaattori (jolla voit luoda lausekeluettelon ja palauttaa vain viimeisen tuloksen)
- Sijoitusoperaattori (=)
- Ennalta määritetyt muuttujat (viittaamaan kysymyksiin, kysymysattribuutteihin ja vastauksiin) - esim. kaikki SGQA-koodit
- Ennalta määritetyt funktiot (niitä on jo yli 70, ja lisääminen on helppoa)
Operaattorit
EM-syntaksi noudattaa tavallista operaattorien suoritusjärjestystä:
| Taso | Operaattorit | Kuvaus |
|---|---|---|
| 1 | () | sulkeet ryhmittelyyn tai funktioiden kutsumiseen |
| 2 | ! - + | unaariset operaattorit: not, 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 AND |
| 8 | or | looginen OR |
| 9 | = | sijoitusoperaattori |
| 10 | , | pilkkuoperaattori |
Varoitus plus-operaattorista (+)
JavaScriptin ja PHP:n yhdenmukaisuuden vuoksi plus-operaattori (+) suorittaa yhteenlaskun, jos molemmat operandit ovat numeerisia, mutta yhdistää merkkijonot, jos molemmat osat ovat ei-numeerisia merkkijonoja. Suosittelemme kuitenkin käyttämään join()-funktiota merkkijonojen yhdistämiseen ja sum()-funktiota yhteenlaskuun, sillä se tekee tarkoituksestasi selvemmän ja välttää odottamattomat tulokset, jos odotit merkkijonoja mutta sait numeroita (tai päinvastoin).
Varoitus numeron ja merkkijonon välisestä ristiriidasta sekä aakkosellisesta vertailusta
Kun haluat verrata arvoja suuruus- tai yhtäsuuruusvertailuilla, kiinnitä huomiota tyyppien eroon. Käyttäjän syöttämää arvoa tai valittua vastauskoodia voidaan käyttää numerona, jos se on selvästi numero.
Jos ympäröit jonkin arvoista merkillä ", vertailu pakotetaan tekstivertailuksi (aakkosellinen vertailu). Jos haluat verrata numeerisesti, älä koskaan ympäröi numeroa lainausmerkeillä ".
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.
Voit varmistaa kokonaislukujen vertailun käyttämällä esimerkiksi intval(Q0.NAOK) > 50. Muista kuitenkin, että jos Q0.NAOK ei ole numero (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ä
Huomaa, että sijoitusoperaattoreita tulisi välttää, 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ä ketjutettua relevanssi- ja validointilogiikkaa ei lasketa uudelleen, jolloin tiedot voivat muuttua sisäisesti ristiriitaisiksi (esim. kysymykset, joihin on vastattu mutta jotka olisi pitänyt asettaa arvoon NULL, tai kysymykset, jotka ohitetaan mutta joihin olisi pitänyt vastata). Yleensä, jos haluat sijoittaa muuttujalle arvon, kannattaa luoda yhtälö-kysymystyyppinen kysymys ja asettaa sen arvo lausekkeella. Joskus tätä operaattoria kuitenkin 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ö
Syitä sijoituksen käyttämiseen voivat olla:
- Sinun on asetettava oletusarvo kysymykselle, joka ei hyväksy oletusarvoja yhtälön kautta (kuten radiopainikkeilla varustettu lista, jossa käyttöliittymä antaa valita yhden vastausvaihtoehdoista mutta ei salli yhtälön syöttämistä). Ole kuitenkin varovainen, sillä LimeSurvey ei pysty varmistamaan, että yhtälösi tuottaa jonkin kyseisen kysymyksen sallituista vastauksista.
- Sinun on pakotettava aiemman kysymyksen vastaus muuttumaan myöhemmän vastauksen perusteella
- Tarvitset monimutkaisen kiintiön: käytät yhtä piilotettua Yksi valinta -kysymystä kiintiönä ja asetat sen arvon sijoituksella
- jne...
Voit käyttää tähän tarkoitukseen koko Expression Manager -järjestelmää.
Joitakin esimerkkejä:
- Aseta Lyhyt teksti -kysymyksen vastaus pieniksi kirjaimiksi :
{QCODE=strtolower(QCODE.NAOK)} - Aseta oletusvastaus taulukko-kysymystyyppiin kyselyn alussa :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Aseta oletusvastaus tekstitaulukko-kysymystyyppiin 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-suojaus on käytössä, kaikkia Expression Managerin toimintoja ei voi käyttää:
- HTML-tagin aloittaminen lausekkeessa ja sen päättäminen toisessa lausekkeessa
- monimutkaisen lausekkeen käyttö URL-osoitteessa.
Esimerkki ja kiertotie
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}ei toimi XSS-suojauksen kanssa. Tässä voit käyttää lauseketta{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 täyden kysymyskoodin käyttö on sallittua:<a href="/script.php?value={EQUATION.NAOK}">next</a>
Muuttujien käyttö
Expression Manager tarjoaa vain lukuoikeuden kaikkiin tarvitsemiimme muuttujiin. Taaksepäin yhteensopivuuden vuoksi se tarjoaa pääsyn seuraaviin:
- TOKEN:xxx - TOKENin arvo (esim. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (vain kyselyissä, jotka EIVÄT ole anonyymejä).
- QCODE.shown - vastauksen näytettävä arvo (esim. "Kyllä") Expression Managerin avulla.
- Kaikki mallipohjien käyttämät {XXX}-arvot.
- Kysymystekstissä voit käyttää {QID}-koodia, joka korvataan kysymyksen tunnisteella, ja {SGQ}-koodia, joka korvataan kysymyksen SGQA-koodilla
Lisäksi Expression Managerin avulla voit viitata muuttujiin kysymyskoodilla (tietokannan kysymystaulun 'title'-sarake). Tämä on myös muuttujan nimi, jota käytetään, kun viet tiedot SPSS-, R- tai SAS-ohjelmaan. Jos sinulla on esimerkiksi kysymykset nimestä, iästä ja sukupuolesta, voit nimetä muuttujat name, age ja gender nimien 12345X13X22, 12345X13X23 ja 12345X13X24 sijaan. Näin yhtälöt on helpompi lukea ja niiden logiikka on helpompi tarkistaa, ja kysymyksiä voi järjestellä uudelleen ilman, että ryhmien tai kysymysten numeroita tarvitsee seurata.
Tärkeää: Vain edellisillä sivuilla tai edellisissä kysymyksissä esiintyviin muuttujiin on turvallista viitata.
Lisäksi Expression Managerin avulla voit käyttää monia kysymyksen ominaisuuksia:
| Syntaksi | Merkitys | Esimerkki | Esimerkin tulos |
|---|---|---|---|
| Qcode | Qcode.code-muodon 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 numero (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 muualla | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | ryhmän sisäinen numero (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 editori -ongelma
Jos käytät HTML editoria, jotkin merkit korvataan HTML-entiteeteillä.
- & merkitään &
- < merkitään <
- > merkitään >
Jos käytät HTML editoria, sinun on käytettävä seuraavia:
- and merkin & sijasta
- lt merkin < sijasta
- le merkin <= sijasta
- gt merkin > sijasta
- ge merkin >= sijasta
Qcode-muuttujien nimeäminen
Tässä kerrotaan, miten Qcode muodostetaan (ja miten joitakin ominaisuuksia käytetään) kysymystyypeittäin. Yleisesti Qcode muodostetaan näin:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Alikysymyskoodia ja asteikon tunnistetta (Scale ID) käytetään tai ei käytetä kysymystyypin mukaan - katso alla oleva taulukko. Kohdissa comment ja other 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 (monijoustava) 1-10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Taulukko (monijoustava) 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 | Vakiotekstikysymys | 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/valintanappilista | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Lista kommentilla, pudotusvalikko/valintanappilista + tekstialue | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Pitkä vapaateksti | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Monivalinta, valintalaatikko | 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 kysymys | 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'} |
Varatut muuttujat 'this', 'self' ja 'that'
Usein kysymyksen kaikki osat halutaan arvioida, esimerkiksi laskemalla, kuinka monta alikysymystä on vastattu, tai summaamalla pisteet. Toisinaan halutaan 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ä melko vaivatonta.
Muuttujaa 'this' käytetään vain kysymyksen lisäasetuksissa "Koko kysymyksen vahvistusyhtälö" ja "Alikysymyksen vahvistusyhtälö". Se laajenee kyseisten kysymysten jokaisen solun muuttujien nimiksi. Jos siis haluat varmistaa, että jokainen syöte on suurempi kuin kolme, aseta "Alikysymyksen vahvistusyhtälöksi" (this > 3).
Muuttujat 'self' ja 'that' ovat tehokkaampia, ja ne toimivat makroina, jotka laajennetaan ennen yhtälöiden käsittelyä. Syntaksivaihtoehdot ovat:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix (jälkiliite) on mikä tahansa tavallisista qcode-jälkiliitteistä (esim. NAOK, value, shown)
sub-selector on jokin seuraavista:
- comments - vain kommentteja olevat alikysymykset (esim. monivalinta kommenteilla ja lista kommentilla -kysymyksistä)
- nocomments - vain alikysymykset, jotka eivät ole kommentteja
- sq_X - missä X on rivin tai sarakkeen tunniste. Valitaan vain alikysymykset, jotka vastaavat kuviota X. Huomaa, että haku tehdään koko koodin tunnisteesta, jonka jälkeen sq_X-vastaavuus 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 kaksoisasteikkokysymystyyppiin, jossa alikysymysten koodit ovat QCODE_SQCODE_1 ja QCODE_SQCODE_1, sekä sijoituskysymystyyppiin, jossa alikysymysten koodit ovat QCODE_1, QCODE_2 ....
- nosq_X - missä X on rivin tai sarakkeen tunniste. Valitaan vain alikysymykset, jotka eivät vastaa kuviota X. Huomaa, että haku tehdään koko koodin tunnisteesta, jonka jälkeen nosq_X-vastaavuus ei sisällä alikysymyksiä nX, X ja Xn
Esimerkkejä:
- Onko johonkin kysymyksen osaan vastattu? {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 numerotaulukko, jonka rivit ovat 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' on kuin 'self', mutta sen avulla voi 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ä. Jos esimerkiksi luot kysymyksen 'q1', se on sen qname
Esimerkkejä:
- Onko johonkin kysymyksen q1 osaan vastattu? {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-, vahvistus- tai räätälöintilausekkeessa.
Yksi huomioitava seikka: kun käytät Näytä logiikkatiedosto -toimintoa, se näyttää muuttujien 'self' ja 'that' laajennetut arvot. Näin näet varsinaisen muodostettavan yhtälön, ja sinä (ja Expression Manager) voitte tarkistaa, että muuttujat ovat olemassa. Tämä voi vaikuttaa 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'
Huomaa myös, että näitä muuttujia ei kannata käyttää, jos (a) haluat nimetä jokaisen yhtälössä käytetyn muuttujan erikseen tai (b) käytät muuttujia, joilla ei ole alikysymyksiä (esim. yhden vastauksen kysymykset). Näissä tapauksissa muuttujan etuliitteeksi lisättävä 'that' on tarpeeton, ja riskinä on saada odottamattomia tuloksia.
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ä on epärelevantteja (eli "Ei sovellettavissa" (NA) on sallittu (OK)).
Kun lisäät yhtälöön muuttujan kysymyksestä: jos kysymys (tai alikysymys) on piilotettu ehdon perusteella, koko yhtälö poistuu käytöstä.
Esimerkiksi: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) palauttaa aina tyhjän merkkijonon, jos jokin Q1:n alikysymys on suodatettu pois. Valittujen alikysymysten lukumää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, Expression Manager palauttaa tyhjän merkkijonon.
Ilman NAOK:ia: jos yksi kysymys tai alikysymys on piilotettu, Expression Manager palauttaa aina tyhjän merkkijonon, mikä vastaa arvoa epätosi.
Pääte .shown käyttää aina NAOK-järjestelmää (tyhjä merkkijono, jos kysymys on piilotettu), mutta jos tarvitset vastauksen koodin, on aina hyvä idea lisätä .NAOK kysymyskoodin perään. Poikkeuksena tilanne, jossa tarvitset sitä ja tiedät, mitä teet.
Lisäesimerkki ja -tietoja löytyvät kohdasta Overriding Cascading Conditions
Funktioiden käyttö
Expression Manager tarjoaa käyttöön matemaattisia, merkkijono- ja käyttäjän määrittelemiä funktioita alla kuvatulla tavalla. Näille funktioille on olemassa PHP- ja JavaScript-vastineet, joten ne toimivat samalla tavalla palvelinpuolella (PHP) ja selainpuolella (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 lainausmerkkien eteen | 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 syöttötaulukon ja tulostaulukon 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 sopivat 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 (Updated in 3.0.2 ) | 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 erotetun listan ei-tyhjistä arvoista | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Palauttaa 'glue'-merkkijonolla erotetun 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) |
| log | Luvun logaritmi annettuun kantalukuun tai luonnollinen logaritmi. | number log(number,base=e) |
| 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 kaikkien merkkijonon rivinvaihtojen eteen | 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 lukulistan 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 merkkikoosta riippumattoman unicode-merkkijonon ensimmäisen esiintymän sijainnin (alkaen 0:sta, palauttaa false, jos ei löydy) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Poista lainausmerkit lainausmerkein merkitystä merkkijonosta | string stripslashes(string) |
| stristr | Merkkikokoriippumaton strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Hanki merkkijonon pituus | int strlen(string) |
| strpos | Etsii unicode-merkkijonon ensimmäisen esiintymän sijainnin (alkaen 0:sta, 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 | Jäsentää 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 | Muuntaa 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) |
Suunnitellut tai harkinnassa olevat funktiot
Muita suunniteltuja (tai harkinnassa olevia) funktioita, joita ei ole vielä toteutettu, ovat seuraavat. Osa näistä on mukana taaksepäin yhteensopivuuden vuoksi toisen kyselytyökalun kanssa.
| Syntaksi | Merkitys | Kommentit |
|---|---|---|
| e() | palauttaa e:n arvon | |
| formatDate(X,PAT) | palauttaa päiväyksen X merkkijonoarvon muotoiltuna Javan päiväysmuotomallin PAT mukaisesti | |
| formatNumber(X,PAT) | palauttaa luvun X merkkijonoarvon muotoiltuna Javan lukumuotomallin PAT mukaisesti | |
| getAnsOption(X) | Ydinlisäosa ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Ydinlisäosa ExpressionAnswerOptions | |
| getRelevance(X) | palauttaa kysymyksen X relevanssiyhtälön | |
| getStartTime() | palauttaa päiväyksen, joka vastaa järjestelmän aikaa haastattelun alkaessa | |
| getType(X) | palauttaa tietotyypin merkkijononimen - esim. *NA* jos isNA() | |
| gotoFirst() | siirtyy ensimmäiseen relevanttiin kysymysjoukkoon - tämä rikkoo järjestelmän normaalin kulun | |
| gotoNext() | siirtyy seuraavaan relevanttiin kysymysjoukkoon - tämä rikkoo järjestelmän normaalin kulun | |
| gotoPrevious() | siirtyy edelliseen relevanttiin kysymysjoukkoon - tämä rikkoo järjestelmän normaalin kulun | |
| isAsked(X) | palauttaa tosi, jos vastaus ei ole tyyppiä *NA*, *INVALID* eikä *UNASKED* | |
| isInvalid(X) | palauttaa tosi, jos vastaus on tyyppiä *INVALID* | |
| isNA(X) | palauttaa tosi, jos vastaus on tyyppiä *NA* | |
| isNotUnderstood(X) | palauttaa tosi, jos vastaus on tyyppiä *HUH* | |
| isRefused(X) | palauttaa tosi, jos vastaus on tyyppiä *REFUSED* | |
| isSpecial(X) | palauttaa tosi, jos vastaus on tyyppiä *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* tai *HUH* | |
| isUnknown(X) | palauttaa tosi, jos vastaus on tyyppiä *UNKNOWN* | |
| jumpTo(X) | siirtyy nimettyä kysymystä sisältävään ryhmään -- tämä rikkoo järjestelmän normaalin kulun | |
| jumpToFirstUnasked() | siirtyy ensimmäiseen kysymättä jääneeseen kysymykseen |
|
| lastIndexOf(X,Y) | palauttaa merkkijonon Y viimeisen indeksin (alkaen nollasta) merkkijonossa X. Palauttaa -1, jos X ei sisällä merkkijonoa Y | |
| list(X,...) | merkkijono, joka sisältää pilkuilla erotetun listan positiivisista arvoista siten, että kaksi viimeistä erottaa sana "and" | |
| mean(X,...) | palauttaa arvolistan keskiarvon | |
| numAnsOptions(X) | palauttaa kysymyksen X vastausvaihtoehtojen määrän | |
| orlist(X,...) | merkkijono, joka sisältää pilkuilla erotetun listan positiivisista arvoista siten, että kaksi viimeistä erottaa sana "or" | |
| parseDate(X,PAT) | palauttaa merkkijonon X päiväysarvon jäsennettynä Javan päiväysmuotomallilla PAT | |
| parseNumber(X,PAT) | palauttaa merkkijonon X numeerisen arvon jäsennettynä Javan lukumuotomallilla PAT | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | questionList = pystyviivalla erotettu lista kysymystunnisteista; attributeList = pystyviivalla erotettu lista attribuuteista (kuten question#, title, text, type - näin voit valita, mitä näytetään); attributeTitleList = pystyviivalla erotettu lista taulukon otsikoista, jotta raportti voidaan kansainvälistää. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | questionList = pystyviivalla erotettu lista kysymystunnisteista; attributeList = pystyviivalla erotettu lista attribuuteista (kuten question#, title, text, type - näin voit valita, mitä näytetään); attributeTitleList = pystyviivalla erotettu lista taulukon otsikoista, jotta raportti voidaan kansainvälistää. |
Expression Manager tietää, mitkä muuttujat ovat paikallisia
Jotta Expression Manager voi rakentaa sivun JavaScriptin oikein, sen on tiedettävä, mitkä muuttujat asetetaan sivulla ja mikä on niiden JavaScript-tunniste (esim. document.getElementById(x)). Sen on myös tiedettävä, mitkä muuttujat asetetaan muilla sivuilla, jotta se voi varmistaa, että tarvittavat <input type='hidden' value='x'> -kentät ovat olemassa ja täytetty.
Porrastetut ehdot
Jos jokin muuttujista ei ole relevantti, koko yhtälö ei ole relevantti (epätosi). 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 |
Porrastettujen ehtojen ohittaminen
Oletetaan, että haluat näyttää juoksevan summan kaikista relevanteista vastauksista. Voisit yrittää käyttää yhtälöä {sum(q1,q2,q3,...,qN)}. Tämä käännetään kuitenkin sisäisesti muotoon LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Jos siis jokin arvoista q1-qN ei ole relevantti, yhtälö palauttaa aina epätoden. Tässä tapauksessa sum() näyttää arvon 0, kunnes kaikkiin kysymyksiin on vastattu.
Tämän kiertämiseksi jokaiseen muuttujaan voidaan lisätä jälkiliite ".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 laatijat voivat myös suunnitella kyselyitä, joissa on useita mahdollisia polkuja, jotka kuitenkin yhtyvät myöhemmin yhteisiin polkuihin. Oletetaan esimerkiksi, että vastaaja vastaa kyselyyn tavalla, joka on tavanomaisen vastausalueen ulkopuolella. Laatija voi varoittaa vastaajaa, ettei tulokset välttämättä ole päteviä, ja kysyä, haluaako hän todella jatkaa kyselyä. Jos hän vastaa Kyllä, loput kysymykset näytetään. "Loppujen kysymysten" ehto tarkistaisi, onko alkuvastaukset annettu tavanomaisella alueella TAI onko vastaaja vastannut Kyllä kysymykseen, joka on relevantti vain, jos hän vastasi tavanomaisen alueen ulkopuolella.
Miten Expression Manager tukee ehdollista mikrosovitusta?
Tässä on esimerkki mikrosovituksesta (jossa Question Type=='expr' tarkoittaa yhtälöä):
| Kysymyskoodi | Relevanssi | Kysymyksen tyyppi | Kysymys |
|---|---|---|---|
| name | 1 | text | What is your name? |
| age | 1 | text | How old are you? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test. |
| kids | !badage | yesno | Do you have children? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | How many children do you have? |
| kid1 | parents && numKids >= 1 | text | How old is your first child? |
| kid2 | parents && numKids >= 2 | text | How old is your second child? |
| kid3 | parents && numKids >= 3 | text | How old is your third child? |
| kid4 | parents && numKids >= 4 | text | How old is your fourth child? |
| kid5 | parents && numKids >= 5 | text | How old is your fifth child? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, you said you are {age} and that you have {numKids}. The sum of ages of your first {min(numKids,5)} kids is {sumage} |
Kaikki nämä kysymykset voivat olla yhdellä sivulla (esim. samassa ryhmässä), ja vain relevantit kysymykset näytetään. Lisäksi lasten ikiä syötettäessä viimeisen kysymyksen sum()-lauseke päivittyy dynaamisesti sivulla.
Expression Manager toteuttaa tämän ympäröimällä jokaisen lausekkeen nimetyllä <span>-elementillä. Aina kun arvo muuttuu, se laskee uudelleen lausekkeen, jonka pitäisi näkyä kyseisessä <span>-elementissä, ja päivittää näkymän. Samalla sivulla voi olla kymmeniä tai jopa satoja tällaisia sovitettuja lausekkeita, ja sivu päivittää ne kaikki yhdellä näytön päivityksellä.
LimeSurvey 1.91+ -toiminnallisuuden vastaavuus Expression Managerissa
| Vanha ominaisuus | Uusi ominaisuus | Kommentit |
|---|---|---|
| Ehdot | Relevanssi | Voit käyttää hyvin monimutkaisia ehtoyhtälöitä ja käyttää laajempaa joukkoa muuttujia |
| Arviot | Yhtälö | Mikä tahansa arviopistemäärä voidaan muokata yhtälöksi. Tämä varmistaa sekä sen, että pistemäärä tallennetaan tietokantaan, että sen, että näet pistemäärän dynaamiset muutokset nykyisellä sivulla |
| Korvaukset | Expression Manager | Ydinmoottori käsittelee syötemerkkijonon kaiken aaltosulkeiden sisällä olevan lausekkeena - joten se hoitaa kaikki aiemmat korvaustyypit. Upotetun JavaScriptin sotkemisen välttämiseksi Expression Manager käsittelee aaltosulkeiden välisen sisällön vain, jos (a) aaltosulkeiden sisällä ei ole alku- tai loppuvälilyöntiä - esim. {expr} on lauseke, mutta { expr}, {expr } ja { expr } eivät ole lausekkeita. Lisäksi Expression Manager ei käsittele sisältöä omien merkkijonojensa sisällä (esim. {list('hi','there {braces}')} tuottaa "hi there {braces}"). Se ohittaa myös escapatut aaltosulkeet (esim. \{this is not an expression\}) |
| Validointi | Expression Manager | Suunnitelmana on ottaa nykyiset min/max-kysymysattribuutit ja antaa Expression Managerin käsitellä ne. Näin min/max-arvot voivat itse olla lausekkeita |
Syntaksin korostus
Lausekkeiden syöttämisen ja validoinnin helpottamiseksi EM tarjoaa syntaksin korostuksen seuraavilla ominaisuuksilla:
Syntaksin korostuksen tyypit ja merkitykset
| Väri | Esimerkki | Merkitys | Työkaluvihje | Kommentit |
|---|---|---|---|---|
| tan background | Sample | koko yhtälö | ei mitään | Kaikki aaltosulkeiden sisällä oleva, joka tunnistetaan yhtälöksi (eli alussa tai lopussa ei ole välilyöntejä), merkitään vaalean ruskealla taustalla, jotta se erottuu ympäröivästä tekstistä |
| bold red text | Sample | Virhe | Selitys virheestä | Voi olla tuntematon muuttuja tai virhe funktiossa jne. Kysely voi olla täysin rikki, mutta tämä ei näy julkisille käyttäjille. |
| blue text | Sample | funktion nimi | merkitys ja sallittu syntaksi | funktioiden nimet tai asiat, joiden pitäisi olla funktioita, koska niiden perässä on avaava sulku, esitetään lihavoidulla sinisellä tekstillä. Työkaluvihjeet näyttävät funktion merkityksen ja sallitun syntaksin. |
| grey text | Sample | merkkijono | ei mitään | yksinkertaisilla ja kaksinkertaisilla lainausmerkeillä merkityt merkkijonot näytetään harmaalla tekstillä |
| cyan text | Sample | samalla sivulla asetettu muuttuja, | [nimi tai SGQA-koodi]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki muuttujat, jotka on asetettu samalla sivulla kuin nykyinen kysymys, näytetään syaanilla tekstillä, mikä osoittaa, että niitä voidaan päivittää JavaScriptillä. Työkaluvihje näyttää muuttujan nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia lueteltujen arvojen joukosta, näytetään koodien vastaavuus näytettäviin arvoihin. |
| green text | Sample | aiemmalla sivulla asetettu muuttuja | [nimi tai SGQA-koodi]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki aiemmalla sivulla asetetut muuttujat näytetään lihavoidulla vihreällä tekstillä. Työkaluvihje näyttää muuttujan nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia lueteltujen arvojen joukosta, näytetään koodien vastaavuus näytettäviin arvoihin. |
| bold pink text | Sample | myöhemmällä sivulla asetettu muuttuja yleensä tyhjä kyselyn alussa, mutta voi täyttyä indeksin tai edelliselle sivulle siirtymisen kautta | [nimi tai SGQA-koodi]: kysymys; arvo; vastauslista, joka näyttää kunkin arvon koodit | Kaikki myöhemmällä sivulla asetetut muuttujat näytetään lihavoidulla vaaleanpunaisella tekstillä. Työkaluvihje näyttää muuttujan nimen, varsinaisen kysymyksen ja sen nykyisen arvon (tai tyhjän, jos arvoa ei ole asetettu). Jos kysymystyyppi odottaa vastauksia lueteltujen arvojen joukosta, näytetään koodien vastaavuus näytettäviin arvoihin. |
| bold tan text | Sample | Limen korvausarvo | arvo | Limen korvausmerkkijonot (kuten {TOKEN:xxx}, {PRIVACY_MESSAGE}) näytetään lihavoidulla ruskealla tekstillä. |
| red text | Sample | sijoitusoperaattori (=) | varoitusviesti | Jos käytät sijoitusoperaattoria (=), operaattori näytetään punaisella tekstillä. Tämä auttaa estämään arvojen vahingossa tapahtuvan uudelleenasettamisen, kun tarkoitit tarkistaa, onko a == b, etkä asettaa arvoa a = b. |
| normal black text | Sample | välimerkit | ei mitään | Kaikki muut lausekkeen sisällä olevat välimerkit näytetään tavallisella mustalla tekstillä. |
| red-boxed text | punainen lihavoitu viiva ympäröi virheen | syntaksivirhe | virheen kuvaus | Kaikki havaitut syntaksivirheet näytetään ympäröimällä virhe punaisella laatikolla. Työkaluvihje näyttää virheen. Esimerkkejä ovat pariton sulku, määrittelemättömien funktioiden käyttö, väärä määrä argumentteja funktioille, huonosti jäsennellyt lausekkeet (esim. muuttujien välistä puuttuvat operaattorit), uuden arvon asettaminen vain luettavalle muuttujalle, arvojen asettaminen muille kuin muuttujille tai ei tuetun syntaksin käyttö. Huomaa, että syntaksivirheiden tunnistus voi raportoida vain yhden virheen lausekkeessa, vaikka virheitä olisi useita; jos virheitä kuitenkin havaitaan, vähintään yksi virhe näytetään. |
Lisälukemista
Expression Managerin esimerkkikyselyt
Käyttötapaukset ja ohjeet
Vaiheittaiset esimerkit
Expression Managerin tilastofunktiot
Kehittäjän opas










