Actions

Expressiebeheer - presentatie

From LimeSurvey Manual

This page is a translated version of the page Expression Manager - presentation and the translation is 100% complete.

Other languages:
English • ‎日本語 • ‎Nederlands



Inleiding

In LimeSurvey wordt de nieuwe expressiebeheer module (EM) gebruikt, waarmee LimeSurvey meer complexe vertakkingen, beoordelingen, validatie en maatwerk kan ondersteunen.  Het vervangt hoe LimeSurvey de vervangingen, condities en beoordelingen op het beheerdeel beheert. Doordat er nu ook minder wordt gelezen in de database, betekent het ook een snellere werking. Expressie Beheer is ontworpen door Dr. Thomas White (TMSWhite).


Definities

  1. Expressie: Alles tussen accolades.
    • Er mogen geen spaties staan na de openings-accolade en voor de sluit-accolade.
    • De expressie wordt geëvalueerd door EM, het kan mathematische formules, functies en complexe string- en gegevensverwerking bevatten.
  2. Maatwerk: Ook wel "tailoring" en "piping" genoemd. Het conditioneel wijzigen van tekst.
    • Je hebt toegang tot alle "vervangingsvelden", deelnemersgegevens en gegeven antwoorden.
    • Je hebt eenvoudiger toegang tot vragen, antwoorden en eigenschappen.
  3. Relevantie vergelijking: Een attribuut om de zichtbaarheid te controleren.
    • Als er een relevantievergelijking is dan wordt de vraag alleen getoond bij de uitkomst true.
    • Intern worden alle array_filter en array_filter_exclude commando's omgezet in relevanties op subvraagniveau.
  4. SGQA:  De oude naamgeving van variabelen in LimeSurvey (t/m 1.91+).
    • Staat voor Survey-Group-Question-Answer
    • SGQA variabele-naam ziet eruit als 123X5X382X971, en kan ook door een subvraag achtervoegsels hebben.
    • De getallen in de naam verwijzen naar de codes van de enquête, de groep, de vraag en het antwoord en kunnen dus noodzakelijk gewijzigd moeten worden bij een aanpassing in de enquête.
  5. Vergelijking: Het vraagtype vergelijking slaat berekeningen of rapporten op in de database.
    • Het is als een Boilerplate vraag, maar de inhoud wordt opgeslagen in de database, ook als je deze vraag altijd verbergt.
  6. Vraagcode: De in EM te gebruiken variabele-naam.
    • Dit kan een beschrijvende naam zijn met het doel van de vraag, hierdoor is de code gemakkelijker leesbaar.
    • Een vraagcode begint NOOIT met een cijfer, als je nummers gebruikt om je vragen te nummeren gebruik dan eerst altijd een letter, bijvoorbeeld "q1", "q1a" of "g1q2".
    • Als je gegevens gaat exporteren naar SPSS of R wordt deze naam gebruikt. Zorg ervoor dat je de vraagcodes in de enquête uniek houdt.


Moet ik Expressiebeheer gebruiken?

Nee, je hoeft EM niet te gebruiken, maar als je enquête wat meer complex wordt, dan is het wel handiger.

De Conditie-editor ondersteunt bijvoorbeeld ook wat eenvoudige expressies die je bij je vragen kunt gebruiken. In EM wordt veel meer ondersteund.


Kan ik condities en relevantievergelijkingen in een enquête gebruiken?

Ja. Je kunt bij de ene vraag de Conditie-editor gebruiken en bij een andere een Relevantievergelijking.

Maar je kunt ze niet beide in dezelfde vraag gebruiken! Als je een conditie maakt dan gaat de expressie in de relevantievergelijking verloren. Bovendien kan het veld van de relevantievergelijking niet meer handmatig worden aangepast.

Met wat rommelen kan het je wel lukken, maar waarom zou je dat willen. Je moet dan de relevantievergelijking in een editor bewaren. Verwijder dan de nieuwe conditie in de Conditie-editor en wijzig de vraag door de expressie van de conditie gecombineerd met de bewaarde relevantievergelijking in te vullen.


Kiezen tussen conditie en relevantie

Een lijst van voordelen en nadelen van beide:

Keuze Voordeel Nadeel
Condities 1. Mooie GUI voor het aanmaken van eenvoudige condities.
2. GUI goed gedocumenteerd en bekend bij support-team.
1. Ondersteunt alleen eenvoudige vergelijkingen en "AND" en "OR" condities zijn niet betrouwbaar.
2. Trapsgewijze condities werken onregelmatig.
3. Langzaam, intensief db-gebruik, nadeel bij grote enquêtes.
4. Er zijn problemen gemeld bij het herladen van condities.
5. GUI werkt matig bij een erg hoog aantal vragen.
6. Het converteren van papieren enquêtes kan langer duren omdat er SGQA-namen gebruikt moeten worden.
7. Bij echt complexe logica is programmeerkennis noodzakelijk bij vertakkingen.
Relevantie 1. Ondersteunt erg complexe logica, inclusief meer dan 80 functies en rekenkundige/tekst operators.
2. Perfecte ondersteuning van trapsgewijze logica.
3. Snel, geen extra db-gebruik, ook voor enquêtes met meer dan 1000 vragen.
4. Geen problemen met herladen logica omdat er geen SGQA-codes worden gebruikt.
5. Syntax-markeringen ook voor enquêtes met 1000 vragen.
6. Gemakkelijk en snel te gebruiken bij papieren uitdraaien.
7. Eenvoudige ondersteuning gestructureerde interviews en epidemiologische enquêtes.
1. Geen GUI voor eenvoudige condities, het gebruikt daarvoor syntax-markeringen.


Help.png NB:


Beginnen

