x

Hovedkapitler

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Hurtigstartveiledning - LimeSurvey 3.0+
  3. Installasjon - LimeSurvey CE
  4. Hvordan lage en god undersøkelse (veiledning)
  5. Komme i gang
  6. Administrere LimeSurvey
  7. Undersøkelser - introduksjon
  8. Innstillinger for undersøkelse
  9. Meny for undersøkelse
  10. Undersøkelsesstruktur
  11. Spørsmål - introduksjon
  12. Spørsmålsgrupper - introduksjon
  13. Undersøkelser - administrasjon
  14. Verktøylinjen for undersøkelsen
  15. Flerspråklig undersøkelse
  16. ExpressionScript-motor – Hurtigstartguide
  17. Ukategoriserte og avanserte funksjoner
  18. Vanlige spørsmål (generelt)
  19. Feilsøking
  20. Løsninger og omveier
  21. Lisens
  22. Versjonsendringer
  23. Tillegg
 Actions

Expression Manager

From LimeSurvey Manual

Denne siden kan være maskinoversatt og kan inneholde feil. Vis den engelske originalen · Forbedre denne oversettelsen
This page is a translated version of the page Expression Manager and the translation is 100% complete.

Hurtigstartveiledning

Oversikt

Når du tilpasser undersøkelsene dine, trenger du vanligvis en måte å spesifisere følgende på:

  1. Navigering/forgrening - la deltakerens svar endre rekkefølgen spørsmålene stilles i
  2. 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).
  3. 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

Relevans (styring av navigering/forgrening)

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:

  1. Tilpasning krever at uttrykk er omgitt av krøllparenteser
  2. 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

Merk: Dynamisk tilpasning fungerer kanskje ikke hvis svaralternativer vises i nedtrekkslister på samme spørsmålsside. Dette skyldes at tilpasning setter inn en <span>-tagg, som ikke er gyldig inne i alternativer i nedtrekkslister.

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

  1. 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.
  2. 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.
  3. 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å
  4. 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»
  5. 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.

  1. 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
  2. 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.
  3. 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
  4. Erstatningsfelt
    • Bruk spørsmålskoden til å sette inn verdier fra svar på tidligere spørsmål - dette gjør det lettere å lese og validere.
  5. 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.
  6. 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)
  7. 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.
  8. 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.
  9. 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:

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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.
  6. 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:

  1. Vise skreddersydde meldinger til respondentene basert på tidligere svar
  2. Opprette vurderinger og vise vurderingsresultater (eller forgrene betinget eller vise meldinger) basert på disse resultatene, helt uten å bruke selve vurderingsmodulen
  3. Bøye verb og substantiv i spørsmål, svar og rapporter.
  4. 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',
               ''
             )
           )
         )
       )
     )
   )
 )
)}
Expression Manager støtter følgende syntaks:
  • 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.

  Tildeling utføres bare i PHP. Dette oppdaterer ingen verdier på samme side, men bare når brukeren navigerer med neste, forrige, lagre ….


  Hvis du ikke bruker spørsmålstypen ligningsspørsmål til dette formålet, utføres tildelingen først etter at logikken på den gjeldende siden er ferdig. Den anbefalte metoden er alltid å bruke et ligningsspørsmål.


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

  Dette problemet er løst etter 2.05 build 140803


Hvis du bruker HTML-skriveprogrammet, erstattes enkelte tegn med HTML-entiteter.

  • & med &amp;
  • < med &lt;
  • > med &gt;

Hvis du bruker HTML-skriveprogrammet, må du bruke:

  • and for &
  • lt for <
  • le for <=
  • gt for >
  • ge for >=

Navngiving av Qcode-variabler

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 og hopper dermed over tidligere besvarte spørsmål dette bryter med systemets normale flyt
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:

  1. q1 legges ikke til i LEManyNA()-leddet
  2. 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

Veikart/status/oppgaveliste