Expression Manager
From LimeSurvey Manual
Hurtigstartveiledning
Oversikt
Når du tilpasser undersøkelsene dine, trenger du vanligvis en måte å spesifisere følgende på:
- Navigering/forgrening - la deltakerens svar endre rekkefølgen spørsmålene stilles i
- Tilpasning/piping - hvordan spørsmålet skal formuleres (for eksempel ved å vise til tidligere svar, eller bøye setninger basert på antall eller kjønn til deltakerne), eller hvordan man genererer egendefinerte rapporter (som vurderingspoeng eller skreddersydde råd).
- Validering - sikre at svar oppfyller visse kriterier, som minimums- og maksimumsverdier, eller samsvarer med et inndatamønster
Expression Manager (EM) gir en intuitiv måte å spesifisere logikken for hver av disse funksjonene på. Nesten alt du kan skrive som en vanlig matematisk ligning, er et gyldig uttrykk, selv om du kaller funksjoner. EM gir for øyeblikket tilgang til 80 funksjoner, og kan enkelt utvides til å støtte flere. Den lar deg også bruke variablene dine med lesbare variabelnavn (i stedet for SGQA-navn).
Følgende avsnitt viser de viktigste stedene der Expression Manager brukes
Enkelte undersøkelser bruker «Goto-logikk», slik at hvis du svarer på spørsmål 1 med alternativ C, hopper du til spørsmål 5. Denne tilnærmingen er svært begrensende, siden den er vanskelig å validere og lett går i stykker når du må endre rekkefølgen på spørsmål. EM bruker en boolsk relevanseligning for å spesifisere alle betingelsene der et spørsmål kan være gyldig. Hvis spørsmålet er relevant, vises det, ellers er det Ikke aktuelt, og verdien NULL lagres i databasen. Dette ligner på det man kan gjøre via betingelseseditoren, men EM lar deg enkelt spesifisere mye mer komplekse og kraftige kriterier (og lar deg bruke variabelnavnet i stedet for SGQA-navn).
Dette bildet viser én måte å gjennomgå relevanslogikken i en undersøkelse. Den beregner kroppsmasseindeks (KMI). Relevanseligningen vises i hakeparentes rett etter variabelnavnet (som er i grønt). Relevansen til weight, weight_units, height og height_units er altså alle 1, noe som betyr at disse spørsmålene alltid stilles. Relevansen for BMI er imidlertid {!is_empty(height) and !is_empty(weight)}, noe som betyr at BMI bare beregnes hvis deltakeren oppgir en verdi for både høyde og vekt (slik at man unngår risikoen for en deling på null). Dessuten vises Report-spørsmålet bare hvis deltakeren svarer på alle de fire hovedspørsmålene (height, height_units, weight, weight_units).
Relevans vises og kan redigeres på følgende steder:
Vise / redigere relevans på spørsmålsnivå
Denne ligningen beregner kroppsmasseindeksen (KMI). Den stilles bare hvis personen først oppgir høyde og vekt.
Dette er redigeringsskjermen for BMI-spørsmålet.
Merk at du ikke bruker krøllparenteser når du skriver inn en relevanseligning.
Vise / redigere relevans på gruppenivå
Dette er en eksempelundersøkelse for folketelling. Den første siden spør hvor mange personer som bor sammen med deg, og lagrer det i variabelen «cohabs». Denne siden vises bare hvis du har mer enn én medboer (altså vises den for den andre personen du bor sammen med), og vises også bare hvis du har oppgitt hvordan person én er i slekt med deg (p1_rel).
Som du ser, har gruppen også relevanskriterier på spørsmålsnivå, slik at hvert spørsmål først vises når du har svart på spørsmålet før det (f.eks. {!is_empty(p1_sex)}). EM kombinerer relevansen på gruppe- og spørsmålsnivå for deg. Spørsmål i en gruppe stilles bare hvis gruppen som helhet er relevant. Deretter stilles bare den delmengden av spørsmålene i gruppen som er relevante.
Her er skjermen for å redigere relevansen på gruppenivå for dette spørsmålet:
Merk at du ikke bruker krøllparenteser når du skriver inn en relevanseligning.
Tilpasning/piping
EM lar deg enkelt gjøre enkel og kompleks betinget tilpasning av spørsmålene dine. Noen ganger trenger du bare enkel erstatning, som for eksempel: «Du sa at du kjøpte [Produkt]. Hva likte du best ved det?». Noen ganger trenger du betinget erstatning som «[Herr/Fru] [Etternavn], er du villig til å fullføre undersøkelsen vår?». I dette tilfellet vil du bruke herr eller fru basert på personens kjønn. Andre ganger trenger du enda mer kompleks erstatning (for eksempel basert på en matematisk beregning). EM støtter alle disse typene tilpasning/piping.
Betingede ligninger
Eksempelet med kroppsmasseindeks viser muligheten til å beregne en persons KMI, samtidig som personen kan oppgi høyde og vekt i metriske eller ikke-metriske enheter.
Her er weight_kg {if(weight_units == 'kg', weight, weight * .453592)}. Denne if()-funksjonen betyr at hvis deltakeren oppga vekten i kilogram, brukes den verdien. Ellers multipliseres den oppgitte verdien (som var i pund) med .453592 for å konvertere den til kilogram. Variabelen height_m bruker en lignende fremgangsmåte for å beregne personens høyde i meter, selv om høyden ble oppgitt i tommer.
BMI beregner vektformelen som {weight_kg / (height_m * height_m)}.
Til slutt tilpasser rapporten meldingen til deltakeren betinget og forteller hva vedkommende har oppgitt. («Du oppga at du er 2 meter høy og veier 70 kg.»)
Selv om det ikke vises tydelig i bildet ovenfor, bruker weight_status nestede if()-setninger for å kategorisere personen fra undervektig til alvorlig overvektig. Du kan se ligningen i visningen for å vise logikk.
I redigeringsvinduet for dette spørsmålet kan du se to ting:
- Tilpasning krever at uttrykk er omgitt av krøllparenteser
- Uttrykk kan strekke seg over flere linjer hvis du, som i dette tilfellet, vil gjøre den nestede betingede logikken lettere å lese.
Tilpassede spørsmål, svar og rapporter
Dette eksempelet viser BMI-rapporten.
Her er redigeringsvinduet for det samme spørsmålet.
Som du ser, behandles alt i krøllparenteser som et uttrykk, og det fremheves derfor med syntaksfarger (fargekodet) i det forrige bildet. Hvis du har skrivefeil (for eksempel feilstavede eller udefinerte variabelnavn eller funksjoner), viser EM en feil, som denne, der det vises at height_unit er et udefinert variabelnavn (det riktige er height_units), og at rnd() er en udefinert funksjon (riktig funksjonsnavn er round()). I begge tilfeller er feilene omgitt av en rød boks, slik at de er lettere å oppdage og rette.
Du kan også se at du raskt kan opprette komplekse rapporter, for eksempel en tabell med oppgitte verdier eller tilpassede råd.
Husk at all tilpasning krever at uttrykk er omgitt av krøllparenteser, slik at LimeSurvey vet hvilke deler av spørsmålet som er fritekst, og hvilke som skal behandles av Expression Manager.
Validering
EM styrer hvordan de fleste av de avanserte spørsmålsalternativene fungerer. Disse styrer blant annet minimum og maksimum antall svar, minimum og maksimum for enkeltverdier, minimum og maksimum for summer, og kontroll av at oppgitte verdier samsvarer med angitte tekstmønstre. Du fyller ut disse avanserte spørsmålsalternativene som før. Nå regnes imidlertid enhver verdi i disse feltene som et uttrykk, slik at du kan ha minimums- og maksimumskriterier med komplekse betingede forhold til andre spørsmål.
Siden det avanserte spørsmålsalternativet alltid regnes som et uttrykk i alle disse tilfellene, bruker du ikke krøllparenteser når du angir det.
Sidene med eksempelundersøkelser viser mange fungerende eksempler på bruk av uttrykk til validering.
Innledning
LimeSurvey bruker den nye modulen Expression Manager (EM), som lar LimeSurvey støtte mer komplekse forgreninger, vurderinger, validering og tilpasning. Den vil erstatte hvordan LimeSurvey håndterer erstatninger, betingelser og vurderinger i bakgrunnen. Den vil også øke behandlingshastigheten betydelig, siden de fleste databaseavlesninger under kjøring elimineres. EM ble utviklet av Dr. Thomas White (TMSWhite).
Denne wikisiden er den definitive referansen for syntaks og funksjonalitet i Expression Manager.
Sentrale definisjoner
- Uttrykk: Alt som er omgitt av krøllparenteser
- Så lenge det ikke er mellomrom rett etter startparentesen eller rett før sluttparentesen
- Innholdet i uttrykk evalueres av EM, slik at det kan inneholde matematiske formler, funksjoner og kompleks behandling av tekst og datoer.
- Tilpasning: Av og til kalt «piping». Dette er prosessen med å endre tekst betinget
- Du har tilgang til alle «erstatningsfelt», deltakerdata og besvarelsesdata.
- Du har også enklere tilgang til spørsmål, svar og egenskapene deres.
- Relevanseligning: Et nytt spørsmålsattributt som styrer synligheten til spørsmål
- Hvis det finnes en relevanseligning, vises spørsmålet bare hvis relevansen evalueres til sann.
- Internt blir alle kommandoene array_filter og array_filter_exclude til relevans på underspørsmålsnivå
- Ligning-spørsmålstype: En ny spørsmålstype som lagrer beregninger eller rapporter i databasen
- Den er som et Boilerplate-spørsmål, men innholdet lagres i databasen selv om du har valgt «Skjul alltid dette spørsmålet»
- Spørsmålskode: Dette er det foretrukne variabelnavnet for EM
- Dette kan være et beskrivende navn som angir hensikten med spørsmålet, noe som gjør kompleks logikk lettere å lese
- Gyldige spørsmålskoder skal IKKE begynne med et tall. Hvis du bruker spørsmålskoden til å nummerere spørsmålene, bruker du bare «q1», «q1a» eller «g1q2».
- Dette er det som i dag blir variabelnavnet hvis du eksporterer data til SPSS eller R. Hvis du gjør statistiske analyser, har du sannsynligvis allerede gjort denne unik.
Må jeg bruke EM?
Det korte svaret er nei (men også ja).
EM er fullt bakoverkompatibel med eksisterende undersøkelser. Hvis du er fornøyd med å bruke betingelser og vurderinger slik LimeSurvey gjorde i versjoner <= 1.91+, kan du fortsette med det.
EM erstatter imidlertid helt hvordan LimeSurvey internt håndterer betingelser. Selv om du fortsatt kan bruke betingelseseditoren til å opprette og administrere betingelser, vil LimeSurvey 1.92 konvertere dem til tilsvarende relevanseligninger. Som en del av oppgraderingen vil LimeSurvey 1.92 automatisk konvertere alle eksisterende betingelser til relevanseligninger.
Dette bør gi deg det beste fra begge verdener: Du kan fortsette å bruke LimeSurvey slik du er vant til, men du ser den tilsvarende relevanseligningen, slik at du gradvis kan gå over til å bruke relevanseligninger direkte når du selv ønsker det.
Kan jeg blande bruk av betingelser og relevans?
Ja. Du kan bruke betingelsesredigeringen for noen spørsmål og relevansredigeringen for andre. Betingelser konverteres automatisk til relevans når du lagrer spørsmålet.
Merk: Vi antar at hvis du bruker betingelsesredigeringen, ønsker du at disse betingelsene skal overskrive en manuelt skrevet relevanseligning. Hvis du har eksisterende betingelser og vil redigere relevansen manuelt, må du derfor slette betingelsene for det spørsmålet først. Kopier den genererte relevanseligningen til et tekstredigeringsprogram, bruk betingelsesmenyen til å slette alle betingelsene for spørsmålet (dette sletter også relevansen), rediger deretter spørsmålet og lim den genererte relevanseligningen fra tekstredigeringsprogrammet inn i relevansfeltet for spørsmålet (og lagre spørsmålet). Hvis det er nok etterspørsel etter å slette betingelser uten å slette den genererte relevanseligningen, kan vi legge til en funksjon for masse-konvertering.
Hvordan bør jeg velge mellom betingelser og relevans?
Her er en liste over fordeler og ulemper ved hver av metodene:
| Metode | Fordeler | Ulemper |
|---|---|---|
| Betingelser | 1. Fint grafisk grensesnitt for å opprette enkle betingelser 2. Grensesnittet er godt dokumentert og forstått av supportteamet |
1. Støtter bare enkle sammenligninger og håndterer OG/ELLER-betingelser dårlig 2. Kaskaderende betingelser fungerer ustabilt 3. Tregt - databasekrevende, så det kan gjøre lange undersøkelser trege 4. Noen rapporterte problemer med å laste inn betingelser på nytt 5. Grensesnittet skalerer dårlig når det er dusinvis, hundrevis eller tusenvis av spørsmål 6. Kan være tregt ved konvertering av papirbaserte undersøkelser siden SGQA-navn må brukes 7. Trenger ofte en programmerer for å kode logikken som kreves for kompleks forgrening |
| Relevans | 1. Støtter svært kompleks logikk, inkludert over 80 funksjoner og matematiske operatorer/strengoperatorer 2. Perfekt støtte for kaskaderende logikk 3. Raskt - ingen ekstra databasekall, så det støtter undersøkelser med over 1000 spørsmål 4. Ingen problemer med å laste inn logikk på nytt siden SGQA-koder ikke er nødvendige 5. Syntaksutheving skalerer til undersøkelser med over 1000 spørsmål 6. Enkelt og raskt å bruke for grupper som vil digitalisere eksisterende papirbaserte undersøkelser. 7. Støtter enkelt halvstrukturerte intervjuer og epidemiologiske undersøkelser uten behov for programmerere |
1. Ikke noe grafisk grensesnitt for enkle betingelser - bruk syntaksutheving i stedet 2. Nytt, så supportteamene har ennå ikke full oversikt over EM. |
Poenget er at hvis du er fornøyd med hvordan LimeSurvey 1.91+ fungerer, er det ingen grunn til å endre måten du jobber på.
Hvilke andre fordeler har bruk av EM?
Her er noen andre grunner til at du kanskje vil bruke EM.
- Beregninger - du kan lage alle beregninger du kan tenke deg:
- Du har tilgang til alle vanlige matematiske operatorer og funksjoner
- Du har tilgang til over 70 matematiske funksjoner, datofunksjoner og funksjoner for strengbehandling
- Det er forholdsvis enkelt for utviklere å legge til nye funksjoner hvis brukerne trenger dem
- Lagring av beregninger i databasen
- Du kan nå utføre enkle og komplekse beregninger og/eller skalapoeng OG få dem lagret i databasen uten å trenge JavaScript.
- Du bruker spørsmålstypen Ligning for å få til dette.
- Vurderinger
- Du kan nå lage vurderinger eller skalapoeng fra alle spørsmålstyper, ikke bare det utvalget som tidligere ble støttet
- Du kan bruke tilpasning til å vise løpende eller totale vurderingspoeng hvor som helst - selv på samme side
- Du har mer kontroll over rapportene som genereres basert på disse vurderingspoengene
- Du kan lagre vurderingspoeng i databasen uten å trenge JavaScript
- Du kan skjule vurderingspoeng uten å trenge JavaScript eller CSS
- Erstatningsfelt
- Bruk spørsmålskoden til å sette inn verdier fra svar på tidligere spørsmål - dette gjør det lettere å lese og validere.
- Tilpasning - du kan vise tekst betinget basert på andre verdier
- Bruk riktig tittel for et emne, for eksempel (f.eks. "Hei [herr/fru] Hansen")
- Lag grammatisk korrekte setninger når entall/flertall har betydning: (f.eks. "Du har 1 barn" mot "Du har 2 barn")
- Bøy verb og substantiver riktig basert på emnets kjønn og tall.
- Nye variabelattributter - du har tilgang til følgende for tilpasningen:
- (uten suffiks) - et alias for qcode.code
- .code - den valgte besvarelseskoden for spørsmålet hvis det er relevant (ellers tom), eller tekstverdien hvis det ikke er et kodet spørsmål
- .NAOK - samme som .code, men kan inngå i beregninger eller lister selv om det er irrelevant
- .value - vurderingsverdien for spørsmålet hvis det er relevant (ellers tom), eller tekstverdien hvis det ikke er et kodet spørsmål -- tilgjengelig hvis vurderinger er aktivert for undersøkelsen, ellers alltid null
- .valueNAOK - samme som .value, men kan inngå i beregninger eller lister selv om det er irrelevant
- .shown - svaret slik det vises for brukeren
- .qid - spørsmåls-ID-en
- .gid - gruppe-ID-en
- .sgqa - SGQA-verdien for spørsmålet
- .jsName - det korrekte JavaScript-variabelnavnet for spørsmålet, uavhengig av om det er definert på denne siden eller en annen
- .qseq - spørsmålets rekkefølge (starter fra 0)
- .gseq - gruppens rekkefølge (starter fra 0)
- .mandatory - om spørsmålet er obligatorisk (Y/N)
- .question - teksten i spørsmålet
- .relevance - relevanseligningen for spørsmålet
- .grelevance - relevanseligningen for gruppen
- .relevanceStatus - om spørsmålet for øyeblikket er relevant eller ikke (boolsk verdi (kan være forskjellig i PHP og JS))
- .type - spørsmålstypen (koden på ett tegn)
- Dynamiske endringer på siden
- All relevans, alle beregninger og all tilpasning fungerer dynamisk på en side - så endringer i verdier oppdaterer siden umiddelbart
- Spørsmål kan dermed dukke opp og forsvinne dynamisk basert på om de er relevante
- Spørsmål tilpasses også dynamisk basert på besvarelser på siden, slik at du kan se løpende summer, tilpassede setninger og skreddersydde rapporter.
- Ny registreringsskjerm
- I tillegg til det nåværende dataregistreringssystemet kan du bare bruke Undersøkelse-alt-i-ett.
- Dette støtter relevans og tilpasning på siden, slik at de som registrerer data raskt kan tabulere seg gjennom og bare må fylle ut de relevante besvarelsene
- Dette kan være avgjørende hvis den som registrerer data må se tilpasningen, som også er dynamisk.
- Eliminerer behovet for det meste av tilpasset JavaScript
- EM støtter enkelt kompliserte beregninger, poengberegning, tilpasning og betinget logikk.
- Noen ting vil fortsatt kreve JavaScript (som egendefinerte oppsett og betinget skjuling av underelementer i spørsmål), men JavaScript-koden din kan bruke EM-funksjonene slik at du får tilgang til spørsmål via Qcode i stedet for SGQA, og til alle spørsmålsegenskapene som er nevnt ovenfor.
Hvilke andre nyttige nye funksjoner muliggjør EM?
Uansett om du fortsetter å bruke betingelseseditoren eller skriver relevansligninger manuelt, får du disse ekstra fordelene:
- Du kan opprette mer komplekse valideringskriterier
- Alle avanserte spørsmålsattributter (som max_answers, min_num_value_n, max_num_value) kan bruke uttrykk. Dermed kan minimums- og maksimumskriteriene enkelt justeres basert på tidligere besvarelser, selv om de står på samme side.
- EM håndterer også all validering basert på regulære uttrykk, slik at du på en robust måte kan kombinere preg- og ligningsbaserte spørsmålsattributter.
- Enkel endring av rekkefølge (eller sletting) av spørsmål og grupper
- Før versjon 1.92 kunne du ikke endre rekkefølgen på spørsmål eller grupper hvis LimeSurvey mente at slik omorganisering kunne ødelegge betingelser der de ble brukt. På samme måte kunne du ikke slette spørsmål hvis andre spørsmål var avhengige av dem.
- Med EMs syntaksutheving er det enkelt å se og kontrollere om du prøver å bruke spørsmål før de er deklarert. Derfor lar vi deg nå endre rekkefølge på eller slette spørsmål og grupper når du vil. EM oppdaterer all syntaksutheving for å vise deg mulige feil.
- Visningen for å endre rekkefølge på spørsmål er forbedret for å hjelpe med slik gjennomgang. Den viser nå spørsmålets relevanseligning og tilpasning, slik at du umiddelbart ser om noen variabler blir rosa (som betyr at de brukes før de er deklarert).
- Spørsmåls-/gruppenavigeringsindeksen er alltid tilgjengelig og nøyaktig
- Før versjon 1.92 var disse indeksene ikke tilgjengelige hvis det fantes komplekse betingelser
- Med EM kan vi garantere at de er nøyaktige.
- Deltakere kan til og med hoppe tilbake til et tidligere spørsmål, endre svaret og deretter hoppe frem igjen (eller sende inn)
- Når de hopper fremover, validerer EM alle spørsmål/grupper imellom på nytt.
- Hvis noen spørsmål blir irrelevante, settes de til NULL i databasen slik at dataene dine er internt konsistente
- Hvis noen spørsmål blir relevante eller nylig bryter regler for obligatoriske spørsmål eller validering, stopper EM på den siden og tvinger brukeren til å besvare disse spørsmålene før hun eller han hopper videre til det endelige målet.
- Automatisk konvertering av betingelser til relevans
- Når du oppgraderer databasen, genereres relevansligninger for alle eksisterende undersøkelser som har betingelser
- Hver gang du importerer en undersøkelse, opprettes relevansligninger etter behov
- Hver gang du legger til, sletter eller endrer betingelser, genererer EM den tilsvarende relevansligningen.
- Praktisk syntaksutheving
- Når EM viser relevansligningen, viser den Qcode, selv om du skrev inn en SGQA-kode, siden vi antar at dette er enklere å lese.
- Alle variabler er fargekodet for å vise om de ble deklarert før eller etter det gjeldende spørsmålet (eller før eller etter den gjeldende gruppen). Dette lar deg raskt oppdage og rette tilfeller der du prøver å bruke variabler i relevans (inkludert array_filter), tilpasning eller valideringsligninger før de er deklarert.
- I tillegg ser du de viktigste metadataene om spørsmålet hvis du holder musepekeren over den fargekodede variabelen. Dette omfatter gruppesekvensnummer, spørsmålssekvensnummer, Qcode, spørsmålsteksten og alle tilgjengelige svaralternativer (hvis det er en spørsmålstype med oppregnede svaralternativer).
- Listen over svaralternativer bruker denne syntaksen: 'answers':{key:val, ... }.
- key har syntaksen 'scale~code', der scale er svarskalaen (f.eks. for dobbel skala), og code er svarkoden.
- val har syntaksen 'value~shown', der value er vurderingsverdien (hvis vurderinger brukes, ellers code) (f.eks. Qcode.value), og shown er visningsverdien slik deltakeren ser den (f.eks. Qcode.shown)
- Dette betyr at mange undersøkelser kan bruke beregninger uten å trenge vurderingsmodus. Hvis du har oppregnede svaralternativer som er unike, ikke-desimale og ikke-negative, kan du ganske enkelt gjøre beregninger på Qcode.code-verdiene.
- Enkel gjennomgang av hele undersøkelsens logikk og innhold
- Det er en ny funksjon, Vis undersøkelseslogikk, som lar deg se alt om undersøkelsen (eller gruppen eller spørsmålet) på én enkelt side.
- Den viser detaljer på gruppe-, spørsmåls-, underspørsmåls- og svarnivå for det valgte omfanget (undersøkelse, gruppe eller spørsmål)
- Den viser også relevansen, relevansen på underspørsmålsnivå (for array_filter og array_filter_exclude), den genererte valideringsligningen (for preg og eventuelle valideringsregler som min/maks sum/antall verdier) og alle spørsmålsattributter som ikke er tomme.
- Alt er syntaksuthevet slik at du kan se mulige syntaksfeil (som ubalanserte parenteser eller bruk av variabler før de er deklarert)
- Syntaksutheving støtter rask navigering og redigering av undersøkelsen.
- Hvis du klikker på et variabelnavn, åpnes et nettleservindu (eller en fane) som viser spørsmålet og lar deg redigere det.
- Hvis du klikker på et gruppenavn, åpnes et nettleservindu (eller en fane) som viser visningen for å endre rekkefølge på grupper, slik at du enkelt kan flytte spørsmål rundt.
- Alle spørsmålsattributter er også syntaksuthevet. Dette lar deg angi og se uttrykk i avanserte spørsmålsalternativer (som å basere maks/min antall/sum av verdier på et uttrykk)
- EM-forfatteren brukte en lignende visning (litt ryddigere) slik at samarbeidende epidemiologer og etisk komité (IRB) kunne validere og godkjenne undersøkelser med tusenvis av spørsmål i svært forgrenede og tilpassede strukturerte intervjuer
Komme i gang
Den beste måten å komme i gang med EM på er å:
- Installere den nyeste stabile versjonen fra http://www.limesurvey.org/en/download
- Importere og utforske eksempelundersøkelsene.
- Utforske bruksområder og veiledninger og trinnvise eksempler.
- Utforske EM-dokumentasjonen (denne siden)
- Undersøke den innebygde EM-testpakken
- Fra en hvilken som helst undersøkelse, velg EM-alternativet under verktøy
- Tilgjengelige funksjoner viser de over 70 funksjonene og syntaksen
- Enhetstester av isolerte uttrykk
- viser eksempler på bruk av alle EM-funksjoner og operatorer, samt resultatene i PHP og JavaScript
- merk at noen få funksjoner gir ulike resultater i PHP- og JavaScript-versjonene, så denne siden lar deg planlegge EM-logikken deretter.
Hvilken funksjonalitet utvider/erstatter Expression Manager? (LimeSurvey <= 1.91+)
Betingelser => Relevans
Betingelser styrte hvilke spørsmål som var synlige. Den generelle syntaksen var SGQA operator verdi, som 111X2X3 == "Y". Betingelser kunne kombineres med OG eller ELLER, men det var vanskelig å blande OG og ELLER. Selve betingelsene ble lagret i en egen tabell, og en stor del av LimeSurveys kode var viet til å håndtere betingelser. På grunn av omfattende databasetilgang kunne behandling av mange betingelser gi merkbare ytelsesproblemer. Dessuten fikk du ofte ikke lov til å endre rekkefølge på eller slette spørsmål eller grupper når de først hadde betingelser knyttet til seg.
Vurderinger => Ligninger og mikrotilpasning
Vurderinger lot brukere lage skalapoengsummer fra en samling spørsmål. De kunne imidlertid ikke endres dynamisk på den gjeldende siden, og verdiene deres ble ikke lagret i databasen.
Erstatninger => Mikrotilpasning
Brukere kunne tilpasse noen meldinger og spørsmål basert på tidligere besvarelser. Et spørsmål kunne for eksempel være {TOKEN:FIRSTNAME}, you said {SPORT.shown} was your favorite sport. Det var imidlertid ikke mulig å gjøre betinget tilpasning (som å si «Herr» eller «Fru» avhengig av personens kjønn), eller bøye verb og substantiv, uten avansert JavaScript. Forfattere kunne lage undersøkelser som virket tilpassede, men det krevde separate spørsmål for hver permutasjon og komplekse betingelser for å avgjøre hvilke spørsmål som skulle vises.
Validering
Spørsmål kunne valideres med regulære uttrykk eller minimums-/maksimumsverdier, eller ved å la en besvarelse fungere som minimums- eller maksimumsverdi. Valideringer kunne imidlertid ikke baseres på beregninger av andre variabler uten avansert JavaScript.
Ligninger
Ligninger ble ikke støttet uten avansert JavaScript.
Ligningsspørsmålstype
Ligninger kunne ikke lagres i databasen (f.eks. sluttpoengsummen for en vurdering) uten avansert JavaScript.
Hvordan vil Expression Manager erstatte/utvide denne funksjonaliteten?
Expression Manager er en ny kjernemodul i LimeSurvey som gjør det mye enklere å støtte typen kompleks funksjonalitet som tidligere krevde egendefinert JavaScript. Den erstatter også måten LimeSurvey i dag håndterer betingelser og vurderinger på.
Ny terminologi for Expression Manager (EM)
EM «tenker» på funksjonaliteten sin i følgende termer:
- Relevansbasert forgrening - hvis et spørsmål er relevant, stilles det, ellers ikke (det gjøres f.eks. usynlig og lagres som NULL i databasen). Det finnes et nytt relevansfelt for alle spørsmålstyper, og også for hver gruppe (slik at du kan bruke et sett med betingelser på en hel gruppe uten å kopiere samme betingelse til hvert spørsmål, og/eller kombinere betinget logikk på gruppe- og spørsmålsnivå).
- Tilpasning - Når du vet hvilke spørsmål som skal stilles, angir tilpasning (av og til kalt piping) hvordan spørsmålet skal stilles. Dette lar deg støtte ikke bare enkel erstatning (som {TOKEN:FIRSTNAME}), men også bøyning av verb og substantiv basert på kjønn eller antall hos deltakerne dine. Det lar deg også endre meldingen du gir til en deltaker avhengig av om (eller hvordan) vedkommende har besvart andre spørsmål.
- Ligninger - EM legger til en ny spørsmålstype kalt Ligning som lagrer resultatet av et uttrykk. Disse ligningsresultatene beregnes og skrives til databasen, selv om du skjuler dem på siden. De er derfor nyttige for skjulte poengberegninger, navigering basert på komplekse ligninger, vurderinger og rapporter som skal genereres og være lett tilgjengelige i databasen.
Relevans og kaskaderende relevans
Alle spørsmålstyper har nå et relevansalternativ som styrer om spørsmålet vises. EM behandler hver av relevansligningene i den rekkefølgen de skal vises i undersøkelsen. Hvis uttrykket er sant (eller mangler - for å støtte eldre undersøkelser), vises spørsmålet. Hvis det ikke er relevant, skjules spørsmålet, og verdien settes til NULL i databasen. Hvis det ikke finnes relevante spørsmål i en gruppe, hoppes hele gruppen over.
Dessuten, hvis noen av variablene i et uttrykk er irrelevante, evalueres uttrykket alltid til usant. Dette muliggjør kaskaderende relevans, slik at du slipper å skrive veldig lange relevansligninger for hvert spørsmål.
Si at du har 5 spørsmål Q1–Q5, og du bare vil vise Q2 hvis Q1 ble besvart, og Q3 hvis Q2 ble besvart, osv. Relevansligningene kan da se slik ut:
| Spørsmålskode | Relevans | Spørsmål |
|---|---|---|
| Q1 | 1 | Hva heter du? |
| Q2 | Q1 | {Q1}, hvor gammel er du? |
| Q3 | Q2 | Så du er {Q2} år gammel. Er du gift? |
| Q4 | Q3 == "Y" | {Q1}, hvor lenge har du vært gift? |
| Q5 | Q4 | Hvor mange barn har du, {Q1}? |
Relevansberegningene fungerer også i JavaScript - så du kan legge alle spørsmålene ovenfor på én side, og det vil fortsatt fungere som forventet. EM erstatter faktisk helt hvordan undersøkelsesformatene alt-på-én-side, gruppe-for-gruppe og spørsmål-for-spørsmål behandles. De bruker nå alle nøyaktig samme navigeringsmotor, slik at de fungerer likt uansett undersøkelsesstil.
Så lenge du er på samme side, vil alle data du har skrevet inn fortsatt være der, bare skjult. Hvis du altså skriver inn noe informasjon, deretter velger et alternativ som gjør dem irrelevante, og så gjør dem relevante igjen, vil svarene dine fortsatt være tilgjengelige. Så snart du går til en annen side, går imidlertid alle irrelevante besvarelser tapt for å ivareta datasettets integritet.
Relevans på gruppenivå
Expression Manager støtter også relevans på gruppenivå. Dette gjør det enklere å implementere løkker. Si at du vil samle inn informasjon om opptil 10 enheter (for eksempel produkter eller personer i en husholdning), der du først avgjør hvor mange enheter som trenger oppfølging (for eksempel ved å spørre hvor mange personer som bor i husholdningen, eller ved å la deltakerne krysse av for hvilke produkter de liker fra en lang liste). Når du vet hvor mange enheter som trenger oppfølging, kan du bruke relevans på gruppenivå som {count >= 1}, {count >=2}, ... {count >= 10} for hver av de 10 gruppene med oppfølgingsspørsmål. Innenfor hver gruppe kan du ha betinget logikk på spørsmålsnivå (f.eks. kjønns- eller aldersspesifikke oppfølgingsspørsmål for hver person). Relevansligningene på spørsmåls- og gruppenivå kombineres med OG for å avgjøre hva som skal vises.
Skreddersøm / Piping
Alt innenfor krøllparenteser behandles nå som et uttrykk (med ett unntak beskrevet nedenfor). Uttrykk har tilgang til alle LimeReplacementFields, alle variabler (via flere aliaser), alle vanlige ligningsoperatorer (matematiske, logiske og sammenligninger) og titalls funksjoner (som til og med fungerer dynamisk på klientsiden).
Med disse ligningene kan du for eksempel:
- Vise skreddersydde meldinger til respondentene basert på tidligere svar
- Opprette vurderinger og vise vurderingsresultater (eller forgrene betinget eller vise meldinger) basert på disse resultatene, helt uten å bruke selve vurderingsmodulen
- Bøye verb og substantiv i spørsmål, svar og rapporter.
- Vise oppsummeringer av besvarelser før siden «Vis svarene dine» på slutten av undersøkelsen
Ligninger
Det finnes en ny spørsmålstype som heter Ligning. Den er som et Boilerplate-spørsmål, bortsett fra at den lagrer verdien av det som vises i databasen. Hvis spørsmålsteksten i et ligningsspørsmål inneholder en vurderingsberegning, lagres denne verdien i databasen i en variabel som kan vises i offentlig eller privat statistikk.
Dette løser et vanlig ønske om å lagre vurderingspoeng i databasen.
Syntaks
Alt som står innenfor krøllparenteser regnes nå som et uttrykk (med ett unntak: det må ikke være mellomrom først eller sist – dette sikrer at Expression Manager ikke prøver å behandle innebygd JavaScript).
Merk at uttrykk gjerne kan gå over flere linjer, så lenge det ikke er mellomrom etter den åpnende krøllparentesen eller før den avsluttende krøllparentesen. Dette er spesielt nyttig for nestede if()-setninger som denne:
{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',
''
)
)
)
)
)
)
)
)}
- Alle vanlige matematiske operatorer (f.eks. +,-,*,/,!)
- Alle vanlige sammenligningsoperatorer (f.eks. <,<=,==,!=,>,>=, pluss disse ekvivalentene: lt,le,eq,ne,gt,ge)
- Parenteser (slik at du kan gruppere delutrykk)
- Betingede operatorer (f.eks. &&,| | og disse ekvivalentene: and,or)
- Strenger i enkle og doble anførselstegn (som hver kan inneholde strenger med den andre typen anførselstegn)
- Kommaoperator (slik at du kan ha en liste med uttrykk og bare returnere det siste resultatet)
- Tildelingsoperator (=)
- Forhåndsdefinerte variabler (for å referere til spørsmål, spørsmålsattributter og besvarelser) – f.eks. alle SGQA-kodene
- Forhåndsdefinerte funksjoner (det finnes allerede over 70, og det er enkelt å legge til flere)
Operatorer
EM-syntaksen følger vanlig operatorprioritet:
| Nivå | Operator(er) | Beskrivelse |
|---|---|---|
| 1 | () | parenteser for gruppering eller funksjonskall |
| 2 | ! - + | unære operatorer: ikke, negasjon, unær pluss |
| 3 | * / | ganger, dele |
| 4 | + - | pluss, minus |
| 5 | < <= > >= lt le gt ge | relative sammenligninger |
| 6 | == != eq ne | likhetssammenligninger |
| 7 | and | logisk OG |
| 8 | or | logisk ELLER |
| 9 | = | tildelingsoperator |
| 10 | , | kommaoperator |
Advarsel om plussoperatoren (+)
For å sikre samsvar mellom JavaScript og PHP utfører plussoperatoren (+) addisjon hvis begge operandene er numeriske, men sammenkobling hvis begge delene er ikke-numeriske strenger. Vi anbefaler imidlertid å bruke funksjonen join() for sammenkobling og funksjonen sum() for addisjon, siden det gjør hensikten tydeligere og unngår uventede resultater hvis du forventet strenger, men fikk tall (eller omvendt).
Advarsel om forskjell mellom tall og streng og alfabetisk sammenligning
Når du vil sammenligne verdier med relative sammenligninger eller likhetssammenligninger, må du være oppmerksom på typeforskjeller. En verdi som er skrevet inn av brukeren, eller en valgt svarkode, kan brukes som tall hvis den tydelig er et tall.
Hvis du omgir en av verdiene med "tvinges sammenligningen til å bli tekst (alfabetisk sammenligning). Hvis du vil sammenligne numerisk, må du aldri sette anførselstegn, ", rundt tallet.
For eksempel er Q0.NAOK > "50" sant hvis Q0.NAOK er et numerisk spørsmål med verdien 9. Dette skyldes at operatoren > antar alfabetisk sammenligning og ikke numerisk.
For å være sikker på at du sammenligner heltallsverdier, kan du bruke intval(Q0.NAOK) > 50. Husk at hvis Q0.NAOK ikke er et tall (tom eller en streng), er intval(Q0.NAOK) == 0. For å sammenligne strengverdier ("A" < "B") bruker du strcmp direkte: strcmp(Q0.NAOK,"B") eller strcmp(Q0.NAOK,"A5").
Forsiktighet ved bruk av tildelingsoperatoren (=)
Merk at du bør unngå tildelingsoperatorer med mindre det er absolutt nødvendig, siden de kan gi uventede bivirkninger. Hvis du for eksempel endrer verdien av en tidligere besvarelse, beregnes ikke den kaskaderende relevans- og valideringslogikken mellom det spørsmålet og det gjeldende spørsmålet på nytt, og du kan ende opp med internt inkonsistente data (f.eks. spørsmål som forblir besvart, men burde vært satt til NULL, eller spørsmål som hoppes over, men burde vært besvart). Generelt bør du, hvis du vil tildele en verdi til en variabel, opprette en spørsmålstype Ligning og bruke et uttrykk til å sette verdien. Det finnes imidlertid sjeldne tilfeller der man virkelig trenger denne operatoren, så vi har gjort den tilgjengelig.
For å advare deg om denne operatoren vises den i rød skrift i syntaksligningene (slik at du ikke forveksler den med «==»)
Bruk av tildelingsoperatoren
De viktigste grunnene til at du kan ønske å bruke tildeling er:
- Du må sette standardverdien for et spørsmål som ikke godtar forhåndsvalg via ligning (for eksempel listeradio, der brukergrensesnittet lar deg velge ett av svaralternativene, men ikke la deg skrive inn en ligning). Vær imidlertid forsiktig, siden LimeSurvey ikke kan validere at ligningen din gir et av de tillatte svarene for det spørsmålet.
- Du må tvinge frem en endring av besvarelsen på et tidligere spørsmål basert på en senere besvarelse
- Du trenger en kompleks kvote: bruk ett skjult enkeltvalg for kvoten og sett det ved hjelp av tildeling
- osv.
Du kan bruke hele Expression Manager-systemet til dette formålet.
Noen eksempler:
- Sette svaret på et kort tekstspørsmål til små bokstaver :
{QCODE=strtolower(QCODE.NAOK)} - Sette et forhåndsvalg for en matrisespørsmålstype ved starten av en undersøkelse :
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Sette et forhåndsvalg for en matrisetekst-spørsmålstype ved starten av en undersøkelse :
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - Sette et svar med betingelse :
{QCODE=if(YesNo="Y","A1","")}
XSS-sikkerhet
Med XSS-sikkerhet aktivert kan enkelte funksjoner i Expression Manager ikke brukes:
- å starte en HTML-tagg i ett uttrykk og avslutte den i et annet uttrykk
- å bruke et komplekst uttrykk i en URL.
Eksempel og løsning
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}fungerer ikke med XSS-sikkerhet. Her kan du i stedet bruke{if(1,"<strong>information</strong>","information")}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>. Her kan du bruke et ligningsspørsmål, fordi det er tillatt å bruke en fullstendig spørsmålskode:<a href="/script.php?value={EQUATION.NAOK}">next</a>
Tilgang til variabler
Expression Manager gir skrivebeskyttet tilgang til de variablene du måtte trenge. For bakoverkompatibilitet gir den tilgang til følgende:
- TOKEN:xxx - verdien av en TOKEN (f.eks. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (kun for undersøkelser som IKKE er anonyme).
- QCODE.shown - visningsverdien til et svar (f.eks. "Ja") ved bruk av Expression Manager.
- Alle {XXX}-verdier som brukes av maler.
- I spørsmålstekst kan du bruke {QID}, som erstattes av spørsmåls-ID-en, og {SGQ}, som erstattes av SGQA-koden til spørsmålet.
I tillegg lar Expression Manager deg referere til variabler med spørsmålskoden (kolonnen 'title' i spørsmålstabellen i databasen). Dette er også variabeletiketten som brukes når du eksporterer data til SPSS, R eller SAS. Hvis du for eksempel har spørsmål om navn, alder og kjønn, kan du kalle variablene name, age og gender i stedet for 12345X13X22, 12345X13X23 og 12345X13X24. Dette gjør ligninger enklere for alle å lese og validere logikken i, og gjør det mulig å flytte rundt på spørsmål uten å holde styr på gruppe- eller spørsmålsnumre.
Viktig: Det er kun trygt å referere til variabler som forekommer på foregående sider eller i foregående spørsmål.
Videre lar Expression Manager deg få tilgang til mange egenskaper ved spørsmålet:
| Syntaks | Betydning | Eksempel | Eksempelresultat |
|---|---|---|---|
| Qcode | et alias for Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | den valgte svarkoden for spørsmålet hvis det er relevant (ellers tom), eller tekstverdien hvis det ikke er et kodet spørsmål | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | samme som Qcode - se omtalen av NAOK | {gender.NAOK} | 'M' |
| Qcode.value | vurderingsverdien for spørsmålet hvis det er relevant (ellers tom), eller tekstverdien hvis det ikke er et kodet spørsmål | {gender.value} | '1' |
| Qcode.valueNAOK | samme som Qcode.value - se omtalen av NAOK | {gender.valueNAOK} | '1' |
| Qcode.shown | visningsverdien for spørsmålet | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | teksten til spørsmålet | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | om spørsmålet er obligatorisk (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | det interne spørsmålsnummeret (ikke det sekvensielle nummeret) | {gender.qid} | 337 |
| Qcode.type | spørsmålstypen | {gender.type} | 'G' |
| Qcode.jsName | det riktige JavaScript-navnet for spørsmålet, uavhengig av om det er deklarert på denne siden eller ikke | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | det interne gruppenummeret (ikke det sekvensielle nummeret) | {gender.gid} | 3 |
| Qcode.qseq | det sekvensielle nummeret til spørsmålet, med start fra 0 | {gender.qseq} | 5 |
| Qcode.gseq | det sekvensielle nummeret til gruppen, med start fra 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | om spørsmålet er relevant for øyeblikket (0 eller 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | relevanseligningen på spørsmålsnivå | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | relevanseligningen på gruppenivå | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | SGQA-verdien for dette spørsmålet | {gender.sgqa} | '1827X3X337' |
Problem med HTML-skriveprogrammet
Hvis du bruker HTML-skriveprogrammet, erstattes enkelte tegn med HTML-entiteter.
- & med &
- < med <
- > med >
Hvis du bruker HTML-skriveprogrammet, må du bruke:
- and for &
- lt for <
- le for <=
- gt for >
- ge for >=
Her er detaljene om hvordan du bygger en Qcode (og får tilgang til enkelte egenskaper) per spørsmålstype. Generelt bygges Qcode slik:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Underspørsmålskode og skala-ID må brukes eller ikke, avhengig av spørsmålstypen - se tabellen nedenfor. For comment og other er spørsmålskodene QuestionCode_comment og QuestionCode_other
| Type | Beskrivelse | Kode | Underspørsmål | Svaralternativer | Skalaer | Svarkode | Vist svar | Relevans |
|---|---|---|---|---|---|---|---|---|
| 5 | 5-punkts valg, radioknapper | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Matrise (10 poengsvalg), radioknapper | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Matrise (5-poengsvalg), radioknapper | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Matrise (fleksible etiketter), dobbel skala | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Matrise (fleksibel) - kolonneformat | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Matrise (fleksibel) - radformat | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Matrise (øk/uendret/reduser), radioknapper | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Matrise (flere fleksible) 1 til 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Matrise (flere fleksible) tekst | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Matrise (ja/usikker/nei), radioknapper | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Standardtekst-spørsmål | Q11 | {Q11.shown} | |||||
| D | Dato | Q12 | {Q12} | {Q12.shown} | ||||
| * | Ligning | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Filopplasting (registrerer antall opplastede filer) | Q14 | {Q14} | {Q14>0} | ||||
| G | Kjønn, rullegardinliste | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Ekstra lang fritekst | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Språkspørsmål | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Liste - rullegardinliste | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Liste, rullegardinliste/radioknapper | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Liste med kommentar, rullegardinliste/radioknapper + tekstområde | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Lang fritekst | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Flervalg, avkryssingsbokser | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Flervalg med kommentarer, avkryssingsboks + tekst | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Flere numeriske spørsmål | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Flere korte tekstfelt | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Numerisk spørsmålstype | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Rangering | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Kort fritekst | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Ja/Nei, radioknapper | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
De reserverte variablene 'this', 'self' og 'that'
Ofte vil du evaluere alle deler av et spørsmål, for eksempel telle hvor mange underspørsmål som er besvart, eller summere poengsummene. Andre ganger vil du bare behandle bestemte rader eller kolonner i et spørsmål (for eksempel hente rad- eller kolonnesummer og lagre dem i databasen). Disse reserverte variablene gjør dette relativt enkelt.
Variabelen 'this' brukes utelukkende i de avanserte spørsmålsvalgene "Valideringsligning for hele spørsmålet" og "Valideringsligning for underspørsmål". Den utvides til variabelnavnene til hver av cellene i disse spørsmålene. Hvis du for eksempel vil sikre at hver verdi er større enn tre, setter du "Valideringsligning for underspørsmål" til (this > 3).
Variablene 'self' og 'that' er kraftigere og fungerer som makroer som utvides før ligningene behandles. Syntaksvalgene er:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix er et av de vanlige Qcode-suffiksene (f.eks. NAOK, value, shown)
sub-selector er en av:
- comments - kun underspørsmål som er kommentarer (f.eks. fra flervalg med kommentarer og liste med kommentar)
- nocomments - kun underspørsmål som ikke er kommentarer
- sq_X - der X er en rad- eller kolonneidentifikator. Kun underspørsmål som samsvarer med mønsteret X velges. Merk at søket gjøres på hele kodeidentifikatoren, og at sq_X samsvarer med og inkluderer underspørsmålene nX, X og Xn (f.eks. hvis du bruker sq_1, inkluderes underspørsmålene a1, 1a, 1, 11 eller 001). Vær oppmerksom på spørsmålstypen med dobbel skala, der underspørsmålskodene er QCODE_SQCODE_1 og QCODE_SQCODE_1, og på rangeringsspørsmål, der underspørsmålskodene er QCODE_1, QCODE_2 ....
- nosq_X - der X er en rad- eller kolonneidentifikator. Kun underspørsmål som ikke samsvarer med mønsteret X velges. Merk at søket gjøres på hele kodeidentifikatoren, og at nosq_X samsvarer med, og ikke inkluderer, underspørsmålene nX, X og Xn
Eksempler:
- Er noen del av et spørsmål besvart? {count(self.NAOK)>0}
- Hva er vurderingspoengsummen for dette spørsmålet? {sum(self.value)}
Du kan også bruke disse til å hente rad- og kolonnesummer. Si at du har en matrise med tall med radene A-E og kolonnene 1-5.
- Hva er totalsummen? {sum(self.NAOK)}
- Hva er summen av rad B? {sum(self.sq_B.NAOK)}
- Hva er summen av kolonne 3? {sum(self.sq_3.NAOK)}
Variabelen 'that' er som 'self', men lar deg referere til andre spørsmål. Syntaksen er:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname er spørsmålsnavnet uten underspørsmålsendelser. Hvis du for eksempel oppretter et spørsmål 'q1', er det dets qname
Eksempler:
- Er noen del av spørsmål q1 besvart? {count(that.q1.NAOK)>0}
- Hva er vurderingspoengsummen for q2? {sum(that.q2.NAOK)}
- Hva er totalsummen for q3? {sum(that.q3.NAOK)}
- Hva er summen av rad C i q4? {sum(that.q4.sq_C.NAOK)}
- Hva er summen av kolonne 2 i q4? {sum(that.q4.sq_2.NAOK)}
Variablene 'self' og 'that' kan brukes i all relevans, validering og tilpasning.
Én ting å være oppmerksom på: Når du bruker funksjonen Vis logikkfil, viser den den utvidede verdien av 'self' og 'that'. Dette lar deg se selve ligningen som genereres, slik at du (og Expression Manager) kan validere at variablene finnes. Dette kan virke forvirrende, siden du kan se ganske lange ligninger. Hvis du redigerer spørsmålet, ser du imidlertid den opprinnelige ligningen med 'self' og/eller 'that'.
Merk også at du ikke bør bruke disse variablene hvis (a) du eksplisitt vil navngi hver variabel som brukes i en ligning, eller (b) du bruker variabler som ikke har underspørsmål (f.eks. spørsmål med ett enkelt svar). I slike tilfeller er det overkill å sette 'that' foran en variabel, og du risikerer å få uventede resultater.
Bruk av NAOK
NAOK --> «Not Applicable» (NA) is alright (OK), det vil si at «Ikke relevant» er greit
Bruk av NAOK betyr at alle eller noen av variablene er irrelevante (f.eks. «Not Applicable» (NA) is alright (OK)).
Når du bruker en variabel fra et spørsmål i en ligning, og dette spørsmålet (eller underspørsmålet) er skjult av en betingelse, deaktiveres hele ligningen.
For eksempel: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) gir alltid en tom streng hvis ett underspørsmål i Q1 er filtrert bort. For å telle antall avmerkede underspørsmål i et slikt spørsmål kan du bruke count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Hvis underspørsmålet er skjult, returnerer Expression Manager en tom streng.
Uten NAOK: Hvis ett spørsmål eller ett underspørsmål er skjult, returnerer Expression Manager alltid en tom streng, noe som tilsvarer usant.
Suffikset .shown bruker alltid NAOK-systemet (tom streng hvis skjult), men hvis du trenger svarkoden, er det alltid lurt å legge til .NAOK etter spørsmålskoden, med mindre du trenger det motsatte og vet hva du gjør.
Et annet eksempel og mer informasjon finner du under Overriding Cascading Conditions
Tilgang til funksjoner
Expression Manager gir tilgang til matematiske funksjoner, strengfunksjoner og brukerdefinerte funksjoner, som vist nedenfor. Funksjonene har PHP- og JavaScript-ekvivalenter, slik at de fungerer likt på serversiden (PHP) og klientsiden (JavaScript). Det er enkelt å legge til nye funksjoner.
Implementerte funksjoner
Følgende funksjoner er tilgjengelige for øyeblikket:
| Funksjon | Betydning | Syntaks |
|---|---|---|
| abs | Absolutt verdi | number abs(number) |
| acos | Arc cosinus | number acos(number) |
| addslashes | Setter skråstreker foran spesialtegn i en tekststreng | string addslashes(string) |
| asin | Arc sinus | number asin(number) |
| atan | Arc tangent | number atan(number) |
| atan2 | Arc tangent av to variabler | number atan2(number, number) |
| ceil | Avrund brøker opp | number ceil(number) |
| checkdate | Returnerer sann (1) hvis datoen er gyldig i den gregorianske kalenderen | bool checkdate(month,day,year) |
| convert_value | Konverterer en numerisk verdi ved hjelp av en inndatatabell og en utdatatabell med numeriske verdier | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Cosinus | number cos(number) |
| count | Teller antall besvarte (ikke-tomme) spørsmål i listen | number count(arg1, arg12, ..., argN) |
| countif | Teller antall besvarte spørsmål i listen som er lik det første argumentet | number countif(matches, arg1, arg2, ... argN) |
| countifop | Teller antall besvarte spørsmål i listen som oppfyller kriteriet (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Formatere lokaldato/-tid | string date(format [, timestamp=time()]) |
| exp | Regner ut eksponenten til e | number exp(number) |
| fixnum | Viser tall med komma som desimalskilletegn, om nødvendig | string fixnum(number) |
| floor | Avrund brøker ned | number floor(number) |
| gmdate | Formatere GMT-dato/-tid | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Konverterer alle HTML-entiteter til de aktuelle tegnene (bruker alltid ENT_QUOTES og UTF-8) | string html_entity_decode(string) |
| htmlentities | Konverterer alle aktuelle tegn til HTML-entiteter (bruker alltid ENT_QUOTES og UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Konverterer spesialtegn til HTML-entiteter (bruker alltid ENT_QUOTES og UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Konverterer spesielle HTML-entiteter tilbake til tegn (bruker alltid ENT_QUOTES og UTF-8) | string htmlspecialchars_decode(string) |
| idate | Formater lokal tid/dato som heltall (integer) | string idate(string [, timestamp=time()]) |
| if (Updated in 3.0.2 ) | Excel-lignende if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
| implode | Sett sammen matriseelementer med en tekststreng | string implode(glue,arg1,arg2,...,argN) |
| intval | Få heltall-verdien av et variabel | int intval(number [, base=10]) |
| is_empty | Avgjør om en variabel anses som tom | bool is_empty(var) |
| is_float | Finner ut om typen til en variabel er flyttall | bool is_float(var) |
| is_int | Finner ut om typen til en variabel er heltall | bool is_int(var) |
| is_nan | Finner ut om verdien er ikke et nummer | bool is_nan(var) |
| is_null | Finner ut om en variabel er NULL | bool is_null(var) |
| is_numeric | Finner ut om en variabel er et tall eller en numerisk tekststreng | bool is_numeric(var) |
| is_string | Finner ut om typen til en variabel er tekststreng | bool is_string(var) |
| join (New in 2.0 build 130129) | Setter sammen elementer til en ny tekststreng | join(arg1, arg2, ... argN) |
| list | Returnerer en kommaseparert liste med ikke-tomme verdier | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Returnerer en liste, skilt med «glue», over den angitte spørsmålsegenskapen (retProp) fra spørsmål i listen som oppfyller kriteriet (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | Logaritmen til tallet med den oppgitte basen, eller den naturlige logaritmen hvis basen utelates. | number log(number,base=e) |
| ltrim | Fjerner mellomrom (eller andre tegn) fra begynnelsen av en tekststreng | string ltrim(string [, charlist]) |
| max | Finn den høyeste verdi | number max(arg1, arg2, ... argN) |
| min | Finn den laveste verdi | number min(arg1, arg2, ... argN) |
| mktime | Henter UNIX timestamp for en dato (alle de 6 argumentene er valgfrie) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Modulo-funksjonen støttes ikke ennå. Du kan bruke funksjonen floor() i stedet | floor(x/y)==(x/y) |
| nl2br | Setter inn HTML-linjeskift foran alle linjeskift i en tekststreng | string nl2br(string) |
| number_format | Formater et nummer med grupperte tusener | string number_format(number) |
| pi | Få verdien av pi | number pi() |
| pow | Eksponentiell uttrykk | number pow(base, exp) |
| quoted_printable_decode | Konverterer en quoted-printable-tekststreng til en 8-bits tekststreng | string quoted_printable_decode(string) |
| quoted_printable_encode | Konverterer en 8-bits tekststreng til en quoted-printable-tekststreng | string quoted_printable_encode(string) |
| quotemeta | Sett metategn i anførselstegn | string quotemeta(string) |
| rand | Generer tilfeldig heltall, se dette eksempelet | int rand() OR int rand(min, max) |
| regexMatch | sammenligner en tekststreng med et regulært uttrykk | bool regexMatch(pattern,input) |
| round | Avrunder tall til valgfri presisjon | number round(val [, precision]) |
| rtrim | Fjerner mellomrom (eller andre tegn) fra slutten av en tekststreng | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Returnerer en formatert tekststreng | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Kvadratrot | number sqrt(arg) |
| stddev | Beregner utvalgets standardavvik for listen med tall | number stddev(arg1, arg2, ... argN) |
| str_pad | Fyller ut en tekststreng til en bestemt lengde med en annen tekststreng | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Repeter en streng | string str_repeat(input, multiplier) |
| str_replace | Erstatter alle forekomster av søketeksten med erstatningsteksten | string str_replace(search, replace, subject) |
| strcasecmp | Sikker binærsammenligning av tekststrenger som ikke tar hensyn til små eller store bokstaver | int strcasecmp(str1, str2) |
| strcmp | Binærsikker sammenligning av tekststrenger | int strcmp(str1, str2) |
| strip_tags | Fjerne HTML og PHP tags fra en strenge | string strip_tags(str, allowable_tags) |
| stripos | Finner posisjonen til første forekomst av en unicode-tekststreng uten hensyn til store og små bokstaver (starter på 0, returnerer usann hvis den ikke finnes) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Tar bort anførselstegn fra en tekststreng | string stripslashes(string) |
| stristr | strstr som ikke tar hensyn til små eller store bokstaver | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Få lengde på strenge | int strlen(string) |
| strpos | Finner posisjonen til første forekomst av en unicode-tekststreng (starter på 0, returnerer usann hvis den ikke finnes) | int strpos(haystack, needle [ offset=0]) |
| strrev | Reverser en tekststreng | string strrev(string) |
| strstr | Første forekomsten av en tekststreng | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Gjør en tekststreng om til små bokstaver | string strtolower(string) |
| strtotime | Tolker nesten enhver engelsk tekstbeskrivelse av dato og tid og gjør den om til en Unix timestamp | int strtotime(string) |
| strtoupper | Gjør en tekststreng om til store bokstaver | string strtoupper(string) |
| substr | Returnerer en del av en unicode-tekststreng | string substr(string, start [, length]) |
| sum | Regne ut summen av alle verdier i en matrise | number sum(arg1, arg2, ... argN) |
| sumifop | Summerer verdiene til besvarte spørsmål i listen som oppfyller kriteriet (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangent | number tan(arg) |
| time | Returner gjeldende UNIX timestamp | number time() |
| trim | Fjerner mellomrom (eller andre tegn) fra begynnelsen og slutten av en tekststreng | string trim(string [, charlist]) |
| ucwords | Gjør første tegn i hvert ord i en tekststreng om til stor bokstav | string ucwords(string) |
| unique | Returnerer "sann" hvis alle ikke-tomme besvarelser er unike | boolean unique(arg1, ..., argN) |
Funksjoner som er planlagt eller vurderes
Andre funksjoner som er planlagt (eller vurderes), men som ikke er implementert ennå, er blant annet følgende. Noen av dem er til for bakoverkompatibilitet med et annet undersøkelsesverktøy.
| Syntaks | Betydning | Kommentarer |
|---|---|---|
| e() | returnerer verdien av e | |
| formatDate(X,PAT) | returnerer tekstverdien av datoen X formatert etter Java-datoformatmønsteret PAT | |
| formatNumber(X,PAT) | returnerer tekstverdien av tallet X formatert etter Java-tallformatmønsteret PAT | |
| getAnsOption(X) | Kjernetillegget ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Kjernetillegget ExpressionAnswerOptions | |
| getRelevance(X) | returnerer relevanseligningen for spørsmål X | |
| getStartTime() | returnerer datoen som tilsvarer systemtiden da intervjuet ble startet | |
| getType(X) | returnerer tekstnavnet på datatypen – f.eks. *NA* hvis isNA() | |
| gotoFirst() | hopper til den første relevante gruppen av spørsmål – dette bryter med systemets normale flyt | |
| gotoNext() | hopper til neste relevante gruppe av spørsmål – dette bryter med systemets normale flyt | |
| gotoPrevious() | hopper til forrige relevante gruppe av spørsmål – dette bryter med systemets normale flyt | |
| isAsked(X) | returnerer true hvis svaret verken er *NA*, *INVALID* eller *UNASKED* | |
| isInvalid(X) | returnerer true hvis svaret er av typen *INVALID* | |
| isNA(X) | returnerer true hvis svaret er av typen *NA* | |
| isNotUnderstood(X) | returnerer true hvis svaret er av typen *HUH* | |
| isRefused(X) | returnerer true hvis svaret er av typen *REFUSED* | |
| isSpecial(X) | returnerer true hvis svaret er av typen *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* eller *HUH* | |
| isUnknown(X) | returnerer true hvis svaret er av typen *UNKNOWN* | |
| jumpTo(X) | hopper til gruppen som inneholder det navngitte spørsmålet – dette bryter med systemets normale flyt | |
| jumpToFirstUnasked() | hopper til det første ikke-stilte spørsmålet |
|
| lastIndexOf(X,Y) | returnerer den siste indeksen (base 0) til teksten Y i teksten X. Returnerer -1 hvis Y ikke finnes i X | |
| list(X,...) | en tekststreng med en kommaseparert liste over de positive verdiene, med «og» mellom de to siste | |
| mean(X,...) | returnerer gjennomsnittet av en liste med verdier | |
| numAnsOptions(X) | returnerer antall svaralternativer spørsmål X har | |
| orlist(X,...) | en tekststreng med en kommaseparert liste over de positive verdiene, med «eller» mellom de to siste | |
| parseDate(X,PAT) | returnerer datoverdien av teksten X tolket med Java-datoformatmønsteret PAT | |
| parseNumber(X,PAT) | returnerer tallverdien av teksten X tolket med Java-tallformatmønsteret PAT | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | questionList = liste over spørsmålsidentifikatorer avgrenset med loddrett strek; attributeList = liste over attributter avgrenset med loddrett strek (som question#, title, text, type – slik at du selv kan bestemme hva som vises); attributeTitleList = liste over tabelloverskrifter avgrenset med loddrett strek, slik at rapporten kan internasjonaliseres. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | questionList = liste over spørsmålsidentifikatorer avgrenset med loddrett strek; attributeList = liste over attributter avgrenset med loddrett strek (som question#, title, text, type – slik at du selv kan bestemme hva som vises); attributeTitleList = liste over tabelloverskrifter avgrenset med loddrett strek, slik at rapporten kan internasjonaliseres. |
Expression Manager vet hvilke variabler som er lokale
For å bygge JavaScript for siden på riktig måte må Expression Manager vite hvilke variabler som settes på siden, og hva JavaScript-ID-en deres er (f.eks. for document.getElementById(x)). Den må også vite hvilke variabler som settes på andre sider (slik at den kan sikre at de nødvendige <input type='hidden' value='x'>-feltene finnes og er fylt ut).
Kaskaderende betingelser
Hvis en av variablene er irrelevant, blir hele ligningen irrelevant (false). I tabellen nedenfor betyr N/A at en av variablene ikke var relevant.
| Operator | Eksempel | a | b | Resultat |
|---|---|---|---|---|
| + (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 |
| funksjon | sum(a,b,b) | N/A | 5 | false |
| funksjon | max(a,b) | N/A | 5 | false |
| funksjon | min(a,b) | N/A | 5 | false |
| funksjon | implode(', ',a,b,a,b) | N/A | 5 | false |
| funksjon | if(a,a,b) | N/A | 5 | false |
| funksjon | is_empty(a) | N/A | false | |
| funksjon | is_empty(a) | 0 (eller tom) | true | |
| funksjon | !is_empty(a) | N/A | false |
Overstyre kaskaderende betingelser
Si at du vil vise en løpende sum av alle relevante svar. Du kan da prøve ligningen {sum(q1,q2,q3,...,qN)}. Internt oversettes denne imidlertid til LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Hvis en av verdiene q1–qN er irrelevant, vil ligningen derfor alltid returnere false. I dette tilfellet vil sum() vise 0 helt til alle spørsmålene er besvart.
For å komme rundt dette kan hver variabel få tillegget «.NAOK» (som betyr at «Not Applicable» er OK). I slike tilfeller skjer følgende. Si at du har en variabel q1.NAOK:
- q1 legges ikke til i LEManyNA()-leddet
- LEMval('q1') vil fortsatt sjekke om besvarelsen er relevant, og returnerer '' hvis den ikke er det (slik at enkeltstående irrelevante besvarelser ignoreres, uten at de gjør hele uttrykket ugyldig).
Løsningen på problemet med den løpende summen er altså å bruke ligningen sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Bruken av suffikset .NAOK lar også forfattere utforme undersøkelser som har flere mulige veier, men som senere samles i felles veier. Si for eksempel at emner besvarer en undersøkelse på en måte som ligger utenfor det normale svarområdet. Forfatteren kan da varsle emnene om at de kanskje ikke får gyldige resultater, og spørre om de virkelig vil fortsette med undersøkelsen. Hvis de svarer Ja, vises resten av spørsmålene. Betingelsen for «resten av spørsmålene» vil da sjekke om de første svarene lå innenfor det normale området ELLER om emnet svarte Ja på spørsmålet som bare er relevant hvis de svarte utenfor det normale området.
Hvordan støtter Expression Manager betinget mikrotilpasning?
Her er et eksempel på mikrotilpasning (der spørsmålstype 'expr' betyr en ligning):
| Spørsmålskode | Relevanse | Spørsmålstype | Spørsmål |
|---|---|---|---|
| name | 1 | text | Hva heter du? |
| age | 1 | text | Hvor gammel er du? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Beklager, {name}, du er for {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for denne testen. |
| kids | !badage | yesno | Har du barn? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Hvor mange barn har du? |
| kid1 | parents && numKids >= 1 | text | Hvor gammelt er ditt første barn? |
| kid2 | parents && numKids >= 2 | text | Hvor gammelt er ditt andre barn? |
| kid3 | parents && numKids >= 3 | text | Hvor gammelt er ditt tredje barn? |
| kid4 | parents && numKids >= 4 | text | Hvor gammelt er ditt fjerde barn? |
| kid5 | parents && numKids >= 5 | text | Hvor gammelt er ditt femte barn? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, du sa at du er {age} år og at du har {numKids} barn. Summen av alderen til de {min(numKids,5)} første barna dine er {sumage} |
Alle disse spørsmålene kan ligge på én enkelt side (f.eks. i samme gruppe), og bare de relevante spørsmålene vises. Mens du skriver inn barnas alder, oppdateres dessuten sum()-uttrykket i det siste spørsmålet dynamisk på siden.
Expression Manager gir denne funksjonaliteten ved å omgi hvert uttrykk med et navngitt <span>-element. Hver gang en verdi endres, beregnes uttrykket som skal vises i dette <span>-elementet på nytt, og visningen genereres på nytt. Du kan ha titalls, eller til og med hundrevis, av slike tilpassede uttrykk på samme side, og siden viser dem alle på nytt i én enkelt skjermoppdatering.
Oversikt over LimeSurvey 1.91+ og tilsvarende funksjonalitet i Expression Manager
| Gammel funksjon | Ny funksjon | Kommentarer |
|---|---|---|
| Betingelser | Relevanse | Du kan bruke svært komplekse betingede ligninger og få tilgang til et bredere utvalg av variabler |
| Vurderinger | Ligning | Alle vurderingsscorer kan omstruktureres til en ligning. Dette sikrer både at scoren skrives til databasen, og at du ser dynamiske endringer i scoreverdien på den gjeldende siden |
| Erstatninger | Expression Manager | Kjernemotoren tar inndatateksten og behandler alt innenfor krøllparenteser som et uttrykk – slik håndteres alle historiske erstatningstyper. For ikke å ødelegge innebygd JavaScript behandler Expression Manager bare innhold mellom krøllparenteser så lenge (a) det ikke er innledende eller avsluttende mellomrom inni krøllparentesene – f.eks. er {expr} et uttrykk, mens { expr}, {expr } og { expr } ikke er uttrykk. Expression Manager behandler heller ikke innhold i sine egne tekststrenger (f.eks. gir {list('hi','there {braces}')} «hi there {braces}»). Den ignorerer også escapede krøllparenteser (f.eks. \{this is not an expression\}) |
| Validering | Expression Manager | Planen er å la Expression Manager behandle de nåværende min/maks-spørsmålsattributtene. På den måten kan min/maks-verdiene selv være uttrykk |
Syntaksutheving
For å hjelpe deg med å skrive og validere uttrykk tilbyr EM syntaksutheving med følgende funksjoner:
Typer og betydning av syntaksutheving
| Farge | Eksempel | Betydning | Verktøytips | Kommentarer |
|---|---|---|---|---|
| beige bakgrunn | Eksempel | hele ligningen | ingen | Alt innenfor krøllparenteser som gjenkjennes som en ligning (dvs. uten mellomrom først eller sist) får beige bakgrunn, slik at det skiller seg fra teksten rundt |
| fet rød tekst | Eksempel | En feil | En forklaring på feilen | Kan være en ukjent variabel eller en feil i en funksjon, ... Undersøkelsen kan være helt ødelagt, men dette vises ikke for offentlige brukere. |
| blå tekst | Eksempel | funksjonsnavn | betydning og tillatt syntaks | funksjonsnavn, eller ting som bør være funksjoner fordi de etterfølges av en åpen parentes, vises i fet blå tekst. Verktøytips viser betydningen og tillatt syntaks for funksjonen. |
| grå tekst | Eksempel | streng | ingen | strenger med enkle og doble anførselstegn vises i grå tekst |
| cyan tekst | Eksempel | variabel satt på samme side, | [navn eller SGQA-kode]: spørsmål; verdi; svarliste som viser kodene for hver verdi | Alle variabler som er satt på samme side som gjeldende spørsmål vises i cyan tekst, som viser at de kan oppdateres i JavaScript. Verktøytipset viser navnet, selve spørsmålet og Gjeldende verdi (eller blankt hvis ikke satt). Hvis spørsmålstypen forventer svar fra et oppregnet verdisett, vises koblingen mellom kodene og visningsverdiene. |
| grønn tekst | Eksempel | variabel satt på en tidligere side | [navn eller SGQA-kode]: spørsmål; verdi; svarliste som viser kodene for hver verdi | Alle variabler som er satt på en tidligere side vises i fet grønn tekst. Verktøytipset viser navnet, selve spørsmålet og Gjeldende verdi (eller blankt hvis ikke satt). Hvis spørsmålstypen forventer svar fra et oppregnet verdisett, vises koblingen mellom kodene og visningsverdiene. |
| fet rosa tekst | Eksempel | variabel satt på en senere side vanligvis tom ved start av undersøkelsen, men kan fylles ut via indeksen eller ved å gå til forrige side | [navn eller SGQA-kode]: spørsmål; verdi; svarliste som viser kodene for hver verdi | Alle variabler som er satt på en neste side vises i fet rosa tekst. Verktøytipset viser navnet, selve spørsmålet og Gjeldende verdi (eller blankt hvis ikke satt). Hvis spørsmålstypen forventer svar fra et oppregnet verdisett, vises koblingen mellom kodene og visningsverdiene. |
| fet beige tekst | Eksempel | en Lime-erstatningsverdi | verdien | Lime-erstatningsstrenger (som {TOKEN:xxx}, {PRIVACY_MESSAGE}) vises i fet beige tekst. |
| rød tekst | Eksempel | tildelingsoperator (=) | advarsel | Hvis du bruker tildelingsoperatoren (=), vises den i rød tekst. Dette skal hjelpe deg å unngå utilsiktet omtilordning av verdier når du egentlig mente å sjekke om a == b i stedet for å sette verdien a = b. |
| vanlig svart tekst | Eksempel | tegnsetting | ingen | All annen tegnsetting i uttrykket vises i vanlig svart tekst. |
| tekst i rød boks | en fet rød linje omgir feilen | syntaksfeil | beskrivelse av feilen | Alle oppdagede syntaksfeil vises ved at feilen omgis av en rød boks. Verktøytipset viser feilen. Eksempler er ubalanserte parenteser, bruk av udefinerte funksjoner, feil antall argumenter til funksjoner, dårlig oppbygde uttrykk (f.eks. manglende operatorer mellom variabler), forsøk på å tilordne en ny verdi til en skrivebeskyttet variabel, forsøk på å tilordne verdier til noe som ikke er variabler, eller bruk av Syntaks ikke støttet. Merk at systemet for oppdagelse av syntaksfeil kanskje bare rapporterer én feil i et uttrykk selv om det er flere; hvis feil oppdages, vises imidlertid minst én feil. |
Mer å lese
Eksempelundersøkelser for Expression Manager
Bruksområder og veiledninger
Trinnvise eksempler
Statistikkfunksjoner i Expression Manager
Referanse for utviklere