Als je met EM wilt beginnen:

  • Installeer dan eerst de meest recente stabiele versie van https://www.limesurvey.org/en/download als je niet de meest recente versie gebruikt of gebruik daarvoor ComfortUpdate.
  • Importeer en probeer wat voorbeelden van enquêtes.
  • Bekijk de use-cases en gebruikstips, en de voorbeelden.
  • Bestudeer deze pagina, de EM documentatie.
    • Unit-tests van geïsoleerde expressies (expert)
      • toont voorbeelden van gebruik van alle EM-functie en operators, en de PHP en JavaScript resultaten.
      • er zijn een paar functies die in PHP/JavaScript een ander resultaat geven, bekijk deze pagina dus goed.


Terminologie

De mogelijkheden van EM:

  • Relevantie gebaseerde vertakking - als een vraag relevant is, stel dan die vraag (en stel anders de vraag niet, verberg de vraag en sla NULL op in de database). In het wijzigingsscherm van de vraag en de vraaggroep staan meestal de Relevantie velden. Je kunt op de vraaggroep een conditie zetten die voor alle vragen van de groep geldig is, dan hoef je die niet bij elke vraag te zetten en te wijzigen.
  • Maatwerk - Hiermee kun je de vraag aanpassen. Je kunt met maatwerk (ook tailoring en piping genoemd) niet alleen eenvoudige vervangingen doen (bijvoorbeeld {TOKEN:FIRSTNAME}) gebruiken, maar ook gebruik van werkwoorden of woorden op grond van sexe of aantal. Je kunt de tekst ook aan een deelnemer aanpassen op grond van eerder gegeven of niet gegeven antwoorden.
  • Vergelijkingen - In EM is er een vraagtype Vergelijking toegevoegd waarmee het resultaat van een expressie wordt opgeslagen in de database, ook als de vraag is verborgen. Ze worden gebruikt voor het verbergen van berekeningen, tussenresultaten, navigatie op basis van complexe vergelijkingen, beoordelingen en rapporten die aangemaakt gaan worden en opgeslagen.


Relevantie en trapsgewijze relevantie

Elk vraagtype heeft een optie relevantie die bepaald of de vraag moet worden gesteld. Ze worden verwerkt in de volgorde dat ze in de enquête staan. Als de expressie waar is (of ontbreekt, dit om oudere enquêtes te blijven ondersteunen) dan wordt de vraag gesteld. Als de vraag niet gesteld wordt dan wordt de waarde NULL opgeslagen. Als er geen enkele relevante vraag in de groep is, dan wordt de hele groep overgeslagen.

Als een van de variabelen in de expressie niet relevant is, dan is die vraag niet relevant. Dit is dus een trapsgewijze relevantie waardoor je niet hele lange relevantievergelijkingen voor elke vraag hoeft te schrijven.

Stel je hebt 5 vragen Q1-Q5, en je wilt alleen vraag Q2 stellen als vraag Q1 beantwoord is. Ook wil je vraag Q3 alleen stellen als vraag Q2 beantwoord is.  De relevantievergelijkingen kunnen dan zijn:

Vraag Code Relevantie Vraag
Q1 1 Wat is uw naam?
Q2 Q1 {Q1}, hoe oud bent u?
Q3 Q2 Dus u bent {Q2} jaar oud.  Bent u getrouwd?
Q4 Q3 == "Y" {Q1}, hoelang bent u getrouwd?
Q5 Q4 Hoeveel kinderen heeft u, {Q1}?


Relevantie op groepsniveau

Expressiebeheer (EM) ondersteunt ook relevantie op groepsniveau. Hierdoor is de implementatie van looping (herhalen) gemakkelijker. Stel je wilt informatie van 10 mensen in een huishouden of van 10 producten opvragen. Je bepaalt dan eerst hoeveel mensen er in een betreffende huishouden zijn of hoeveel producten de deelnemer uit een lange lijst heeft geselecteerd. Je kunt dan daarna de relevantie van het groepsniveau gebruiken. {count >= 1}, {count >=2}, ... {count >= 10} voor elk van de 10 groepen. In elke groep kun je dan op vraagniveau nog testen op condities (bijv. sexe, leeftijd per elk lid van het huishouden). De relevantie van vraaggroep wordt dan per vraag gecombineerd (met AND) om te bepalen of de vraag relevant is.

We hebben een voorbeeld, dat je kunt importeren.

In de onderstaande afbeelding kun je zien dat de groep Person 1 relevant is als de deelnemer samenleeft met minstens een ander persoon:


Group-level relevance example screen.png


Maatwerk

Alles tussen accolades wordt beschouwd als een expressie (met een uitzondering die hieronder wordt beschreven). Expressies kunnen beschikken over alle vervangingsvelden, alle variabelen (via verschillende aliassen), alle vergelijkingsoperatoren (rekenkundig, logisch en vergelijkend) en veel functies (die ook dynamisch op de server uitgevoerd kunnen worden).

Met deze vergelijkingen kun je dingen doen als:

  1. Conditioneel tonen van op maat gesneden berichten aan de respondenten die gebaseerd zijn op antwoorden op voorafgaande vragen.
  2. Beoordelingen maken en de resultaten daarvan conditioneel tonen (of conditioneel een vertakking maken), alles zonder de module beoordeling te gebruiken.
  3. De goede werkwoordsnormen en zelfstandige naamwoorden gebruiken in vragen, antwoorden en rapporten.
  4. Tonen van samenvattingen van antwoorden bij het einde van de enquête.


Vergelijkingen

Er is een vraagtype Vergelijking toegevoegd. Het lijkt op het Tekst scherm vraagtype, maar bij het nieuwe vraagtype wordt de waarde of wat er wordt getoond, opgeslagen in de database. Dus, als de tekst van een vergelijking vraag een berekening van een beoordeling bevat, dan wordt die waarde opgeslagen in een variabele die getoond kan worden bij statistieken.


Syntax

De uitzondering op dat alles tussen accolades een expressie is, is dat er geen spatie(s) na de begin-accolade en voor de sluit-accolade mogen staan. Dit is nodig om te voorkomen dat expressiebeheer probeert JavaScript te gaan verwerken.

