Expression Manager
From LimeSurvey Manual
Vodič za brzi početak
Pregled
Prilikom prilagodbe svojih upitnika obično trebate način za određivanje sljedećeg:
- Navigacija/grananje - omogućuje da odgovori ispitanika promijene redoslijed kojim se postavljaju pitanja
- Prilagodba/umetanje (Tailoring/Piping) - kako formulirati pitanje (primjerice upućivanjem na prethodne odgovore ili sprezanjem rečenica prema broju ili spolu ispitanika) ili kako generirati prilagođena izvješća (poput rezultata procjene ili prilagođenih savjeta).
- Provjera - osigurava da odgovori zadovoljavaju određene kriterije, poput minimalnih i maksimalnih vrijednosti ili podudaranja s uzorkom unosa
Expression Manager (EM) nudi intuitivan način za određivanje logike za svaku od tih značajki. Gotovo sve što možete zapisati kao standardnu matematičku jednadžbu valjan je izraz, čak i ako pozivate funkcije. EM trenutačno omogućuje pristup 80 funkcija i može se lako proširiti kako bi podržao više njih. Također omogućuje pristup vašim varijablama pomoću imena varijabli čitljivih ljudima (umjesto SGQA imena).
Sljedeći odjeljci prikazuju glavna mjesta na kojima se koristi Expression Manager
Neki upitnici koriste "Goto logiku", primjerice ako na pitanje 1 odgovorite opcijom C, preskačete na pitanje 5. Takav je pristup vrlo ograničavajući jer ga je teško provjeriti i lako se pokvari kada morate promijeniti redoslijed pitanja. EM koristi Booleovu jednadžbu relevantnosti za određivanje svih uvjeta pod kojima pitanje može biti valjano. Ako je pitanje relevantno, prikazuje se, a u suprotnom je Nije primjenjivo i u bazu podataka se pohranjuje vrijednost NULL. To je slično onome što se može učiniti pomoću uređivača uvjeta, no EM omogućuje da lako odredite mnogo složenije i snažnije kriterije (i omogućuje korištenje imena varijable umjesto SGQA imenovanja).
Ova slika prikazuje jedan način pregleda logike relevantnosti za upitnik. Izračunava indeks tjelesne mase. Jednadžba relevantnosti prikazana je u uglatim zagradama odmah nakon imena varijable (koje je zeleno). Dakle, relevantnost za weight, weight_units, height i height_units iznosi 1, što znači da se ta pitanja uvijek postavljaju. Međutim, relevantnost za BMI je {!is_empty(height) and !is_empty(weight)}, što znači da će se BMI izračunati samo ako ispitanik unese vrijednost i za visinu i za težinu (čime se izbjegava rizik od pogreške dijeljenja nulom). Također, pitanje Report prikazuje se samo ako ispitanik odgovori na sva četiri glavna pitanja (height, height_units, weight, weight_units).
Relevantnost se prikazuje i može se uređivati na sljedećim mjestima:
Pregled / uređivanje relevantnosti na razini pitanja
Ova jednadžba izračunava indeks tjelesne mase (BMI). Postavlja se samo ako osoba prvo unese svoju visinu i težinu.
Ovo je zaslon za uređivanje pitanja BMI.
Imajte na umu da ne koristite vitičaste zagrade kada unosite jednadžbu relevantnosti.
Pregled / uređivanje relevantnosti na razini grupe
Ovo je primjer upitnika za popis stanovništva. Prva stranica pita koliko osoba živi s vama i to sprema u varijablu "cohabs". Ova se stranica prikazuje samo ako imate više od jednog supstanara (dakle prikazuje se za drugu osobu koja živi s vama), a prikazuje se i samo ako ste naveli u kakvom ste odnosu s osobom jedan (p1_rel).
Kao što vidite, grupa ima i kriterije relevantnosti na razini pitanja, tako da se svako pitanje pojavljuje tek nakon što odgovorite na prethodno (npr. {!is_empty(p1_sex)}). EM umjesto vas kombinira relevantnost na razini grupe i pitanja. Pitanja u grupi postavljaju se samo ako je grupa u cjelini relevantna. Zatim se postavlja samo podskup pitanja unutar grupe koja su relevantna.
Ovo je zaslon za uređivanje relevantnosti na razini grupe za to pitanje:
Imajte na umu da ne koristite vitičaste zagrade kada unosite jednadžbu relevantnosti.
Prilagodba/umetanje (Tailoring/Piping)
EM vam omogućuje jednostavnu i složenu uvjetnu prilagodbu vaših pitanja. Ponekad trebate samo jednostavnu zamjenu, primjerice: "Rekli ste da ste kupili [Proizvod]. Što vam se u vezi s njim najviše svidjelo?". Ponekad trebate uvjetnu zamjenu poput "[Gospodin/Gospođa] [Prezime], biste li bili voljni ispuniti naš upitnik?". U ovom slučaju želite koristiti Gospodin ili Gospođa ovisno o spolu osobe. Ponekad vam treba još složenija zamjena (primjerice na temelju matematičkog izračuna). EM podržava svaku od ovih vrsta prilagodbe/umetanja.
Uvjetne jednadžbe
Primjer indeksa tjelesne mase pokazuje mogućnost izračuna BMI-ja osobe, čak i dok joj se omogućuje unos visine i težine u metričkim ili nemetričkim jedinicama.
Ovdje je weight_kg {if(weight_units == 'kg', weight, weight * .453592)}. Ova funkcija if() znači da, ako je ispitanik unio težinu u kilogramima, treba koristiti tu vrijednost, a u suprotnom unesenu vrijednost (koja je bila u funtama) treba pomnožiti s .453592 kako bi se pretvorila u kilograme. Varijabla height_m koristi sličan pristup za izračun visine osobe u metrima, čak i ako je visinu unijela u inčima.
BMI izračunava formulu težine kao {weight_kg / (height_m * height_m)}.
Naposljetku, izvješće uvjetno prilagođava poruku ispitaniku i prikazuje mu što je unio. ("Rekli ste da ste visoki 2 metra i da vagate 70 kg.")
Iako se to ne vidi dobro na gornjoj slici, weight_status koristi ugniježđene naredbe if() kako bi osobu kategorizirao od pothranjene do izrazito pretile. Njegovu jednadžbu možete vidjeti u prikazu Show Logic View.
U prozoru za uređivanje ovog pitanja možete vidjeti dvije stvari:
- Prilagodba mora okruživati izraze vitičastim zagradama
- Izrazi se mogu protezati kroz više redaka ako, kao u ovom slučaju, želite olakšati čitanje ugniježđene uvjetne logike.
Prilagođena pitanja, odgovori i izvješća
Ovaj primjer prikazuje BMI izvješće.
Ovo je prozor za uređivanje istog pitanja.
Kao što vidite, sve u vitičastim zagradama tretira se kao izraz, pa je na prethodnoj slici istaknuto bojom (sintaksno označeno). Ako ste napravili tipfeler (primjerice pogrešno napisani ili nedefinirani nazivi varijabli ili funkcija), EM bi prikazao pogrešku, kao ovu, koja pokazuje da je height_unit nedefinirana varijabla (zapravo je height_units), a rnd() nedefinirana funkcija (ispravan naziv funkcije je round()). U oba slučaja pogreške su okružene crvenim okvirom kako bi ih bilo lakše uočiti i ispraviti.
Možete vidjeti i da brzo možete izraditi složena izvješća, poput tablice unesenih vrijednosti ili prilagođenih savjeta.
Imajte na umu da u svakoj prilagodbi izrazi moraju biti okruženi vitičastim zagradama kako bi LimeSurvey znao koji su dijelovi pitanja slobodan tekst, a koje treba obraditi putem Expression Managera.
Provjera
EM kontrolira rad većine naprednih opcija pitanja. One upravljaju aspektima kao što su minimalni/maksimalni broj odgovora, minimalne/maksimalne pojedinačne vrijednosti, minimalne/maksimalne zbrojene vrijednosti te provjera podudaraju li se unesene vrijednosti s navedenim obrascima niza znakova. Te napredne opcije pitanja i dalje unosite kao i prije. Međutim, svaka vrijednost u tim poljima sada se smatra izrazom, pa možete imati minimalne/maksimalne kriterije sa složenim uvjetnim odnosima prema drugim pitanjima.
U svim tim slučajevima, budući da se napredna opcija pitanja uvijek smatra izrazom, pri njezinu unosu ne koristite vitičaste zagrade.
Stranice Primjeri upitnika prikazuju mnogo radnih primjera upotrebe izraza za provjeru.
Uvod
LimeSurvey koristi novi modul Expression Manager (EM) koji će LimeSurveyu omogućiti podršku za složenije grananje, procjene, provjeru i prilagodbu. Zamijenit će način na koji LimeSurvey u pozadini upravlja zamjenama, uvjetima i procjenama. Također će znatno ubrzati obradu jer uklanja većinu čitanja iz baze podataka tijekom izvođenja. EM je razvio dr. Thomas White (TMSWhite).
Ova wiki stranica konačna je referenca za sintaksu i funkcionalnost Expression Managera.
Ključne definicije
- Izraz: Sve što je okruženo vitičastim zagradama
- Pod uvjetom da nema razmaka odmah nakon otvorene zagrade ili prije zatvorene vitičaste zagrade
- Sadržaj izraza EM izračunava, pa mogu sadržavati matematičke formule, funkcije te složenu obradu nizova znakova i datuma.
- Prilagodba: Ponekad se naziva i "piping", to je postupak uvjetne izmjene teksta
- Imate pristup svim 'poljima zamjene', podacima o sudioniku i podacima odgovora.
- Također imate lakši pristup pitanjima, odgovorima i njihovim svojstvima.
- Jednadžba relevantnosti: Novi atribut pitanja koji kontrolira vidljivost pitanja
- Ako postoji jednadžba relevantnosti, pitanje se prikazuje samo ako se relevantnost izračuna kao istina.
- Interno sve naredbe array_filter i array_filter_exclude postaju relevantnost na razini potpitanja
- Jednadžba kao vrsta pitanja: Nova vrsta pitanja koja sprema izračune ili izvješća u bazu podataka
- Slična je pitanju Boilerplate, ali se njezin sadržaj sprema u bazu podataka čak i ako postavite "Uvijek sakrij ovo pitanje"
- Kôd pitanja: Ovo je poželjan naziv varijable za EM
- Može biti opisni naziv koji označava svrhu pitanja, što olakšava čitanje složene logike
- Valjani kodovi pitanja NE bi smjeli počinjati brojem, pa kada kôd pitanja koristite za numeriranje pitanja, jednostavno upotrijebite "q1", "q1a" ili "g1q2".
- To je ono što trenutačno postaje naziv varijable ako izvezete podatke u SPSS ili R, pa ako radite statističku analizu, vjerojatno ste ga već učinili jedinstvenim.
Moram li koristiti EM?
Kratak odgovor je ne (ali i da).
EM je potpuno kompatibilan unatrag s postojećim upitnicima. Dakle, ako vam odgovara koristiti uvjete i procjene na način na koji ih je LimeSurvey koristio u verzijama <= 1.91+, to možete nastaviti činiti.
Međutim, EM u potpunosti zamjenjuje način na koji LimeSurvey interno rukuje uvjetima. Iako i dalje možete koristiti uređivač uvjeta za izradu i upravljanje uvjetima, LimeSurvey 1.92 pretvorit će ih u istovrijedne jednadžbe relevantnosti. U sklopu nadogradnje LimeSurvey 1.92 automatski će pretvoriti sve postojeće uvjete u jednadžbe relevantnosti.
Ovo bi vam trebalo omogućiti najbolje iz oba svijeta - LimeSurvey možete nastaviti koristiti kao i dosad, ali ćete vidjeti istovrijednu jednadžbu relevantnosti pa možete postupno prelaziti izravno na jednadžbe relevantnosti kad god procijenite da je to prikladno.
Mogu li miješati uvjete i relevantnost?
Da. Za neka pitanja možete koristiti uređivač uvjeta, a za druga uređivač relevantnosti. Uvjeti se automatski pretvaraju u relevantnost kada spremite pitanje.
Napomena: pretpostavljamo da, ako koristite uređivač uvjeta, želite da ti uvjeti prepišu svaku ručno unesenu jednadžbu relevantnosti. Stoga, ako imate postojeće uvjete i želite ručno urediti relevantnost, prvo izbrišite uvjete za to pitanje. Konkretno, kopirajte generiranu jednadžbu relevantnosti u uređivač teksta, pomoću izbornika Uvjeti izbrišite sve uvjete za to pitanje (čime će se izbrisati i relevantnost), zatim uredite pitanje i zalijepite generiranu jednadžbu relevantnosti iz uređivača teksta natrag u polje relevantnosti za to pitanje (i spremite pitanje). Ako bude dovoljno zahtjeva za brisanjem uvjeta bez brisanja generirane jednadžbe relevantnosti, mogli bismo dodati postupak skupne pretvorbe.
Kako odabrati između uvjeta i relevantnosti?
Evo popisa prednosti i nedostataka svakog pristupa:
| Pristup | Prednosti | Nedostaci |
|---|---|---|
| Uvjeti | 1. Ugodno grafičko sučelje za izradu jednostavnih uvjeta 2. Grafičko sučelje je dobro dokumentirano i poznato timu za podršku |
1. Podržava samo jednostavne usporedbe i slabo podržava I/ILI uvjete 2. Kaskadni uvjeti rade nepouzdano 3. Sporo - opterećuje bazu podataka pa može usporiti duge upitnike 4. Zabilježeni su problemi s ponovnim učitavanjem uvjeta 5. Grafičko sučelje se loše skalira kada postoje desetci, stotine ili tisuće pitanja 6. Pretvorba papirnatih upitnika može biti spora jer se moraju koristiti SGQA nazivi 7. Za složeno grananje često je potreban programer koji će napisati prilagođenu logiku |
| Relevantnost | 1. Podržava vrlo složenu logiku, uključujući 80+ funkcija i matematičke/tekstualne operatore 2. Savršena podrška za kaskadnu logiku 3. Brzo - nema dodatnih poziva bazi podataka, pa podržava upitnike s 1000+ pitanja 4. Nema problema s ponovnim učitavanjem logike jer ne zahtijeva SGQA kôdove 5. Isticanje sintakse skalira se na upitnike s 1000+ pitanja 6. Jednostavno i brzo za skupine koje žele digitalizirati postojeće papirnate upitnike. 7. Jednostavno podržava polustrukturirane intervjue i epidemiološke upitnike bez potrebe za programerima |
1. Nema grafičkog sučelja za jednostavne uvjete - umjesto toga koristite isticanje sintakse 2. Novo je, pa timovi za podršku još nisu savladali EM. |
Zaključak je da, ako ste zadovoljni načinom rada LimeSurvey 1.91+, nema razloga mijenjati ono što radite.
Koje su još prednosti korištenja EM-a?
Evo nekoliko drugih razloga zbog kojih biste mogli koristiti EM.
- Izračuni - možete izraditi bilo koji izračun koji možete zamisliti:
- Imate pristup svim uobičajenim matematičkim operatorima i funkcijama
- Imate pristup 70+ matematičkih funkcija te funkcija za obradu datuma i teksta
- Programerima je prilično jednostavno dodati nove funkcije ako ih korisnici trebaju
- Spremanje izračuna u bazu podataka
- Sada možete izračunati jednostavne i složene izračune i/ili rezultate skala I spremiti ih u bazu podataka bez potrebe za JavaScriptom.
- Za to koristite vrstu pitanja Jednadžba.
- Procjene
- Sada možete izraditi procjene ili rezultate skala iz bilo koje vrste pitanja, a ne samo iz podskupa koji je ranije bio podržan
- Možete koristiti prilagodbu teksta (tailoring) za prikaz tekućih ili ukupnih rezultata procjene gdje god je potrebno - čak i na istoj stranici
- Imate veću kontrolu nad izvještajima generiranim na temelju tih rezultata procjene
- Rezultate procjene možete spremiti u bazu podataka bez potrebe za JavaScriptom
- Rezultate procjene možete sakriti bez potrebe za JavaScriptom ili CSS-om
- Polja za zamjenu
- Koristite kôd pitanja za umetanje vrijednosti iz odgovora na prethodna pitanja - tako je lakše čitati i provjeravati.
- Prilagodba teksta (tailoring) - možete uvjetno prikazati tekst na temelju drugih vrijednosti
- Koristite odgovarajući oslov za ispitanika, npr. ("Poštovani [g./gđo] Horvat")
- Ispisujte gramatički ispravne rečenice kada su važni jednina/množina: (npr. "Imate 1 dijete" naspram "Imate 2 djece")
- Prikladno konjugirajte glagole i deklinirajte imenice prema spolu i broju ispitanika.
- Novi atributi varijabli - za prilagodbu teksta možete pristupiti sljedećem:
- (bez sufiksa) - alias za qcode.code
- .code - odabrani kôd odgovora za pitanje ako je relevantno (inače prazno) ili tekstualna vrijednost ako pitanje nije kodirano
- .NAOK - isto kao .code, ali može biti dio izračuna ili popisa čak i ako je nerelevantno
- .value - vrijednost procjene za pitanje ako je relevantno (inače prazno) ili tekstualna vrijednost ako pitanje nije kodirano -- dostupno ako su procjene omogućene za upitnik, inače je uvijek nula
- .valueNAOK - isto kao .value, ali može biti dio izračuna ili popisa čak i ako je nerelevantno
- .shown - odgovor onako kako je prikazan korisniku
- .qid - ID pitanja
- .gid - ID skupine
- .sgqa - SGQA vrijednost pitanja
- .jsName - ispravan naziv JavaScript varijable za pitanje, bez obzira je li definirano na ovoj ili na drugoj stranici
- .qseq - redni broj pitanja (počevši od 0)
- .gseq - redni broj grupe (počevši od 0)
- .mandatory - je li pitanje obavezno (Y/N)
- .question - tekst pitanja
- .relevance - jednadžba relevantnosti za pitanje
- .grelevance - jednadžba relevantnosti za grupu
- .relevanceStatus - je li pitanje trenutno relevantno ili ne (boolean (može se razlikovati u PHP-u i JS-u))
- .type - vrsta pitanja (jednoznakovni kôd)
- Dinamičke promjene na stranici
- Sva relevantnost, izračuni i prilagodba teksta rade dinamički na stranici - promjene vrijednosti odmah ažuriraju stranicu
- Tako pitanja dinamički nestaju/pojavljuju se ovisno o tome jesu li relevantna
- Pitanja se također dinamički prilagođavaju na temelju odgovora na stranici, pa možete vidjeti tekuće zbrojeve, prilagođene rečenice i prilagođene izvještaje.
- Novi ekran za unos podataka
- Uz postojeći sustav unosa podataka možete jednostavno koristiti Upitnik-Sve-U-Jednom.
- To podržava relevantnost i prilagodbu teksta na stranici, pa osoblje za unos podataka može brzo prelaziti tipkom Tab i morat će unositi samo relevantne odgovore
- To može biti ključno ako osoba koja unosi podatke treba vidjeti prilagodbu teksta, koja je također dinamička.
- Uklanja potrebu za većinom prilagođenog JavaScripta
- EM jednostavno podržava složene izračune, bodovanje, prilagodbu teksta i uvjetnu logiku.
- Neke stvari i dalje će zahtijevati JavaScript (poput prilagođenih rasporeda i uvjetnog skrivanja podelemenata pitanja), ali vaš JavaScript može koristiti EM funkcije kako biste pitanjima pristupali putem Qcode-a umjesto SGQA-a i pristupali svim gore navedenim svojstvima pitanja.
Koje su još korisne nove značajke omogućene EM-om?
Bez obzira nastavljate li koristiti uređivač uvjeta ili ručno pišete jednadžbe relevantnosti, dobivate ove dodatne prednosti:
- Možete stvoriti složenije kriterije provjere
- Svi napredni atributi pitanja (poput max_answers, min_num_value_n, max_num_value) mogu koristiti izraze. Tako se vaši kriteriji minimuma/maksimuma mogu jednostavno prilagoditi prema prethodnim odgovorima, čak i ako se nalaze na istoj stranici.
- EM obrađuje i svu provjeru temeljenu na regularnim izrazima, pa možete pouzdano kombinirati preg atribute pitanja i atribute pitanja temeljene na jednadžbama.
- Jednostavno premještanje (ili brisanje) pitanja i grupa
- Prije verzije 1.92 nije bilo moguće promijeniti redoslijed pitanja ili grupa ako je LimeSurvey smatrao da bi takva promjena mogla pokvariti uvjete u kojima se koriste. Isto tako, pitanja se nisu mogla izbrisati ako su o njima ovisila druga pitanja.
- Zahvaljujući EM-ovom isticanju sintakse lako je vidjeti i provjeriti pokušavate li koristiti pitanja prije nego što su deklarirana. Zato sada možete promijeniti redoslijed ili izbrisati pitanja i grupe kad god želite. EM će ažurirati isticanje sintakse kako bi vam pokazao moguće pogreške.
- Prikaz promjene redoslijeda pitanja poboljšan je radi lakšeg pregleda. Sada prikazuje jednadžbu relevantnosti pitanja i prilagodbu teksta, pa odmah možete vidjeti postaje li neka varijabla ružičasta (što znači da se koristi prije deklaracije).
- Indeks navigacije po pitanjima/grupama uvijek je dostupan i točan
- Prije verzije 1.92 ti indeksi nisu bili dostupni ako su postojali složeni uvjeti
- S EM-om možemo jamčiti da su točni.
- Ispitanici se čak mogu vratiti na prethodno pitanje, promijeniti odgovor, a zatim ići naprijed (ili poslati upitnik)
- Pri skoku naprijed EM će ponovno provjeriti sva pitanja/grupe između.
- Ako neka pitanja postanu nerelevantna, u bazi podataka bit će postavljena na NULL kako bi vaši podaci bili interno dosljedni
- Ako neka pitanja postanu relevantna ili novo ne zadovolje pravila obaveznosti ili provjere, EM će se zaustaviti na toj stranici i natjerati korisnika da odgovori na ta pitanja prije skoka na krajnje odredište.
- Automatska pretvorba uvjeta u relevantnost
- Kada nadogradite bazu podataka, za sve postojeće upitnike koji imaju uvjete bit će generirane jednadžbe relevantnosti
- Kad god uvezete upitnik, po potrebi će se stvoriti jednadžbe relevantnosti
- Kad god dodate, izbrišete ili izmijenite uvjete, EM će generirati odgovarajuću jednadžbu relevantnosti.
- Praktično isticanje sintakse
- Kad EM prikazuje jednadžbu relevantnosti, prikazat će Qcode, čak i ako ste unijeli SGQA kôd, jer pretpostavljamo da je tako lakše čitati.
- Sve varijable obojene su tako da pokazuju jesu li deklarirane prije ili poslije trenutnog pitanja (ili prije ili poslije trenutne grupe). Tako brzo možete uočiti i ispraviti slučajeve u kojima varijable koristite u relevantnosti (uključujući array_filter), prilagodbi teksta ili jednadžbama provjere prije njihove deklaracije.
- Osim toga, ako mišem prijeđete preko obojene varijable, vidjet ćete najvažnije metapodatke o tom pitanju. To uključuje redni broj grupe, redni broj pitanja, Qcode, tekst pitanja i sve dostupne ponuđene odgovore (ako je riječ o vrsti pitanja s popisom odgovora).
- Popis ponuđenih odgovora koristi ovu sintaksu: 'answers':{key:val, ... }.
- key ima sintaksu 'scale~code', gdje je scale skala odgovora (npr. za dvostruku skalu), a code kôd odgovora.
- val ima sintaksu 'value~shown', gdje je value vrijednost procjene (ako se koriste procjene, inače code) (npr. Qcode.value), a shown je prikazana vrijednost koju vidi ispitanik (npr. Qcode.shown)
- To znači da mnogi upitnici mogu koristiti izračune bez načina rada procjene. Ako imate popis odgovora koji su jedinstveni, nedecimalni i nenegativni, jednostavno možete provoditi izračune nad vrijednostima Qcode.code.
- Jednostavan pregled cjelokupne logike i sadržaja upitnika
- Postoji nova značajka Prikaži logiku upitnika koja omogućuje da sve o upitniku (ili grupi ili pitanju) vidite na jednoj stranici.
- Prikazuje detalje na razini grupe, pitanja, potpitanja i odgovora za odabrani opseg (upitnik, grupa ili pitanje)
- Prikazuje i relevantnost, relevantnost na razini potpitanja (za array_filter i array_filter_exclude), generiranu jednadžbu provjere (za preg i sva pravila provjere poput min/maks zbroja/broja vrijednosti) te sve neprazne atribute pitanja.
- Sve je istaknuto sintaksom kako biste mogli vidjeti moguće sintaktičke pogreške (poput nebalansiranih zagrada ili korištenja varijabli prije njihove deklaracije)
- Isticanje sintakse omogućuje brzu navigaciju i uređivanje upitnika.
- Ako kliknete na naziv varijable, otvara se prozor preglednika (ili kartica) koji prikazuje to pitanje i omogućuje njegovo uređivanje.
- Ako kliknete na naziv grupe, otvara se prozor preglednika (ili kartica) s prikazom promjene redoslijeda grupa kako biste lako mogli premještati pitanja.
- Svi atributi pitanja također su istaknuti sintaksom. Tako možete postavljati i vidjeti izraze unutar naprednih opcija pitanja (primjerice, temeljiti maks/min broj/zbroj vrijednosti na izrazu)
- Autor EM-a koristio je sličan prikaz (malo urednije izvedbe) kako bi njegovi suradnici epidemiolozi i etičko povjerenstvo mogli provjeriti i odobriti upitnike s tisućama pitanja u visoko razgranatim i prilagođenim strukturiranim intervjuima
Početak rada
Najbolji način za početak rada s EM-om je:
- Instalirajte najnoviju stabilnu verziju s http://www.limesurvey.org/en/download
- Uvezite i istražite primjere upitnika.
- Istražite slučajeve upotrebe i upute i primjere korak po korak.
- Pročitajte EM dokumentaciju (ovu stranicu)
- Isprobajte ugrađeni EM testni skup
- Iz bilo kojeg upitnika, pod alatima, odaberite EM opciju
- Dostupne funkcije navodi 70+ funkcija i sintaksu
- Jedinični testovi izoliranih izraza
- prikazuje primjere korištenja svih EM funkcija i operatora te rezultate u PHP-u i JavaScriptu
- imajte na umu da nekoliko funkcija daje različite rezultate u PHP i JavaScript verzijama, pa vam ova stranica omogućuje da svoju EM logiku planirate u skladu s tim.
Koju funkcionalnost Expression Manager proširuje/zamjenjuje? (LimeSurvey <= 1.91+)
Uvjeti => Relevantnost
Uvjeti su kontrolirali koja su pitanja vidljiva. Opća sintaksa bila je SGQA operator Vrijednost, primjerice 111X2X3 == "Y". Uvjeti su se mogli povezivati s AND ili OR, ali miješanje AND i OR bilo je teško. Sami uvjeti pohranjivali su se u zasebnu tablicu, a velik dio LimeSurveyjeva koda bio je posvećen upravljanju uvjetima. Zbog opsežnog pristupa bazi podataka obrada velikog broja uvjeta mogla je uzrokovati primjetne probleme s performansama. Nadalje, nakon što ste pitanjima ili grupama dodijelili uvjete, često im nije bilo dopušteno mijenjati redoslijed niti ih brisati.
Procjene => Jednadžbe i mikroprilagodba teksta
Procjene omogućuju korisnicima stvaranje skala bodova iz skupa pitanja. Međutim, nisu se mogle dinamički mijenjati na trenutnoj stranici, a njihove vrijednosti nisu se pohranjivale u bazu podataka.
Zamjene => Mikroprilagodba teksta
Korisnici su mogli prilagoditi neke poruke i pitanja na temelju prethodnih odgovora. Na primjer, pitanje je moglo glasiti {TOKEN:FIRSTNAME}, rekli ste da je {SPORT.shown} vaš omiljeni sport. Međutim, nije bilo moguće provesti uvjetnu prilagodbu (primjerice reći "g." ili "gđa" ovisno o spolu osobe), niti sprezati glagole ili mijenjati imenice po padežima bez složenog JavaScripta. Autori su mogli izraditi upitnike koji su izgledali kao da prilagođavaju pitanja, ali to je zahtijevalo zasebna pitanja za svaku permutaciju i složene uvjete za odlučivanje koja će se pitanja prikazati.
Provjera
Pitanja su se mogla provjeravati regularnim izrazima ili minimalnim/maksimalnim vrijednostima, ili tako da odgovor služi kao minimalna ili maksimalna vrijednost. Međutim, provjere se nisu mogle temeljiti na izračunima drugih varijabli bez složenog JavaScripta.
Jednadžbe
Jednadžbe nisu bile podržane bez složenog JavaScripta.
Vrsta pitanja Jednadžba
Jednadžbe se nisu mogle spremiti u bazu podataka (npr. konačni rezultat procjene) bez složenog JavaScripta.
Kako će Expression Manager zamijeniti/proširiti tu funkcionalnost?
Expression Manager je novi osnovni modul unutar LimeSurveyja koji znatno olakšava podršku složenoj funkcionalnosti za koju je prije bio potreban prilagođeni JavaScript. Također zamjenjuje način na koji LimeSurvey trenutno upravlja uvjetima i procjenama.
Nova terminologija pri spominjanju Expression Managera (EM)
EM svoju funkcionalnost "promatra" kroz sljedeće pojmove:
- Grananje temeljeno na relevantnosti - ako je pitanje relevantno, postavi se, inače ne (npr. postane nevidljivo i u bazi podataka označi se kao NULL). Postoji novo polje Relevantnost za sve vrste pitanja, kao i za svaku grupu (tako da možete primijeniti skup uvjeta na cijelu grupu bez kopiranja istog uvjeta na svako pitanje i/ili kombinirati uvjetnu logiku na razini grupe i pitanja).
- Prilagodba teksta - Kad znate koja pitanja treba postaviti, prilagodba teksta (ponekad zvana piping) određuje kako pitanje treba biti postavljeno. Tako možete podržati ne samo jednostavnu zamjenu (poput {TOKEN:FIRSTNAME}), nego i sprezanje glagola i mijenjanje imenica po padežima ovisno o spolu ili broju vaših ispitanika. Također možete promijeniti poruku koju upućujete ispitaniku ovisno o tome jesu li odgovorili (ili kako su odgovorili) na druga pitanja.
- Jednadžbe - EM dodaje novu vrstu pitanja zvanu Jednadžba koja pohranjuje rezultat izraza. Rezultati tih jednadžbi izračunavaju se i zapisuju u bazu podataka, čak i ako ih sakrijete na stranici. Stoga su korisne za skrivene izračune bodova, navigaciju temeljenu na složenim jednadžbama, procjene i izvještaje koji se trebaju generirati i biti lako dostupni u bazi podataka.
Relevantnost i kaskadna relevantnost
Svaka vrsta pitanja sada ima opciju Relevantnost koja kontrolira hoće li se pitanje prikazati. EM obrađuje svaku jednadžbu relevantnosti redoslijedom kojim se pitanja pojavljuju u upitniku. Ako je izraz istinit (ili nedostaje - radi podrške starijim upitnicima), pitanje će se prikazati. Ako nije relevantno, pitanje će biti skriveno, a vrijednost će u bazi podataka biti postavljena na NULL. Ako u grupi nema relevantnih pitanja, cijela grupa bit će preskočena.
Štoviše, ako je bilo koja varijabla unutar izraza nerelevantna, izraz se uvijek ocjenjuje kao netočan. To omogućuje kaskadnu relevantnost, pa ne morate pisati vrlo duge jednadžbe relevantnosti za svako pitanje.
Recimo da imate 5 pitanja Q1-Q5 i želite prikazati Q2 samo ako je odgovoreno na Q1, Q3 ako je odgovoreno na Q2 itd. Jednadžbe relevantnosti mogle bi biti:
| Kôd pitanja | Relevantnost | Pitanje |
|---|---|---|
| Q1 | 1 | Kako se zovete? |
| Q2 | Q1 | {Q1}, koliko imate godina? |
| Q3 | Q2 | Dakle, imate {Q2} godina. Jeste li u braku? |
| Q4 | Q3 == "Y" | {Q1}, koliko dugo ste u braku? |
| Q5 | Q4 | Koliko djece imate, {Q1}? |
Izračuni relevantnosti rade i u JavaScriptu - pa biste sva gornja pitanja mogli staviti na jednu stranicu i sve bi radilo prema očekivanju. Zapravo, EM u potpunosti zamjenjuje način na koji se obrađuju formati upitnika po upitniku, po grupi i po pitanju. Svi sada koriste potpuno isti mehanizam navigacije pa rade identično bez obzira na stil upitnika.
Dok god ste na istoj stranici, svi podaci koje ste unijeli i dalje će biti tu, samo skriveni. Dakle, ako unesete neke informacije, zatim odaberete opciju zbog koje postanu nerelevantne, pa ih ponovno učinite relevantnima, vaši odgovori i dalje će biti dostupni. Međutim, čim prijeđete na drugu stranicu, svi nerelevantni odgovori bit će izgubljeni radi očuvanja integriteta skupa podataka.
Relevantnost na razini grupe
Expression Manager podržava i relevantnost na razini grupe. Time je jednostavnije implementirati petlje. Recimo da želite prikupiti informacije o najviše 10 entiteta (poput proizvoda ili osoba u kućanstvu), pri čemu prvo utvrdite za koliko je entiteta potrebno dodatno pitanje (na primjer pitanjem koliko osoba živi u kućanstvu ili tako da ispitanici s dugog popisa označe koji im se proizvodi sviđaju). Nakon što znate za koliko je entiteta potrebno dodatno ispitivanje, možete koristiti relevantnost na razini grupe poput {count >= 1}, {count >=2}, ... {count >= 10} za svaku od 10 grupa dodatnih pitanja. Unutar svake grupe možete imati uvjetnu logiku na razini pitanja (npr. dodatna pitanja specifična za spol ili dob svakog predmeta). Jednadžbe relevantnosti na razini pitanja i grupe povezuju se operatorom I (AND) kako bi se utvrdilo što treba prikazati.
Prilagodba / Piping
Sve unutar vitičastih zagrada sada se tretira kao izraz (uz jednu iznimku opisanu u nastavku). Izrazi imaju pristup svim LimeReplacementFields poljima, svim varijablama (putem nekoliko aliasa), svim uobičajenim operatorima u jednadžbama (matematičkim, logičkim i usporednim) te desecima funkcija (koje dinamički rade čak i na strani klijenta).
Pomoću tih jednadžbi možete, primjerice:
- Uvjetno prikazivati prilagođene poruke ispitanicima na temelju prethodnih odgovora
- Izraditi procjene i prikazati rezultate procjene (ili uvjetno granati upitnik ili prikazivati poruke) na temelju tih rezultata, sve bez korištenja samog modula za procjene
- Konjugirati glagole i deklinirati imenice unutar pitanja, odgovora i izvještaja.
- Prikazati sažetke odgovora prije stranice "Prikaži svoje odgovore" na kraju upitnika
Jednadžbe
Postoji nova vrsta pitanja pod nazivom Jednadžba. Ona je slična pitanju Boilerplate, osim što vrijednost onoga što se prikazuje sprema u bazu podataka. Dakle, ako tekst pitanja vrste Jednadžba sadrži izračun procjene, ta će se vrijednost spremiti u bazu podataka u varijablu koja se može prikazati u javnoj ili privatnoj statistici.
Time se rješava čest zahtjev za spremanjem rezultata procjene u bazu podataka
Sintaksa
Sve što se nalazi unutar vitičastih zagrada sada se smatra izrazom (uz jednu iznimku: ne smije biti razmaka na početku ni na kraju - to je potrebno kako Expression Manager ne bi pokušavao obrađivati ugrađeni JavaScript).
Napomena: izrazi se smiju protezati kroz više redaka, sve dok nema razmaka nakon otvorene vitičaste zagrade ili prije zatvorene vitičaste zagrade. To je osobito korisno za ugniježđene naredbe if() poput ove:
{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',
''
)
)
)
)
)
)
)
)}
- Sve standardne matematičke operatore (npr. +,-,*,/,!)
- Sve standardne operatore usporedbe (npr. <,<=,==,!=,>,>=, plus ekvivalente: lt,le,eq,ne,gt,ge)
- Zagrade (kako biste mogli grupirati podizraze)
- Uvjetne operatore (npr. &&,| | i ekvivalente: and,or)
- Nizove znakova u jednostrukim i dvostrukim navodnicima (u svaki se mogu ugraditi nizovi s drugom vrstom navodnika)
- Operator zarez (omogućuje popis izraza pri čemu se vraća samo konačni rezultat)
- Operator dodjele (=)
- Unaprijed definirane varijable (za pozivanje na pitanja, atribute pitanja i odgovore) - npr. svi SGQA kodovi
- Unaprijed definirane funkcije (već ih ima 70+, a lako je dodati nove)
Operatori
Sintaksa EM-a slijedi uobičajeni prioritet operatora:
| Razina | Operator(i) | Opis |
|---|---|---|
| 1 | () | zagrade za grupiranje ili pozivanje funkcija |
| 2 | ! - + | unarni operatori: negacija (not), promjena predznaka, unarni plus |
| 3 | * / | množenje, dijeljenje |
| 4 | + - | zbrajanje, oduzimanje |
| 5 | < <= > >= lt le gt ge | relativne usporedbe |
| 6 | == != eq ne | usporedbe jednakosti |
| 7 | and | logičko I (AND) |
| 8 | or | logičko ILI (OR) |
| 9 | = | operator dodjele |
| 10 | , | operator zarez |
Upozorenje o operatoru plus (+)
Radi dosljednosti između JavaScripta i PHP-a, operator plus (+) zbraja ako su oba operanda brojevi, a spaja (konkatenira) ako su oba dijela nizovi znakova koji nisu brojevi. No preporučujemo korištenje funkcije join() za spajanje i funkcije sum() za zbrajanje, jer tako jasnije izražavate svoju namjeru i izbjegavate neočekivane rezultate ako ste očekivali nizove znakova, a dobili brojeve (ili obrnuto).
Upozorenje o nepodudaranju broja i niza znakova te abecednoj usporedbi
Kada vrijednosti uspoređujete relativnim usporedbama ili usporedbama jednakosti, obratite pozornost na nepodudaranje tipova. Vrijednost koju je unio korisnik ili odabrani kôd odgovora može se koristiti kao broj ako je jasno da je broj.
Ako jednu od vrijednosti okružite znakom ", usporedba će se obaviti kao tekstualna (abecedna usporedba). Ako želite usporedbu obaviti numerički, nikada ne stavljajte broj u navodnike, ".
Na primjer, Q0.NAOK > "50" je istina ako je Q0.NAOK numeričko pitanje s vrijednošću 9. To je zato što će operator > pretpostaviti abecednu, a ne numeričku usporedbu.
Da biste bili sigurni da uspoređujete cjelobrojnu vrijednost, možete koristiti intval(Q0.NAOK) > 50, samo imajte na umu da ako Q0.NAOK nije broj (prazan je ili je niz znakova), onda je intval(Q0.NAOK) == 0. Za usporedbu nizova znakova ("A" < "B") koristite izravno strcmp: strcmp(Q0.NAOK,"B") ili strcmp(Q0.NAOK,"A5").
Oprez pri korištenju operatora dodjele (=)
Napomena: operatore dodjele treba izbjegavati osim ako je to apsolutno nužno jer mogu uzrokovati neočekivane nuspojave. Na primjer, ako promijenite vrijednost prethodnog odgovora, kaskadna relevantnost i logika provjere između tog pitanja i trenutnog pitanja neće se ponovno izračunati, pa možete dobiti međusobno nedosljedne podatke (npr. pitanja koja ostaju odgovorena, a trebala su biti postavljena na NULL, ili pitanja koja su preskočena, a trebala su biti odgovorena). Općenito, ako varijabli želite dodijeliti vrijednost, trebali biste izraditi pitanje vrste Jednadžba i izrazom postaviti njegovu vrijednost. Međutim, ponekad ljudi doista trebaju ovaj operator, pa smo ga učinili dostupnim.
Kako bismo vas upozorili na ovaj operator, u sintaksi jednadžbi prikazuje se crvenim fontom (da ga ne biste zamijenili s "==")
Korištenje operatora dodjele
Glavni razlozi zbog kojih biste mogli htjeti koristiti dodjelu su:
- Trebate postaviti zadanu vrijednost za pitanje koje ne prihvaća zadane vrijednosti putem jednadžbe (poput popisa s radio-gumbima, gdje korisničko sučelje omogućuje odabir jedne od opcija odgovora, ali ne i unos jednadžbe). Budite oprezni, jer LimeSurvey neće moći provjeriti generira li vaša jednadžba jedan od dopuštenih odgovora za to pitanje.
- Trebate prisilno promijeniti odgovor na prethodno pitanje na temelju kasnijeg odgovora
- Trebate složenu kvotu: korištenjem jednog skrivenog pitanja s jednim odabirom za kvotu i postavljanjem njegove vrijednosti dodjelom
- itd...
Za tu svrhu možete koristiti cijeli sustav Expression Managera.
Nekoliko primjera:
- Postavljanje odgovora na pitanje vrste Kratki tekst malim slovima:
{QCODE=strtolower(QCODE.NAOK)} - Postavljanje zadanog odgovora na pitanje vrste niz na početku upitnika:
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)} - Postavljanje zadanog odgovora na pitanje vrste niz tekstova na početku upitnika:
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)} - Postavljanje odgovora s uvjetom:
{QCODE=if(YesNo="Y","A1","")}
XSS sigurnost
Kada je XSS zaštita omogućena, neke značajke upravitelja izraza (Expression Manager) ne mogu se koristiti:
- otvaranje HTML oznake u jednom izrazu, a zatvaranje u drugom izrazu
- korištenje složenog izraza u URL-u.
Primjer i zaobilazno rješenje
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}ne radi uz XSS zaštitu, umjesto toga možete koristiti{if(1,"<strong>information</strong>","information")}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, ovdje možete koristiti pitanje tipa jednadžba jer je korištenje cjelovitog kôda pitanja u redu:<a href="/script.php?value={EQUATION.NAOK}">next</a>
Pristup varijablama
Expression Manager omogućuje pristup samo za čitanje svim varijablama koje bi nam mogle zatrebati. Zbog povratne kompatibilnosti omogućuje pristup sljedećem:
- TOKEN:xxx - vrijednost TOKEN-a (npr. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (samo za upitnike koji NISU anonimni).
- QCODE.shown - prikazana vrijednost odgovora (npr. "Da") pomoću Expression Managera.
- Sve {XXX} vrijednosti koje koriste predlošci.
- U tekstu pitanja možete koristiti {QID}, koji se zamjenjuje ID-om pitanja, i {SGQ}, koji se zamjenjuje SGQA-om pitanja
Osim toga, Expression Manager omogućuje da se na varijable pozivate pomoću kôda pitanja (stupac 'title' u tablici pitanja u bazi podataka). To je ujedno i oznaka varijable koja se koristi pri izvozu podataka u SPSS, R ili SAS. Na primjer, ako imate pitanja o imenu, dobi i spolu, te varijable možete nazvati name, age i gender umjesto 12345X13X22, 12345X13X23 i 12345X13X24. Tako su jednadžbe svima čitljivije, a njihova logika lakše provjerljiva, a pitanja možete premještati bez potrebe za praćenjem brojeva grupa ili pitanja.
Važno: Sigurno je pozivati se samo na varijable koje se nalaze na prethodnim stranicama ili u prethodnim pitanjima.
Nadalje, Expression Manager omogućuje pristup mnogim svojstvima pitanja:
| Sintaksa | Značenje | Primjer | Rezultat primjera |
|---|---|---|---|
| Qcode | alias za Qcode.code | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | odabrani kôd odgovora za pitanje ako je relevantno (inače prazno), ili tekstualna vrijednost ako pitanje nije kodirano | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | isto kao Qcode - pogledajte raspravu o NAOK-u | {gender.NAOK} | 'M' |
| Qcode.value | vrijednost procjene za pitanje ako je relevantno (inače prazno), ili tekstualna vrijednost ako pitanje nije kodirano | {gender.value} | '1' |
| Qcode.valueNAOK | isto kao Qcode.value - pogledajte raspravu o NAOK-u | {gender.valueNAOK} | '1' |
| Qcode.shown | prikazana vrijednost za pitanje | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | tekst pitanja | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | je li pitanje obavezno (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | interni broj pitanja (ne redni broj) | {gender.qid} | 337 |
| Qcode.type | vrsta pitanja | {gender.type} | 'G' |
| Qcode.jsName | ispravan javascript naziv pitanja, bez obzira je li deklarirano na ovoj stranici ili izvan nje | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | interni broj grupe (ne redni broj) | {gender.gid} | 3 |
| Qcode.qseq | redni broj pitanja, počevši od 0 | {gender.qseq} | 5 |
| Qcode.gseq | redni broj grupe, počevši od 0 | {gender.gseq} | 1 |
| Qcode.relevanceStatus | je li pitanje trenutno relevantno (0 ili 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | jednadžba relevantnosti na razini pitanja | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | jednadžba relevantnosti na razini grupe | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | SGQA vrijednost za ovo pitanje | {gender.sgqa} | '1827X3X337' |
Problem s HTML uređivačem
Ako koristite HTML uređivač, neki se znakovi zamjenjuju HTML entitetima.
- & u &
- < u <
- > u >
Ako koristite HTML uređivač, morate koristiti:
- and za &
- lt za <
- le za <=
- gt za >
- ge za >=
Imenovanje Qcode varijabli
Ovdje su detalji o tome kako konstruirati Qcode (i pristupiti nekim svojstvima) prema vrsti pitanja. Općenito se Qcode konstruira ovako:
QuestionCode . '_' . SubQuestionCode . '_' . ScaleId
Kôd potpitanja i ID skale koriste se ili ne ovisno o vrsti pitanja - pogledajte tablicu u nastavku. Za comment i other, kôdovi pitanja su QuestionCode_comment i QuestionCode_other
| Vrsta | Opis | Kôd | Potpitanja | Opcije odgovora | Skale | Kôd odgovora | Prikazani odgovor | Relevantnost |
|---|---|---|---|---|---|---|---|---|
| 5 | Izbor 5 opcija (radio-gumbi) | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Niz (izbor u 10 opcija) radio-gumbi | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Niz (izbor u 5 opcija) radio-gumbi | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Niz (fleksibilne oznake) dvostruka skala | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Niz (fleksibilno) - format stupaca | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Niz (fleksibilno) - format redaka | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Niz (Povećaj/Isto/Smanji) radio-gumbi | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Niz (višestruko fleksibilno) 1 do 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Niz (višestruko fleksibilno) tekst | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Niz (Da/Nesigurno/Ne) radio-gumbi | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Pitanje s predloškom teksta (boilerplate) | Q11 | {Q11.shown} | |||||
| D | Datum | Q12 | {Q12} | {Q12.shown} | ||||
| * | Jednadžba | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Učitavanje datoteka (bilježi broj učitanih datoteka) | Q14 | {Q14} | {Q14>0} | ||||
| G | Padajući izbornik za spol | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Slobodan tekst (dugačak) | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Pitanje o jeziku | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Popis - padajući izbornik | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Popis (padajući izbornik/radio-gumbi) | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Popis s komentarom (padajući izbornik/radio-gumbi + tekstualno polje) | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Slobodan dugačak tekst | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Višestruki izbor (potvrdni okviri) | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Višestruki izbor s komentarima (potvrdni okvir + tekst) | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Višestruko numeričko pitanje | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Više kraćih tekstova | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Numeričko pitanje | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Rangiranje | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Slobodan tekst (kratak) | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Da/Ne radio-gumbi | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
Rezervirane varijable 'this', 'self' i 'that'
Vrlo često želite obraditi sve dijelove pitanja, na primjer prebrojiti koliko je potpitanja odgovoreno ili zbrojiti rezultate. Ponekad želite obraditi samo određene retke ili stupce pitanja (na primjer dobiti zbrojeve redaka ili stupaca i pohraniti ih u bazu podataka). Ove rezervirane varijable taj postupak čine relativno jednostavnim.
Varijabla 'this' koristi se isključivo unutar naprednih opcija pitanja "Jednadžba validacije cijelog pitanja" i "Jednadžba validacije potpitanja". Ona se proširuje na nazive varijabli svake od ćelija unutar tih pitanja. Dakle, ako želite osigurati da je svaki unos veći od tri, postavili biste "Jednadžbu validacije potpitanja" na (this > 3).
Varijable 'self' i 'that' moćnije su i služe kao makroi koji se proširuju prije obrade jednadžbi. Moguće sintakse su:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
suffix je bilo koji od uobičajenih sufiksa kôda pitanja (npr. NAOK, value, shown)
sub-selector je jedno od sljedećeg:
- comments - samo potpitanja koja su komentari (npr. iz višestrukog izbora s komentarom i popisa s komentarom)
- nocomments - samo potpitanja koja nisu komentari
- sq_X - gdje je X identifikator retka ili stupca. Odabiru se samo potpitanja koja odgovaraju uzorku X. Imajte na umu da se pretraživanje obavlja na cjelovitom identifikatoru kôda, a zatim sq_X odgovara i uključuje potpitanja nX, X, Xn (npr. ako koristite sq_1, uključena su potpitanja a1, 1a, 1, 11 ili 001). Obratite pažnju na vrstu pitanja s dvostrukom skalom, gdje su kôdovi potpitanja QCODE_SQCODE_1 i QCODE_SQCODE_1, te na vrstu pitanja rangiranje, gdje su kôdovi potpitanja QCODE_1, QCODE_2 ....
- nosq_X - gdje je X identifikator retka ili stupca. Odabiru se samo potpitanja koja ne odgovaraju uzorku X. Imajte na umu da se pretraživanje obavlja na cjelovitom identifikatoru kôda, a zatim nosq_X odgovara i ne uključuje potpitanja nX, X, Xn
Primjeri:
- Je li odgovoren bilo koji dio pitanja? {count(self.NAOK)>0}
- Kolika je vrijednost procjene za ovo pitanje? {sum(self.value)}
Ovo možete koristiti i za dobivanje zbrojeva redaka i stupaca. Recimo da imate niz brojeva s recima A-E i stupcima 1-5.
- Koliko je sveukupno? {sum(self.NAOK)}
- Koliki je zbroj retka B? {sum(self.sq_B.NAOK)}
- Koliki je zbroj stupca 3? {sum(self.sq_3.NAOK)}
Varijabla 'that' slična je varijabli 'self', ali omogućuje pozivanje na druga pitanja. Njezina je sintaksa:
- that.qname
- that.qname.suffix
- that.qname.sub-selector
- that.qname.sub-selector.suffix
qname je naziv pitanja bez ikakvih nastavaka potpitanja. Dakle, ako izradite pitanje 'q1', to je njegov qname
Primjeri:
- Je li odgovoren bilo koji dio pitanja q1? {count(that.q1.NAOK)>0}
- Kolika je vrijednost procjene za q2? {sum(that.q2.NAOK)}
- Koliko je sveukupno za q3? {sum(that.q3.NAOK)}
- Koliki je zbroj retka C u q4? {sum(that.q4.sq_C.NAOK)}
- Koliki je zbroj stupca 2 u q4? {sum(that.q4.sq_2.NAOK)}
Varijable 'self' i 'that' mogu se koristiti u bilo kojoj relevantnosti, provjeri ili prilagodbi teksta.
Jedno upozorenje: kada koristite značajku Prikaži datoteku logike, ona će prikazati proširenu vrijednost varijabli 'self' i 'that'. Tako možete vidjeti stvarnu jednadžbu koja će biti generirana te možete (vi i Expression Manager) provjeriti postoje li varijable. To može djelovati zbunjujuće jer možete vidjeti prilično dugačke jednadžbe. Međutim, ako uredite pitanje, vidjet ćete izvornu jednadžbu koja koristi 'self' i/ili 'that'
Također imajte na umu da ne biste trebali koristiti ove varijable ako (a) želite izričito imenovati svaku varijablu korištenu u jednadžbi ili (b) koristite varijable koje nemaju potpitanja (npr. pitanja s jednim odgovorom). U tim je slučajevima dodavanje prefiksa 'that' varijabli suvišno i riskirate dobiti neočekivane rezultate.
Korištenje NAOK-a
NAOK --> "Not Applicable" (NA) is alright (OK), tj. „Nije primjenjivo” (NA) je u redu (OK)
Korištenje NAOK-a znači da su sve ili neke varijable nerelevantne (npr. "Not Applicable" (NA) je u redu (OK)).
Kada u bilo koju jednadžbu stavite varijablu iz nekog pitanja: ako je to pitanje (ili potpitanje) skriveno zbog uvjeta, cijela jednadžba postaje onemogućena.
Na primjer: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) uvijek vraća prazan niz znakova ako je jedno potpitanje pitanja Q1 filtrirano. Za brojanje označenih potpitanja u takvom pitanju možete koristiti count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Ako je potpitanje skriveno: Expression Manager vraća prazan niz znakova.
Bez NAOK-a: ako je jedno pitanje ili jedno potpitanje skriveno, Expression Manager uvijek vraća prazan niz znakova, što je isto kao da vraća false.
Nastavak .shown uvijek koristi NAOK sustav (prazan niz znakova ako je skriveno), ali ako vam je potreban kôd odgovora, uvijek je dobra ideja dodati .NAOK nakon kôda pitanja. Osim ako vam to nije potrebno i znate što radite.
Dodatni primjer i informacije dostupni su u odjeljku Zaobilaženje kaskadnih uvjeta
Pristup funkcijama
Expression Manager omogućuje pristup matematičkim funkcijama, funkcijama za obradu niza znakova i korisnički definiranim funkcijama, kako je prikazano u nastavku. Za te funkcije postoje PHP i JavaScript ekvivalenti pa rade identično na strani poslužitelja (PHP) i na strani klijenta (JavaScript). Nove je funkcije lako dodati.
Implementirane funkcije
Trenutačno su dostupne sljedeće funkcije:
| Funkcija | Značenje | Sintaksa |
|---|---|---|
| abs | Apsolutna vrijednost | number abs(number) |
| acos | Arkus kosinus | number acos(number) |
| addslashes | Citiraj niz kosim crtama | string addslashes(string) |
| asin | Arkus sinus | number asin(number) |
| atan | Arc tangenta | number atan(number) |
| atan2 | Tangenta luka dvije varijable | number atan2(number, number) |
| ceil | Zaokruži decimalne brojeve | number ceil(number) |
| checkdate | Vraća istinito (1) ako je datum valjan u gregorijanskom kalendaru | bool checkdate(month,day,year) |
| convert_value | Pretvara brojčanu vrijednost pomoću ulazne i izlazne tablice brojčanih vrijednosti | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Kosinus | number cos(number) |
| count | Prebrojava odgovorena (neprazna) pitanja na popisu | number count(arg1, arg12, ..., argN) |
| countif | Prebrojava odgovorena pitanja na popisu koja su jednaka prvom argumentu | number countif(matches, arg1, arg2, ... argN) |
| countifop | Prebrojava odgovorena pitanja na popisu koja zadovoljavaju kriterij (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
| date | Format za lokalni datum/vrijeme | string date(format [, timestamp=time()]) |
| exp | Izračunava eksponent od e | number exp(number) |
| fixnum | Prikazuje brojeve sa zarezom kao decimalnim separatorom, ako je potrebno | string fixnum(number) |
| floor | Zaokruži razlomke prema dolje | number floor(number) |
| gmdate | Format za GMT datum/vrijeme | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Pretvara sve HTML entitete u odgovarajuće znakove (uvijek koristi ENT_QUOTES i UTF-8) | string html_entity_decode(string) |
| htmlentities | Pretvara sve odgovarajuće znakove u HTML entitete (uvijek koristi ENT_QUOTES i UTF-8) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Pretvara posebne znakove u HTML entitete (uvijek koristi ENT_QUOTES i UTF-8) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Pretvara posebne HTML entitete natrag u znakove (uvijek koristi ENT_QUOTES i UTF-8) | string htmlspecialchars_decode(string) |
| idate | Oblikovati lokalno vrijeme / datum kao cijeli broj | string idate(string [, timestamp=time()]) |
| if (Updated in 3.0.2 ) | If u stilu programa Excel: if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
| implode | Spojite elemente u znakovni niz | string implode(glue,arg1,arg2,...,argN) |
| intval | Dobijte cjelobrojnu vrijednost varijable | int intval(number [, base=10]) |
| is_empty | Određuje smatra li se varijabla praznom | bool is_empty(var) |
| is_float | Pronalazi je li tip varijable decimalni broj (float) | bool is_float(var) |
| is_int | Pronalazi je li tip varijable cijeli broj | bool is_int(var) |
| is_nan | Pronalazi je li vrijednost „nije broj” (NaN) | bool is_nan(var) |
| is_null | Otkriva je li varijabla NULL | bool is_null(var) |
| is_numeric | Pronalazi je li varijabla broj ili numerički znakovni niz | bool is_numeric(var) |
| is_string | Pronalazi je li tip varijable znakovni niz | bool is_string(var) |
| join (New in 2.0 build 130129) | Spaja elemente u novi znakovni niz | join(arg1, arg2, ... argN) |
| list | Vraća popis neispražnjenih vrijednosti odvojenih zarezom | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Vraća popis, odvojen znakom „glue”, navedenog svojstva pitanja (retProp) za pitanja s popisa koja zadovoljavaju kriterij (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| log | Logaritam broja za zadanu bazu, ako je navedena, ili prirodni logaritam. | number log(number,base=e) |
| ltrim | Uklanja razmake (ili druge znakove) s početka znakovnog niza | string ltrim(string [, charlist]) |
| max | Nađi najvišu vrijednost | number max(arg1, arg2, ... argN) |
| min | Nađi najnižu vrijednost | number min(arg1, arg2, ... argN) |
| mktime | Dobiva UNIX vremensku oznaku za datum (svih 6 argumenata nije obavezno) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Funkcija modulo još nije podržana. Umjesto nje možete koristiti funkciju floor() | floor(x/y)==(x/y) |
| nl2br | Umeće HTML prijelome retka ispred svih novih redaka u znakovnom nizu | string nl2br(string) |
| number_format | Oblikujte broj s grupiranim tisućama | string number_format(number) |
| pi | Dobij vrijednost broja pi | number pi() |
| pow | Eksponencijalni izraz | number pow(base, exp) |
| quoted_printable_decode | Pretvara quoted-printable niz u 8-bitni niz | string quoted_printable_decode(string) |
| quoted_printable_encode | Pretvara 8-bitni niz u quoted-printable niz | string quoted_printable_encode(string) |
| quotemeta | Citiraj meta znakove | string quotemeta(string) |
| rand | Generirajte slučajni cijeli broj, pogledajte ovaj primjer | int rand() OR int rand(min, max) |
| regexMatch | uspoređuje znakovni niz s regularnim izrazom | bool regexMatch(pattern,input) |
| round | Zaokružuje broj na opcionalnu preciznost | number round(val [, precision]) |
| rtrim | Uklanja razmake (ili druge znakove) s kraja znakovnog niza | string rtrim(string [, charlist]) |
| sin | Sinus | number sin(arg) |
| sprintf | Vratite oblikovani niz | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | Kvadratni korijen | number sqrt(arg) |
| stddev | Izračunava standardnu devijaciju uzorka za popis brojeva | number stddev(arg1, arg2, ... argN) |
| str_pad | Dopunjuje niz do određene duljine drugim nizom | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | Ponovite niz | string str_repeat(input, multiplier) |
| str_replace | Zamjenjuje sve pojave traženog niza zamjenskim nizom | string str_replace(search, replace, subject) |
| strcasecmp | Usporedba binarno sigurnog znakovnog niza neovisnog na veličinu znakova | int strcasecmp(str1, str2) |
| strcmp | Usporedba binarno sigurnih znakovnih nizova | int strcmp(str1, str2) |
| strip_tags | Uklonite HTML i PHP oznake iz znakovnog niza | string strip_tags(str, allowable_tags) |
| stripos | Pronalazi položaj prve pojave unicode niza neovisno o veličini slova (počevši od 0, vraća false ako nije pronađeno) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | Uklanja navodnike iz citiranog znakovnog niza | string stripslashes(string) |
| stristr | Strstr neosjetljivo na veličinu znakova | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Dobij duljinu znakovnog niza | int strlen(string) |
| strpos | Pronalazi položaj prve pojave unicode niza (počevši od 0, vraća false ako nije pronađeno) | int strpos(haystack, needle [ offset=0]) |
| strrev | Obrni string | string strrev(string) |
| strstr | Pronađi prvu pojavu znakovnog niza | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Pretvara niz u mala slova | string strtolower(string) |
| strtotime | Pretvara gotovo bilo koji engleski tekstualni opis datuma i vremena u Unix vremensku oznaku | int strtotime(string) |
| strtoupper | Pretvara niz u velika slova | string strtoupper(string) |
| substr | Vraća dio unicode niza | string substr(string, start [, length]) |
| sum | Izračunajte zbroj vrijednosti u nizu | number sum(arg1, arg2, ... argN) |
| sumifop | Zbraja vrijednosti odgovorenih pitanja s popisa koja zadovoljavaju kriterij (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Tangens | number tan(arg) |
| time | Vrati trenutne UNIX vremenske oznake | number time() |
| trim | Uklanja razmake (ili druge znakove) s početka i kraja znakovnog niza | string trim(string [, charlist]) |
| ucwords | Pretvara prvo slovo svake riječi u nizu u veliko | string ucwords(string) |
| unique | Vraća istinito ako su svi ne prazni odgovori jedinstveni | boolean unique(arg1, ..., argN) |
Funkcije koje su planirane ili se razmatraju
Ostale funkcije koje su planirane (ili se razmatraju), ali još nisu implementirane, navedene su u nastavku. Neke od njih služe za kompatibilnost s drugim alatom za upitnike.
| Sintaksa | Značenje | Komentari |
|---|---|---|
| e() | vraća vrijednost e | |
| formatDate(X,PAT) | vraća tekstualnu vrijednost datuma X formatiranu prema Java obrascu formata datuma PAT | |
| formatNumber(X,PAT) | vraća tekstualnu vrijednost broja X formatiranu prema Java obrascu formata broja PAT | |
| getAnsOption(X) | Osnovni dodatak ExpressionAnswerOptions | |
| getAnsOption(X,Y) | Osnovni dodatak ExpressionAnswerOptions | |
| getRelevance(X) | vraća jednadžbu relevantnosti za pitanje X | |
| getStartTime() | vraća datum koji odgovara sistemskom vremenu početka ispunjavanja upitnika | |
| getType(X) | vraća tekstualni naziv tipa podataka - npr. *NA* ako je isNA() | |
| gotoFirst() | skače na prvi relevantni skup pitanja - ovo narušava uobičajeni tijek sustava | |
| gotoNext() | skače na sljedeći relevantni skup pitanja - ovo narušava uobičajeni tijek sustava | |
| gotoPrevious() | skače na prethodni relevantni skup pitanja - ovo narušava uobičajeni tijek sustava | |
| isAsked(X) | vraća true ako odgovor nije *NA*, *INVALID* niti *UNASKED* | |
| isInvalid(X) | vraća true ako je odgovor tipa *INVALID* | |
| isNA(X) | vraća true ako je odgovor tipa *NA* | |
| isNotUnderstood(X) | vraća true ako je odgovor tipa *HUH* | |
| isRefused(X) | vraća true ako je odgovor tipa *REFUSED* | |
| isSpecial(X) | vraća true ako je odgovor tipa *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* ili *HUH* | |
| isUnknown(X) | vraća true ako je odgovor tipa *UNKNOWN* | |
| jumpTo(X) | skače na grupu koja sadrži navedeno pitanje -- ovo narušava uobičajeni tijek sustava | |
| jumpToFirstUnasked() | skače na prvo nepostavljeno pitanje |
|
| lastIndexOf(X,Y) | vraća posljednji indeks (od 0) niza Y u nizu X. Vraća -1 ako X ne sadrži Y | |
| list(X,...) | tekst koji sadrži popis pozitivnih vrijednosti odvojenih zarezima, s "and" između posljednje dvije | |
| mean(X,...) | vraća srednju vrijednost popisa vrijednosti | |
| numAnsOptions(X) | vraća broj opcija odgovora koje pitanje X ima | |
| orlist(X,...) | tekst koji sadrži popis pozitivnih vrijednosti odvojenih zarezima, s "or" između posljednje dvije | |
| parseDate(X,PAT) | vraća vrijednost datuma iz niza X protumačenog prema Java obrascu formata datuma PAT | |
| parseNumber(X,PAT) | vraća numeričku vrijednost niza X protumačenog prema Java obrascu formata broja PAT | |
| showAllResponsesExcept( questionList,attributeList,attributeTitleList) | ; attributeList = popis atributa odvojenih znakom | (poput question#, title, text, type - da možete odlučiti što prikazati); attributeTitleList = popis zaglavlja tablice odvojenih znakom |, kako bi se izvješće moglo prevesti. | |
| showTheseResponses( questionList,attributeList,attributeTitleList) | ; attributeList = popis atributa odvojenih znakom | (poput question#, title, text, type - da možete odlučiti što prikazati); attributeTitleList = popis zaglavlja tablice odvojenih znakom |, kako bi se izvješće moglo prevesti. |
Expression Manager zna koje su varijable lokalne
Kako bi ispravno izgradio JavaScript za stranicu, Expression Manager mora znati koje su varijable postavljene na stranici i koji je njihov JavaScript ID (npr. za document.getElementById(x)). Također mora znati koje su varijable postavljene na drugim stranicama (kako bi osigurao da su potrebna polja <input type='hidden' value='x'> prisutna i popunjena).
Kaskadni uvjeti
Ako je bilo koja od varijabli nerelevantna, cijela će jednadžba biti nerelevantna (false). Na primjer, u sljedećoj tablici N/A znači da jedna od varijabli nije bila relevantna
| Operator | Primjer | a | b | Rezultat |
|---|---|---|---|---|
| + (unary) | +a | N/A | false | |
| ! | !a | N/A | false | |
| == (or eq) | a == b | N/A | 5 | false |
| == (or eq) | a == b | N/A | 0 | false |
| == (or eq) | a == b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 5 | false |
| != (or ne) | a != b | N/A | N/A | false |
| != (or ne) | a != b | N/A | 0 | false |
| > (or gt) | a > b | N/A | 5 | false |
| >= (or ge) | a >= b | N/A | 5 | false |
| < (or lt) | a < b | N/A | 5 | false |
| <= (or le) | a <= b | N/A | 5 | false |
| and | a and b | N/A | 5 | false |
| and | a and b | N/A | N/A | false |
| or | a or b | N/A | N/A | false |
| or | a or b | N/A | 5 | false |
| + | a + b | N/A | 5 | false |
| * | a * b | N/A | 5 | false |
| / | a / b | 5 | N/A | false |
| () | (a) | N/A | false | |
| (exp) | (a && b) | N/A | 5 | false |
| (exp) op (exp) | (b + b) > (a && b) | N/A | 5 | false |
| function | sum(a,b,b) | N/A | 5 | false |
| function | max(a,b) | N/A | 5 | false |
| function | min(a,b) | N/A | 5 | false |
| function | implode(', ',a,b,a,b) | N/A | 5 | false |
| function | if(a,a,b) | N/A | 5 | false |
| function | is_empty(a) | N/A | false | |
| function | is_empty(a) | 0 (or blank) | true | |
| function | !is_empty(a) | N/A | false |
Nadjačavanje kaskadnih uvjeta
Recimo da želite prikazati tekući zbroj svih relevantnih odgovora. Mogli biste pokušati upotrijebiti jednadžbu {sum(q1,q2,q3,...,qN)}. Međutim, ona se interno prevodi u LEMif(LEManyNA('q1','q2','q3',...,'qN'),,sum(LEMval('q1'),LEMval('q2'),LEMval('q3'),...,LEMval('qN'))). Dakle, ako je bilo koja od vrijednosti q1-qN nerelevantna, jednadžba će uvijek vratiti false. U tom će slučaju sum() prikazivati 0 sve dok se ne odgovori na sva pitanja.
Kako biste to zaobišli, svakoj varijabli možete dodati sufiks ".NAOK" (što znači da je Not Applicable u redu). U tom slučaju događa se sljedeće. Recimo da imate varijablu q1.NAOK
- q1 se ne dodaje u klauzulu LEManyNA()
- LEMval('q1') i dalje će provjeravati je li odgovor relevantan te će vratiti '' ako nije (tako da se pojedinačni nerelevantni odgovori zanemaruju, ali ne poništavaju cijeli izraz).
Dakle, rješenje problema tekućeg zbroja je upotreba jednadžbe sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Upotreba sufiksa .NAOK također autorima omogućuje izradu upitnika s nekoliko mogućih putanja koje se kasnije ponovno spajaju na zajedničke putanje. Na primjer, recimo da ispitanici odgovore na upitnik na način koji je izvan uobičajenog raspona odgovora. Autor može upozoriti ispitanike da možda neće dobiti valjane rezultate i pitati ih žele li doista nastaviti s upitnikom. Ako odgovore Da, prikazat će se ostala pitanja. Uvjet za "ostala pitanja" provjeravao bi jesu li početni odgovori bili unutar uobičajenog raspona ILI je li ispitanik odgovorio Da na pitanje koje je relevantno samo ako su odgovori bili izvan uobičajenog raspona.
Kako Expression Manager podržava uvjetno mikro-prilagođavanje?
Evo primjera mikro-prilagođavanja (gdje Question Type=='expr' označava jednadžbu):
| Kôd pitanja | Relevantnost | Vrsta pitanja | Pitanje |
|---|---|---|---|
| name | 1 | text | What is your name? |
| age | 1 | text | How old are you? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Sorry, {name}, you are too {if( (age<16),'young',if( (age>80),'old','middle-aged') ) } for this test. |
| kids | !badage | yesno | Do you have children? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | How many children do you have? |
| kid1 | parents && numKids >= 1 | text | How old is your first child? |
| kid2 | parents && numKids >= 2 | text | How old is your second child? |
| kid3 | parents && numKids >= 3 | text | How old is your third child? |
| kid4 | parents && numKids >= 4 | text | How old is your fourth child? |
| kid5 | parents && numKids >= 5 | text | How old is your fifth child? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | yesno | {name}, you said you are {age} and that you have {numKids}. The sum of ages of your first {min(numKids,5)} kids is {sumage} |
Sva ova pitanja mogu biti na jednoj stranici (npr. u istoj grupi) i prikazat će se samo relevantna pitanja. Štoviše, dok unosite dob djece, izraz sum() u posljednjem pitanju dinamički će se ažurirati na stranici.
Expression Manager pruža ovu funkcionalnost tako da svaki izraz okruži imenovanim elementom <span>. Svaki put kada se vrijednost promijeni, ponovno izračunava izraz koji se treba pojaviti u tom elementu <span> i ponovno generira prikaz. Na istoj stranici možete imati desetke, pa čak i stotine takvih prilagođenih izraza, a stranica će ih sve ponovno prikazati u jednom osvježavanju zaslona.
Preslikavanje funkcionalnosti LimeSurvey 1.91+ u Expression Manager
| Stara značajka | Nova značajka | Komentari |
|---|---|---|
| Uvjeti | Relevantnost | Možete koristiti vrlo složene uvjetne jednadžbe i pristupiti širem rasponu varijabli |
| Procjene | Jednadžba | Svaki rezultat procjene može se preoblikovati u jednadžbu. Time se osigurava da se rezultat zapiše u bazu podataka, a također možete vidjeti dinamičke promjene vrijednosti rezultata na trenutnoj stranici |
| Zamjene | Expression Manager | Osnovni mehanizam uzima ulazni tekst i sve unutar vitičastih zagrada tretira kao izraz - tako obrađuje sve povijesne vrste zamjena. Kako ne bi poremetio ugrađeni JavaScript, Expression Manager obrađuje sadržaj između vitičastih zagrada samo ako (a) nema razmaka na početku ili na kraju unutar vitičastih zagrada - npr. {expr} je izraz, ali { expr}, {expr } i { expr } nisu izrazi. Nadalje, Expression Manager ne obrađuje sadržaj unutar vlastitih nizova (npr. {list('hi','there {braces}')} generira "hi there {braces}"). Također zanemaruje izbjegnute vitičaste zagrade (npr. \{this is not an expression\}) |
| Provjera | Expression Manager | Plan je preuzeti postojeće atribute pitanja min/max i prepustiti ih Expression Manageru na obradu. Na taj način i same min/max vrijednosti mogu biti izrazi |
Isticanje sintakse
Kako bi pomogao pri unosu i provjeri izraza, EM nudi isticanje sintakse sa sljedećim značajkama:
Vrste i značenja isticanja sintakse
| Boja | Uzorak | Značenje | Opis alata (tooltip) | Komentari |
|---|---|---|---|---|
| žuto-smeđa pozadina | Uzorak | cijela jednadžba | nema | Sve unutar vitičastih zagrada što je prepoznato kao jednadžba (npr. nema razmaka na početku ili na kraju) bit će označeno žuto-smeđom pozadinom kako bi se razlikovalo od okolnog teksta |
| podebljani crveni tekst | Uzorak | Pogreška | Objašnjenje pogreške | Može biti nepoznata varijabla ili pogreška u funkciji, .... Upitnik može biti potpuno neispravan, no to se ne prikazuje javnim korisnicima. |
| plavi tekst | Uzorak | naziv funkcije | značenje i dopuštena sintaksa | nazivi funkcija, ili stvari koje bi trebale biti funkcije jer iza njih slijedi otvorena zagrada, prikazuju se podebljanim plavim tekstom. Opis alata prikazuje značenje i dopuštenu sintaksu funkcije. |
| sivi tekst | Uzorak | niz znakova | nema | nizovi znakova u jednostrukim i dvostrukim navodnicima prikazuju se sivim tekstom |
| cijan tekst | Uzorak | varijabla postavljena na istoj stranici, | [naziv ili SGQA kod]: pitanje; vrijednost; popis odgovora s kodovima za svaku vrijednost | Svaka varijabla koja je postavljena na istoj stranici kao i trenutno pitanje prikazuje se cijan tekstom, što znači da se može ažurirati u JavaScriptu. Opis alata prikazuje njezin naziv, stvarno pitanje i trenutnu vrijednost (ili prazno ako nije postavljena). Ako vrsta pitanja očekuje odgovore iz nabrojenog skupa vrijednosti, prikazuje se povezanost kodova s prikazanim vrijednostima. |
| zeleni tekst | Uzorak | varijabla postavljena na prethodnoj stranici | [naziv ili SGQA kod]: pitanje; vrijednost; popis odgovora s kodovima za svaku vrijednost | Svaka varijabla koja je postavljena na prethodnoj stranici prikazuje se podebljanim zelenim tekstom. Opis alata prikazuje njezin naziv, stvarno pitanje i trenutnu vrijednost (ili prazno ako nije postavljena). Ako vrsta pitanja očekuje odgovore iz nabrojenog skupa vrijednosti, prikazuje se povezanost kodova s prikazanim vrijednostima. |
| podebljani ružičasti tekst | Uzorak | varijabla postavljena na kasnijoj stranici općenito: prazna na početku upitnika, ali se može popuniti putem indeksa ili povratkom na prethodnu stranicu | [naziv ili SGQA kod]: pitanje; vrijednost; popis odgovora s kodovima za svaku vrijednost | Svaka varijabla koja je postavljena na sljedećoj stranici prikazuje se podebljanim ružičastim tekstom. Opis alata prikazuje njezin naziv, stvarno pitanje i trenutnu vrijednost (ili prazno ako nije postavljena). Ako vrsta pitanja očekuje odgovore iz nabrojenog skupa vrijednosti, prikazuje se povezanost kodova s prikazanim vrijednostima. |
| podebljani smeđi tekst | Uzorak | Lime zamjenska vrijednost | vrijednost | Lime zamjenski nizovi (poput {TOKEN:xxx}, {PRIVACY_MESSAGE}) prikazuju se podebljanim smeđim tekstom. |
| crveni tekst | Uzorak | operator dodjeljivanja (=) | poruka upozorenja | Ako koristite operator dodjeljivanja (=), taj će se operator prikazati crvenim tekstom. Cilj je spriječiti slučajno ponovno dodjeljivanje vrijednosti kada ste zapravo htjeli provjeriti je li a == b umjesto postaviti vrijednost a = b. |
| uobičajeni crni tekst | Uzorak | interpunkcija | nema | Sva ostala interpunkcija unutar izraza prikazuje se uobičajenim crnim tekstom. |
| tekst u crvenom okviru | podebljana crvena linija okružuje pogrešku | sintaksna pogreška | opis pogreške | Sve otkrivene sintaksne pogreške prikazuju se tako da je pogreška okružena crvenim okvirom. Opis alata prikazuje pogrešku. Primjeri uključuju neusklađene zagrade, upotrebu nedefiniranih funkcija, prosljeđivanje pogrešnog broja argumenata funkcijama, loše strukturirane izraze (npr. nedostaju operatori između varijabli), pokušaj dodjeljivanja nove vrijednosti varijabli samo za čitanje, pokušaj dodjeljivanja vrijednosti onome što nisu varijable ili upotrebu nepodržane sintakse. Imajte na umu da sustav za otkrivanje sintaksnih pogrešaka može prijaviti samo jednu pogrešku u izrazu čak i ako ih ima više; međutim, ako se otkrije ijedna pogreška, bit će prikazana barem jedna. |
Dodatna literatura
Primjeri upitnika za Expression Manager
Slučajevi uporabe i upute
Primjeri korak po korak
Statističke funkcije Expression Managera
Referenca za programere