NB: Expressies mogen meerdere regels bevatten, zolang er maar geen spaties staan na een openingshaakje of voor een sluithaakje. Een voorbeeld met een genest if( ) statement:

{if(is_empty(PFTotals),
 '',
 if(PFTotals >= -5 && PFTotals <= -4,
   'Heel weinig',
   if(PFTotals >= -3 && PFTotals <= -2,
     'Weinig',
     if(PFTotals == -1,
       'Minder dan normaal',
       if(PFTotals == 0,
         'Normaal',
         if(PFTotals == 1,
           'Meer dan normaal',
           if(PFTotals >= 2 && PFTotals <= 3,
             'Veel',
             if(PFTotals >= 4 && PFTotals <= 5,
               'Heel veel',
               ''
             )
           )
         )
       )
     )
   )
 )
)}

Expressiebeheer gebruikt de volgende syntax:

  • Alle standaard mathematische operatoren (+,-,*,/,!).
  • Alle standaard vergelijkingsoperatoren (<,<=,==,!=,>,>=, en ook: lt, le, eq, ne, gt, ge).
  • Haakjes (zodat je subexpressies kunt groeperen).
  • Conditionele operatoren (bijv. &&,| | en ook: and, or).
  • Strings tussen enkele of dubbele aanhalingstekens (quotes), dit kunnen strings zijn met de andere manier van aanhalingstekens.
  • Komma operator (je kunt dan een lijst expressies gebruiken en alleen het resultaat terugkrijgen).
  • Toekenningsoperator (=);
  • Voorgedefinieerde variabelen (refereren aan vragen of vraagattributen of antwoorden), bijv. de SGQA-codes;
  • Functies (meer dan 80 beschikbaar, en het is uitbreidbaar).


Operatoren

De volgorde van verwerken van operatoren is normaal.

Niveau Operator(en) Beschrijving
1 () haakjes voor groepen en functies
2 ! - + een varibele: not, negation, unary-plus
3 * / vermenigvuldigen, delen
4 + - optellen,aftrekken
5 < <= > >= lt le gt ge relatieve vergelijkingen
6 == != eq ne gelijkheid vergelijkingen
7 and logische AND
8 or logische OR
9 = toekennen operator
10 , komma operator
Help.png Om JavaScript en PHP gelijk te laten werken, werkt de plus operator (+) als optellen als beide velden numeriek zijn en als samenvoegen als beide velden niet numeriek (strings) zijn. Je kunt beter de join( ) functie gebruiken voor het samenvoegen want dan is de bedoeling duidelijker en voorkomt onverwachte resultaten als de invoer afwijkt van wat je verwacht.


Uitkijken met gebruik operator (=)

Probeer het gebruik van de toekenningsoperator te vermijden, want er kunnen gemakkelijk onverwachte bijwerkingen zijn. Als je de waarde van een vorig antwoord wijzigt wordt de trapsgewijze relevantie en logica tussen die vraag en de huidige vraag niet opnieuw bepaald, hierdoor kunnen de gegevens niet consistent worden. (De vragen kunnen dan als beantwoord blijven staan en niet op NULL gezet zijn in de database. Of dat vragen die dan verplicht zijn niet gesteld zijn en op NULL staan). Gebruik in het algemeen het vraagtype Vergelijking om een variabele een waarde te geven met een expressie. Heel soms heb je de toekenningsoperator echt nodig, dus is die operator beschikbaar.

Om het gebruik van de operator toekennen wat duidelijker aan te geven, tonen we het in rode tekst in de syntaxvergelijking. (Verwar deze operator niet met de gelijkheidsvergelijking "==".)


Example assignment operator.png


Gebruik toekenningsoperator

De belangrijkste redenen om deze operator te gebruiken:

  • Je wilt een standaardwaarde zetten voor een vraag, waar dat niet met een expressie kan (een radiolijst, waar kun je een van de antwoorden selecteren maar geen vergelijking kan invoeren).  Wees voorzichtig, want LimeSurvey kan niet valideren dat je vergelijking een goed antwoord voor die vraag oplevert.
  • Je wilt het antwoord van een vorige vraag aanpassen op grond van een later gegeven antwoord.
  • enz.

Je kunt voor dit doel Expressiebeheer gebruiken, maar het is beter om het vraagtype vergelijking te gebruiken.

Voorbeeld:

  • Zet het antwoord op een korte tekstvraag in kleine letters : {QCODE=strtolower(QCODE.NAOK)}
  • Zet een standaardantwoord voor het vraagtype array bij het starten van de enquête : {Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
  • Zet een standaardantwoord voor het vraagtype array (tekst) bij het begin van de enquête : {Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
  • Zet een conditie op een antwoord: {QCODE=if(YesNo="Y","A1","")}


XSS beveiliging

Als XSS is ingeschakeld kunnen enkele delen van Expressiebeheer niet worden gebruikt:

  • een HTML-tag in een expressie laten starten en in een andere afsluiten.
  • een URL in de expressie.


Help.png NB: standaard iS XSS ingeschakeld!


Voorbeeld en alternatief

  • {if( 1 ,"<strong>","")}information{if( 1, "</strong>","")} is gebroken met XSS-beveiliging, je kunt hier gebruiken {if(1,"<strong>information</strong>","information")}
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, hier kun je een vergelijkingsvraag gebruiken omdat een het gebruik van een volledige vraagcode is toegestaan : <a href="/script.php?value={EQUATION.NAOK}">next</a>


Toegang tot variabelen

Expressiebeheer geeft alleen leesrecht op de beschikbare variabelen. Om voorgaande versies te blijven ondersteunen, is er toegang tot:

  • TOKEN:xxx - de waarde van een TOKEN (bijvoorbeeld TOKEN:FIRSTNAME (voornaam), TOKEN:ATTRIBUTE_5 (attribuut_5)) (Alleen voor NIET anonieme enquêtes.)
  • |INSERTANS:SGQA - de te tonen waarde van een antwoord, bijvoorbeeld "Ja". Voor Expressiebeheer is het gelijk aan het gebruik van {QCODE.shown}.
  • Alle {XXX} waarden gebruikt in sjablonen.
  • In de vraagtekst, kun je {QID} gebruiken voor het ID van de vraag en {SGQ} voor de SGQA van de vraag.

Verder kun je in Expressiebeheer aan de variabelen refereren met de Vraagcode (de kolom 'titel' in de database-tabel questions). Dit is ook de naam die gebruikt wordt bij het exporteren naar SPSS, R, en SAS. Voorbeeld: als je vragen hebt over de name, leeftijd en geslacht dan kun je die variabelen benaderen met naam, leeftijd en geslacht in plaats van 12345X13X22, 12345X13X23 en 12345X13X24. De vergelijkingen zijn dan de enquête-maker gemakkelijker te lezen en te controleren, ook kun je vragen gemakkelijker verplaatsen omdat je niet afhankelijk bent van het nummer van de groep of de vraag.

Belangrijk: Het is veiliger om alleen variabelen te gebruiken die op voorgaande pagina's of vragen aangemaakt zijn.

Je kunt in EM verder nog de eigenschappen van de vraag lezen:


Syntax Betekenis Voorbeeld Resultaat voorbeeld
Qcode hetzelfde als Qcode.code {implode(',',name,gender)} 'Tom','M'
Qcode.code de geselecteerde antwoordcode van de vraag als de vraag relevant is (anders blank) of de tekstwaarde als het geen vraag met een code is {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK hetzelfde als Qcode - bekijk discussie over NAOK {gender.NAOK} 'M'
Qcode.value de beoordelingswaarde van de vraag als die relevant is (anders blank) of de tekstwaarde als het geen vraag is met een code {gender.value} '1'
Qcode.valueNAOK hetzelfde als Qcode.value - bekijk discussie over NAOK {gender.valueNAOK} '1'
Qcode.shown de te tonen waarde van de vraag {implode(',',name.shown,gender.shown)} 'Tom','Male'
Qcode.question de tekst van de vraag {gender.question} 'Wat is je geslacht?'
Qcode.mandatory is de vraag verplicht (Y/N) {gender.mandatory} 'N'
Qcode.qid het interne vraagnummer (niet het volgnummer) {gender.qid} 337
Qcode.type het vraagtype {gender.type} 'G'
Qcode.jsName de correct JavaScript-naam van de vraag, ongeacht wel/niet op deze pagina {gender.jsName} 'java1827X3X337'
Qcode.gid het interne groepsnummer (niet het volgnummer) {gender.gid} 3
Qcode.qseq {gender.qseq} 5
Qcode.gseq het volgnummer van de groep, begint met 0 {gender.gseq} 1
Qcode.relevanceStatus is de vraag nu relevant of niet (0 of 1) {gender.relevanceStatus} 1
Qcode.relevance de relevantievergelijking van de vraag {gender.relevance} '!is_empty(name)'
Qcode.grelevance de relevantievergelijking van de groep {gender.grelevance} 'num_children >= 5'
Qcode.sgqa de SGQA-code van de vraag {gender.sgqa} '1827X3X337'


HTML-editor probleem

Als je de HTML-editor gebruikt worden sommige tekens vervangen door HTML.

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

Als je de HTML-editor gebruikt, gebruik dan:

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


Wij raden aan dat je in je expressie geen HTML gebruikt. Als je de LimeSurvey HTML-editor gebruikt, klik dan op de knop "Source" (linksboven) en verwijder alle tekens die niet bij je expressie horen (bijv.:

,
, ...).

Naamgeving Qcode Variabele

Dit zijn de details per vraagtype die je nodig hebt om een Qcode te maken (en enkele eigenschappen te benaderen).  In het algemeen worden Qcodes samengesteld als volgt:

VraagCode . '_' . SubvraagID . '_' . SchaalId

Voor commentaar en anders zijn de overeenkomende vraagcodes resp. VraagCode_comment en VraagCode_other.

Type Beschrijving Code SubVr Antwoordopties Schalen Antwoordcode Antwoord Tonen Relevantie
5 5-puntskeuze Radioknoppen Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B Array (10-puntskeuze) Radioknoppen Q2 L1-L6 1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A Array (5-puntskeuze) Radioknoppen Q3 1-5 1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 Array (Flexibele labels) Dubbele schaal Q4 sq1-sq5 0:a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.shown} {Q4_sq1_1=='b2'}
H Array (Flexibel) - Kolomformaat Q5 1-5 s,m,t {Q5_1} {Q5_1.shown} {Q5_1=='s'}
F Array (Flexibel) - Rijformaat Q6 F1-F5 1-5 {Q6_F3} {Q6_F3.shown} {Q6_F3==4}
E Array (Meer/Gelijk/Minder) Radioknoppen Q7 1-7 I,S,D {Q7_4} {Q7_4.shown} {Q7_4=='D'}
: Array (Multiflex) 1 tot 10 Q8 ls1,todo,ls2 min,max,avg {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; Array (Multiflex) Tekst Q9 hp,st,sw 1st,2nd,3rd {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C Array (Ja/Nee/Weet niet) Radioknoppen Q10 1-5 Y,N,U {Q10_1} {Q10_1.shown} {Q10_3=='Y'}
X Boilerplate Q11 {Q11.shown}
D Datum Q12 {Q12} {Q12.shown}
* Vergelijking Q13 {Q13} {Q13.shown} {Q13>5}
~124~ Bestandsupload (vastleggen aantal te uploaden bestanden) Q14 {Q14} {Q14>0}
G Geslacht dropdownlijst Q15 M,F {Q15} {Q15.shown} {Q15=='M'}
U Extra lange vrije tekst Q16 {Q16} {Q16.shown} {strlen(Q16)>100}
I Taalkeuze Q17 {Q17} {Q17.shown} {Q17=='en'}
! Lijst - dropdown Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L Lijst dropdown/radioknoppen lijst Q19 A-Z {Q19} {Q19.shown} {Q19=='X'}
O Lijst met commentaar dropdown/radioknoppen lijst + Textarea Q20 A-F {Q20},{Q20comment} {Q20.shown} {Q20=='B'}
T Lange vrije tekst Q21 {Q21} {Q21.shown} {strstr(Q21,'hello')>0}
M Meerkeuzevraag checkbox Q22 A-F, other {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Meerkeuzevraag met commentaar checkbox + Tekst Q23 A-F {Q23_D}, {Q23_Dcomment} {Q23_D.shown} {!is_empty(Q23)}
K Meervoudige numerieke invoer Q24 self,mom,dad {Q24_self} {Q24_self.shown} {Q24_self>30}
Q Meerdere korte vrije teksten Q25 A-F {Q25_B} {Q25_B.shown} {substr(Q25_B,1,1)=='Q'}
N Numerieke invoer Q26 {Q26} {Q26.shown} {Q26 > 30}
R Rangschikken Q27 1-4 {Q27_1} {Q27_1.shown} {Q27_1==3}
S Korte vrije tekst Q28 {Q28} {Q28.shown} {Q28=='mine'}
Y Ja/Nee Radioknoppen Q29 {Q29} {Q29.shown} {Q29=='Y'}


Het gebruik van NAOK

NAOK --> "Not Applicable" (Niet van toepassing) is OK (goed)


Bij gebruik van NAOK zijn sommige variabelen niet meer van belang, ("Not Applicable OK").

Voorbeeld : count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) geeft altijd een lege string als een subvraag van Q1 wordt gefilterd. Om het aantal gecontroleerde subvragen in dergelijke vraag te tellen: count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Indien de subvraag is verborgen heeft Expressiebeheer een lege string terug.

Zonder NAOK : als een vraag of een subvraag is verborgen, geeft Expressiebeheer een lege string terug, dat komt overeen met false.

Bij .shown wordt altijd het NAOK-systeem gebruikt (lege string als verborgen). Als u de antwoordcode wilt hebben, is het altijd goed om .NAOK toe te voegen aan de vraagcode.

Meer informatie over overriding trapsgewijze condities.


Gereserveerde variabelen ('this','self','that')

Je wilt vrij vaak alle delen van een vraag evalueren, zoals hoeveel subvragen zijn beantwoord of de totalen van de scores bepalen. Soms wil je alleen bepaalde rijen of kolommen verwerken van een vraag (bepalen van de som van een rij en kolom en dat getal opslaan in de database).  De gereserveerde variabelen vereenvoudigen dat.


"This" variabele

De "this" variabele wordt alleen gebruikt in de opties "hele vraag validatievergelijking" en "subvraag validatievergelijking" (de laatste kan niet via de GUI). Het wordt geëxpandeerd naar de variabele-namen voor elke cel binnen die vergelijkingen. Als je dus wilt controleren of elke invoer groter dan drie is, dan kun je de "Subvraag validatievergelijking" zetten op (this > 3).


"Self" variabele

De "self" en "that" variabele zijn krachtiger, ze zijn macro's die uitgevoerd worden voordat de vergelijkingen verwerkt worden.  De syntax is:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub-selector.suffix
  1. suffix is een van de normale qcode achtervoegsels (NAOK, value, shown)
  1. de sub-selector is een van de volgende:
  • comments - alleen subvragen die commentaar zijn (bijv. Meerkeuzevraag met opmerkingen en Lijst met opmerkingen)
  • nocomments - alleen subvragen die geen commentaar zijn.
  • sq_X - waarbij X staat voor een rij of kolom identifier.  Alleen subvragen met patroon X worden geselecteerd. De code identifier moet volledig zijn, dan komt sq_X overeen inclusief subvragen nX, X, Xn (bijv. als je gebruikt sq_1 en subvragen a1, 1a, 1, 11 of 001 was inclusief). Let op bij het vraagtype Dubbele Schaal waar de codes van de subvragen zijn QCODE_SQCODE_1 en QCODE_SQCODE_1 en het vraagtype Rangschikken waar de codes van de subvragen zijn QCODE_1,QCODE_2 ....

Voorbeelden:

  • Is elk deel van de vraag beantwoord?  {count(self.NAOK)>0}
  • Wat is de beoordelingsscore voor deze vraag?  {sum(self.value)}

Je kunt dit ook gebruiken om rij- en kolomtotalen te bepalen.  Stel je hebt een array met rijen A-E en kolommen 1-5.

  • Wat is het totaal?  {sum(self.NAOK)}
  • Wat is het totaal van rij B?  {sum(self.sq_B.NAOK)}
  • Wat is het totaal van kolom 3? {sum(self.sq_3.NAOK)}


"That" variabele

De "that" variabele is als de "self" variabele, maar je kunt refereren aan andere vragen. De syntax is:

  • that.qname
  • that.qname.suffix
  • that.qname.sub-selector
  • that.qname.sub-selector.suffix

qname is de naam van de vraag zonder de extensie van een subvraag.  Dus als een je vraag 'q1' hebt, dan is dat de qname.

Voorbeelden:

  • Is elk deel van de vraag q1 beantwoord?  {count(that.q1.NAOK)>0}
  • Wat is de beoordelingsscore voor q2?  {sum(that.q2.NAOK)}
  • Wat is het totaal van q3? {sum(that.q3.NAOK)}
  • Wat is het totaal van rij C in q4?  {sum(that.q4.sq_C.NAOK)}
  • Wat is het totaal van kolom 2 in q4? {sum(that.q4.sq_2.NAOK)}

De self en that variabelen kunnen worden gebruikt in elke relevantie, validatie of maatwerk.

De valkuil is dat als je toon logica bestand gebruikt, je dan de geëxpandeerde waarde ziet van "self" en "that".  Je ziet dan dus de actuele vergelijking die gegenereerd wordt zodat je (en expressiebeheer) kunt valideren of de variabelen bestaan. Omdat je dan hele lange vergelijkingen kunt zien, kan dat verwarrend zijn. Als je de vraag gaat wijzigen, zie je wel de originele vergelijking met de variabelen "self" en/of "that".

Help.png Je moet deze variabelen niet gebruiken als je
  • expliciet elke variabele in de vergelijking wilt benoemen, of
  • variabelen gebruikt zonder subvragen.
In die gevallen is het gebruik van 'that' wat nutteloos, en loop je het risico op onverwachte resultaten.


Toegang tot functies

Expressiebeheer ondersteunt het gebruik van de onderstaande functies inclusief door de gebruiker gedefinieerde functies. Je kunt dus zelf functies toevoegen. Het heeft PHP en JavaScript tegenhangers voor de onderstaande functies, zodat ze op de server (PHP) en de cliënt (JavaScript) gelijk werken.


Geïmplementeerde functies

De volgende functies zijn beschikbaar:

Functie Betekenis Syntax
abs Absolute waarde number abs(number)
acos Arccosinus number acos(number)
addslashes Quote string met slashes string addslashes(string)
asin Arcsinus number asin(number)
atan Arctangens number atan(number)
atan2 Arctangens van 2 variabelen number atan2(number, number)
ceil Afkappen naar boven number ceil(number)
checkdate Resultaat true(1) als het een geldige datum is in de Gregoriaanse kalender bool checkdate(month,day,year)
convert_value Converteert een numerieke waarde gebruikmakend van een inputTable een een outputTable met numerieke waarden number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos Cosinus number cos(number)
count Telt het aantal beantwoorde vragen (niet leeg) in de lijst number count(arg1, arg12, ..., argN)
countif Telt het aantal beantwoorde vragen in de lijst gelijk aan het eerste argument number countif(matches, arg1, arg2, ... argN)
countifop Telt het aantal beantwoorde vragen in de lijst die voldoen aan de criteria (arg op value) number countifop(op, value, arg1, arg2, ... argN)
date Maakt een lokale datum/tijd string date(format [, timestamp=time()])
exp Berekent de exponent van e number exp(number)
fixnum Toont getallen met een komma, indien nodig string fixnum(number)
floor Afkappen naar beneden number floor(number)
gmdate Maakt een datum/tijd in GMT-formaat string gmdate(format [, timestamp=time()])
html_entity_decode Converteert alle HTML-entities naar de van toepassing zijnde tekens (gebruik altijd ENT_QUOTES en UTF-8) string html_entity_decode(string)
htmlentities Converteert alle van toepassing zijnde tekens naar HTML-entities (gebruik altijd ENT_QUOTES en UTF-8) string htmlentities(string)
expr_mgr_htmlspecialchars Converteert speciale tekens naar HTML-entities (gebruik altijd ENT_QUOTES en UTF-8) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode Converteert speciale HTML-entities terug naar tekens (gebruik altijd ENT_QUOTES en UTF-8) string htmlspecialchars_decode(string)
idate Maakt van een lokale datum/tijd een getal string idate(string [, timestamp=time()])
if Excel-stijl if(test,result_if_true,result_if_false) if(test,result_if_true,result_if_false)
implode Zet array-elementen in een string string implode(glue,arg1,arg2,...,argN)
intval Bepaal de integer waarde van een variabele int intval(number [, base=10])
is_empty Bepaal of een variabele leeg is bool is_empty(var)
is_float Controleer of een variabele van het type float (met decimalen) is bool is_float(var)
is_int Controleer of het type integer (hele getallen) is bool is_int(var)
is_nan Controleer of de waarde geen getal is bool is_nan(var)
is_null Controleer of een variabele NULL is bool is_null(var)
is_numeric Controleer of een variabele een getal is of een string die een getal is bool is_numeric(var)
is_string Controleer of het type een string is bool is_string(var)
join (Nieuw in 2.0 build 130129) Voeg elementen samen in een string join(arg1, arg2, ... argN)
list Geeft een kommagescheiden lijst van niet-lege waarden terug string list(arg1, arg2, ... argN)
log Het grondtal bij een logaritme, standaard e (natuurlijk logaritme) number log(number,base=e)
ltrim Verwijder whitespace (of andere tekens) aan het begin van een string string ltrim(string [, charlist])
max Bepaal de hoogste waarde number max(arg1, arg2, ... argN)
min Bepaal de laagste waarde number min(arg1, arg2, ... argN)
mktime Bepaal het UNIX-timestamp van een datum (elk van de 6 argumenten is optioneel) number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])
modulo-function Deze functie wordt nog niet ondersteunt. Gebruik de functie floor( ) floor(x/y)==(x/y)
nl2br Voegt een HTML-line-break toe voor elke nieuwe regel in een string string nl2br(string)
number_format Formateert een getal met duizendtaltekens string number_format(number)
pi De waarde PI number pi()
pow Exponentiële expressie number pow(base, exp)
quoted_printable_decode Converteert een quoted-printable string naar een 8-bit string string quoted_printable_decode(string)
quoted_printable_encode Converteert een 8-bit string naar een quoted-printable string string quoted_printable_encode(string)
quotemeta Quote meta-karakters string quotemeta(string)
rand Genereer een willekeurig geheel getal, zie voorbeeld int rand() OR int rand(min, max)
regexMatch Vergelijk een string met een reguliere expressie bool regexMatch(pattern,input)
round Rond een getal af met een optionele precisie number round(val [, precision])
rtrim Verwijder whitespace (of andere tekens) aan het einde van een string string rtrim(string [, charlist])
sin Sinus number sin(arg)
sprintf Geeft een geformatteerde string terug string sprintf(format, arg1, arg2, ... argN)
sqrt (vierkants)wortel number sqrt(arg)
stddev Bepaalt de standaardafwijking van een lijst getallen number stddev(arg1, arg2, ... argN)
str_pad Vul een string aan tot een bepaalde lengte met een andere string string str_pad(input, pad_length [, pad_string])
str_repeat Herhaal een string string str_repeat(input, multiplier)
str_replace Vervang alle voorkomens van een string met een andere string string str_replace(search, replace, subject)
strcasecmp Binair veilig hoofdletter-onafhankelijk strings vergelijken int strcasecmp(str1, str2)
strcmp Binair veilig strings vergelijken int strcmp(str1, str2)
strip_tags verwijder HTML en PHP-tags uit een string string strip_tags(str, allowable_tags)
stripos Zoek de eerste positie van een hoofdletter-onafhankelijke unicode string (beginnend bij 0, geeft false terug indien niet gevonden) int stripos(haystack, needle [, offset=0])
stripslashes Verwijder quotes van een quoted string string stripslashes(string)
stristr Hoofdletter-onafhankelijke strstr string stristr(haystack, needle [, before_needle=false])
strlen Bepaal de lengte van de string int strlen(string)
strpos Zoek de eerste positie van een unicode string (beginnend bij 0, geeft false terug indien niet gevonden) int strpos(haystack, needle [ offset=0])
strrev Keer een string om string strrev(string)
strstr Zoek het eerste voorkomen van een string string strstr(haystack, needle[, before_needle=false])
strtolower Maak een string lowercase string strtolower(string)
strtotime Bouw een Engelse datum/tijd beschrijving op in een Unix timestamp int strtotime(string)
strtoupper Maak een string uppercase string strtoupper(string)
substr Geeft een deel terug van een unicode string string substr(string, start [, length])
sum Bepaalt de som van getallen in een array number sum(arg1, arg2, ... argN)
sumifop Bepaal de som van de beantwoorde vragen in een lijst die aan het criteria voldoen criteria (arg op value) number sumifop(op, value, arg1, arg2, ... argN)
tan Tangens number tan(arg)
time Geeft het huidige UNIX timestamp terug number time()
trim Verwijder whitespace (of andere tekens) van zowel het begin als het eind van een string string trim(string [, charlist])
ucwords Maak van elk woord in een string de eerste letter een hoofdletter string ucwords(string)
unique Geeft true terug als alle niet-lege antwoorden uniek zijn boolean unique(arg1, ..., argN)


Help.png Klik hier voor een uitleg over functies die nog ontwikkeld worden (of worden overwogen).


Expressiebeheer weet wat de lokale variabelen zijn

Om de JavaScript op een pagina goed op te bouwen, moet Expressiebeheer weten welke variabelen op de pagina staan en wat hun JavaScript ID is (bijvoorbeeld voor document.getElementById(x)).  Het moet ook weten welke variabelen op andere pagina's worden gebruikt (zodat het zeker is dat de nodige <input type='hidden' value='x'> velden aanwezig en gevuld zijn).


Trapsgewijze condities

Als een van de variabelen niet relevant is, wordt de hele vergelijking niet relevant (false).  Bijvoorbeeld, in de onderstaande tabel betekent N/A dat een van de variabelen niet relevant was.


Operator Voorbeeld a b Resultaat
+ (unary) +a N/A false
! !a N/A false
== (or eq) a == b N/A 5 false
== (or eq) a == b N/A 0 false
== (or eq) a == b N/A N/A false
!= (or ne) a != b N/A 5 false
!= (or ne) a != b N/A N/A false
!= (or ne) a != b N/A 0 false
> (or gt) a > b N/A 5 false
>= (or ge) a >= b N/A 5 false
< (or lt) a < b N/A 5 false
<= (or le) a <= b N/A 5 false
and a and b N/A 5 false
and a and b N/A N/A false
or a or b N/A N/A false
or a or b N/A 5 false
+ a + b N/A 5 false
* a * b N/A 5 false
/ a / b 5 N/A false
() (a) N/A false
(exp) (a && b) N/A 5 false
(exp) op (exp) (b + b) > (a && b) N/A 5 false
function sum(a,b,b) N/A 5 false
function max(a,b) N/A 5 false
function min(a,b) N/A 5 false
function implode(', ',a,b,a,b) N/A 5 false
function if(a,a,b) N/A 5 false
function is_empty(a) N/A false
function is_empty(a) 0 (of blank) true
function !is_empty(a) N/A false


Overslaan trapsgewijze condities

Stel je wilt een lopend totaal tonen van alle relevante antwoorden.  Je kunt de vergelijking {sum(q1,q2,q3,...,qN)} proberen.  Echter dit wordt intern vertaald naar LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))).  Dus als een van de waarden q1-qN niet relevant is, krijg je altijd als resultaat false.  De sum() is zolang niet alle vragen zijn beantwoord altijd 0.

Om dit probleem te voorkomen, kan elke variabele een achtervoegsel ".NAOK" krijgen (dat betekent dat niet toepasbaar goed is Not Applicable is OK). Dat leidt dan tot het volgende gedrag.  Stel je hebt een variabele q1.NAOK

  1. q1 wordt niet toegevoegd aan de LEManyNA() clause
  2. LEMval('q1') blijft controleren of het antwoord relevant is en geeft "" terug als het niet relevant is (dus individuele niet relevante antwoorden worden overgeslagen, maar ze hebben geen invloed op de gehele expressie).

Dus de te gebruiken vergelijking voor het lopende totaal is: sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

Het gebruik van het achtervoegsel .NAOK maakt het voor de maker van de enquête ook mogelijk om verschillende paden te hebben en die later te laten samenkomen. Een voorbeeld: onderwerpen in een enquête wijken af van de normale reacties. Deze resultaten kunnen worden opgemerkt door de enquêtebeheerder, die kan dan een bevestiging vragen of de deelnemer wil doorgaan met het invullen van de enquête. De conditie voor het "restant van te stellen vragen" zal dan testen of de initiële antwoorden normaal zijn OF dat het onderwerp een vraag heeft bevestigt dan alleen relevant is als het afwijkt van het normale antwoord.


Hoe wordt conditioneel micro-maatwerk ondersteund?

Dit is een voorbeeld van micro-maatwerk (waar Vraagtype == 'expr' betekent als het vraagtype vergelijking is):


Vraagcode Relevantie Vraagtype Vraag
name 1 text Wat is je naam?
age 1 text Hoe oud ben je?
badage !is_empty(age) expr {(age<16) or (age>80)}
agestop badage message Sorry, {name}, je bent te {if( (age<16),'jong',if( (age>80),'oud','middle-aged') ) } voor deze test.
kids !badage yesno Heb je kinderen?
parents 1 expr {!badage && kids=='Y'}
numKids parents text Hoeveel kinderen heb je?
kid1 parents && numKids >= 1 text Hoe oud is de oudste?
kid2 parents && numKids >= 2 text Hoe oud is de tweede?
kid3 parents && numKids >= 3 text Hoe oud is de derde?
kid4 parents && numKids >= 4 text Hoe oud is de vierde?
kid5 parents && numKids >= 5 text Hoe oud is de vijfde?
sumage 1 expr {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
report parents text {name}, Je hebt gezegd dat je {age} en bent en {numKids} hebt.  De som van de leeftijden van de oudste is {min(numKids,5)} kinderen is {sumage}


Bovenstaand voorbeeld in het Engels met aantal kinderen downloaden.

Al deze vragen kunnen op dezelfde pagina (dus in een groep), alleen de relevante vragen worden getoond. Bovendien worden, als de leeftijden van de kinderen worden ingevoerd, de sum() expressie in de laatste vraag dynamisch op de pagina gewijzigd.

Expressie beheer zorgt voor deze functionaliteit door elke expressie in een <span> element met een bepaalde naam te zetten. Elke keer als een waarde wijzigt wordt de expressie in dat <span> element opnieuw bepaald.  Er is geen beperking in het aantal van dergelijke micro-maatwerk expressies op een pagina.


Syntax markeren

Als ondersteuning bij het invoeren en valideren van expressies wordt de syntax met kleur gemarkeerd volgens de regels:

Manieren van markeren en hun betekenis

Kleur Voorbeeld Betekenis Tooltip Commentaar
geelbruine achtergrond Voorbeeld de hele vergelijking n.v.t. Alles tussen haakjes dat een vergelijking is (bijv. geen spatie aan het begin of het eind) wordt met een geelbruine achtergrond weergegeven om onderscheid te maken met tekst
vette rode tekst Voorbeeld Een fout uitleg over de fout Kan een onbekende variabele zijn of een fout in een functie. Enquête werkt niet goed, de bijbehorende vraag wordt niet getoond.
vette blauwe tekst Voorbeeld functienaam betekenis en syntax Het verwijst naar een functie, want het wordt gevold door een openingshaak.
grijze tekst Voorbeeld string n.v.t. Geeft een string aan (zowel met enkele als met dubbele aanhalingstekens).
cyaan tekst Voorbeeld variabele gezet op dezelfde pagina [naam of SGQA-code]: vraag; waarde; antwoordenlijst met codes per waarde Elke variabele die op de pagina is gezet waarop de huidige vraag staat (dit is inclusief JavaScript). De tooltip toont de naam (bij gebruik van INSERTANS:xxx, de oude naamgeving) of de SGQA-code, de huidige vraag en de huidige waarde (leeg, indien nog niet gezet). Als het vraagtype antwoorden uit een verzameling verwacht wordt de koppeling van codes en waarden getoond.
groene tekst Voorbeeld variabele gezet op voorafgaande pagina [naam of SGQA-code]: vraag; waarde; antwoordenlijst met codes per waarde Elke variabele die op een voorafgaande pagina is gezet. De tooltip toont de naam (bij gebruik van INSERTANS:xxx, de oude naamgeving) of de SGQA-code, de huidige vraag en de huidige waarde (leeg, indien nog niet gezet). Als het vraagtype antwoorden uit een verzameling verwacht wordt de koppeling van codes en waarden getoond.
vette roze tekst Voorbeeld variabele die op een latere pagina wordt gezet in het algemeen: leeg bij start enquête, maar kan worden gevuld met index of verplaatsen vorige [naam of SGQA-code]: vraag; waarde; antwoordenlijst met codes per waarde De tooltip toont de naam (bij gebruik van INSERTANS:xxx, de oude naamgeving) of de SGQA-code, de huidige vraag en de huidige waarde (leeg, indien nog niet gezet). Als het vraagtype antwoorden uit een verzameling verwacht wordt de koppeling van codes en waarden getoond.
vette lichtbruine tekst Voorbeeld een vervangingswaarde de waarde Vervangingswaarden zoals {TOKEN:xxx} of {PRIVACY_MESSAGE} worden in vette lichtbruine tekst weergegeven.
rode tekst Voorbeeld toekenningsoperator (=) waarschuwing Als je de toekenningsoperator (=) gebruikt dan wordt die variabele weergegeven als rode tekst. Dit is bedoeld als waarschuwing zodat je kunt kijken of je hier een waarde wou toekennen in plaats van te vergelijken, a == b in plaats van a = b.
normale zwarte tekst Voorbeeld leestekens n.v.t. Alle overige leestekens in de expressie worden als normale zwarte tekst getoond.
rood omlijnde tekst een fout in een box met rode randen fout in de syntax beschrijving van de fout Fouten worden rood omlijnd weergegeven. De tooltip toont de foutmelding. Dit kan zijn een fout met de haakjes, gebruik van een onbekende functie, een fout in het aantal argumenten van een functie, een fout in een expressie (bijv. een ontbrekende operator bij variabelen), een read-only variabele een waarde proberen te geven, gebruik van een onbekende variabele of een syntaxfout. NB: je ziet mogelijk hier maar een fout in de expressie, er kunnen er dan meerdere zijn.


Help.png Met tooltips bedoelen we de tekst die in een pop-up getoond wordt als je met de muis over bepaalde functies en variabelen heen gaat.

Leesvoer

Expressiebeheer voorbeeld enquêtes

Uitwerkingen en manier van aanpak

Voorbeelden

Referentie voor ontwikkelaars

Voortgang