x

Mga pangunahing kabanata

  1. LimeSurvey Cloud vs LimeSurvey CE
  2. Gabay sa mabilis na pagsisimula - LimeSurvey 3.0+
  3. Pag-install - LimeSurvey CE
  4. Paano magdisenyo ng magandang survey (gabay)
  5. Pagsisimula
  6. Pangangasiwa sa LimeSurvey
  7. Mga Survey - panimula
  8. Mga setting ng survey
  9. Menu ng survey
  10. Istraktura ng survey
  11. Mga tanong - panimula
  12. Mga pangkat ng tanong - panimula
  13. Mga survey - pamamahala
  14. Mga opsyon ng toolbar ng survey
  15. Multilingual na survey
  16. ExpressionScript Engine - Gabay sa mabilis na pagsisimula
  17. Mga hindi nakategoryang tampok at advanced na tampok
  18. Pangkalahatang FAQ
  19. Pag-troubleshoot
  20. Mga Workaround
  21. Lisensya
  22. Log ng pagbabago ng bersyon
  23. Plugins
 Actions

ExpressionScript - Paglalahad

From LimeSurvey Manual

Maaaring isinalin ng makina ang pahinang ito at maaaring may mga mali. Ipakita ang orihinal sa Ingles · Pagbutihin ang salin na ito
This page is a translated version of the page ExpressionScript - Presentation and the translation is 100% complete.


Panimula

Gumagamit ang LimeSurvey ng Expression Script na nagbibigay-daan sa LimeSurvey na suportahan ang mas masalimuot na branching, assessment, pag-validate, at tailoring. Pinapalitan nito ang paraan ng pamamahala ng LimeSurvey sa mga Replacement, Mga Kondisyon, at Assessments sa back-end. Pinabibilis din nito nang malaki ang pagpoproseso dahil inaalis nito ang karamihan sa pagbabasa ng database habang tumatakbo ang survey. Ang Expression Script ay binuo ni Dr. Thomas White (TMSWhite).


Mahahalagang depinisyon

  1. Expression: Anumang napapalibutan ng mga curly brace:
    • Basta walang puwang (white space) kaagad pagkatapos ng pambukas na brace o bago ang pansarang curly brace.
    • Ang nilalaman ng expression ay sinusuri ng EM, kaya maaari itong maglaman ng mga pormulang pangmatematika, mga function, at masalimuot na pagpoproseso ng string at petsa.
  2. Tailoring: Tinatawag minsan na "piping". Ito ang proseso ng pagbabago ng teksto batay sa kondisyon:
    • Mayroon kang access sa lahat ng 'replacement field', data ng kalahok, at data ng tugon.
    • Mas madali mo ring maa-access ang mga tanong, sagot, at mga katangian ng mga ito.
  3. Relevance Equation: Isang bagong attribute ng tanong na kumokontrol sa visibility ng tanong:
    • Kung may relevance equation, ipapakita lamang ang tanong kapag true ang resulta ng relevance.
    • Sa loob ng sistema, ang lahat ng command na array_filter at array_filter_exclude ay nagiging relevance sa antas ng subquestion.
  4. SGQA (kung paano pinangalanan ang mga variable noong nakaraan):
    • Nangangahulugang Survey-Group-Question-Answer
    • Ang mga pangalan ng variable na SGQA ay mukhang 123X5X382X971, at maaaring may mga suffix ng subquestion.
    • Ang mga pangalan ng variable na ito ay nakadepende sa mga code ng S/Q/G/A sa database, kaya madalas na kailangan itong baguhin
  5. Equation Uri ng tanong: Isang bagong uri ng tanong na nagsasave ng mga kalkulasyon o ulat sa database:
    • Para itong Boilerplate na tanong, ngunit ang nilalaman nito ay sine-save sa database kahit itakda mo ang "Palaging itago ang tanong na ito".
  6. Code ng tanong: Ito ang piniling pangalan ng variable para sa EM:
    • Maaari itong maging naglalarawang pangalan na nagsasaad ng layunin ng tanong, kaya mas madaling basahin ang masalimuot na lohika.
    • Ang mga wastong code ng tanong ay HINDI dapat magsimula sa numero, kaya kapag ginagamit ang code ng tanong para bilangin ang iyong mga tanong, gamitin lang ang "q1", o "q1a" o "g1q2".
    • Ito ang nagiging pangalan ng variable kapag ini-export mo ang data sa SPSS o R. Kaya kung gagawa ka ng estadistikang pagsusuri, kailangan mo lang gumawa ng mga natatanging code ng tanong.


Kailangan ko bang gamitin ang Expression Script?

Ang maikling sagot ay "hindi". Gayunpaman, malaki ang nakasalalay dito sa pagiging masalimuot ng survey na nais mong gawin.

Halimbawa, sinasaklaw ng Conditions editor ang ilang pangunahing expression na maaaring ilapat sa mga tanong ng iyong survey. Gayunpaman, limitado ang Conditions editor. Kaya ginagamit ang Expression Script - pinalalawak nito ang saklaw ng mga posibilidad ng pag-customize.


Maaari ko bang paghaluin ang mga Kondisyon at mga Relevance equation?

Oo. Maaari mong gamitin ang Conditions editor para sa ilang tanong at ang Relevance equations para sa iba.

Hindi maaaring magkasabay ang mga kondisyon at expression sa iisang tanong! Kapag nakatakda na ang isang kondisyon, pinapalitan nito ang anumang expression na nakasulat sa field ng relevance equation. Bukod dito, hindi na maaaring i-edit nang mano-mano ang field ng Relevance equation.

Gayunpaman, may paraan para gamitin ang parehong expression at kondisyon sa loob ng isang tanong. Tulad ng nabanggit sa itaas, pinapalitan ng kondisyon ang field ng relevance equation. Kapag nagawa na ito, tingnan kung ano ang bagong likhang equation at kopyahin ito sa isang text editor. Tanggalin ang bagong likhang kondisyon mula sa Conditions editor at pagkatapos ay i-edit ang tanong sa pamamagitan ng pagdaragdag ng mga expression na batay sa kondisyon mula sa iyong text editor file kasama ng iba pang expression na nais mong gamitin.


Paano ako pipili sa pagitan ng mga Kondisyon at Relevance?

Narito ang listahan ng mga bentahe at disbentahe ng bawat istilo:

Istilo Mga bentahe Mga disbentahe
Mga Kondisyon 1. Magandang GUI para sa paggawa ng mga simpleng kondisyon.
2. Mahusay na dokumentado ang GUI at naiintindihan ng support team
1. Sumusuporta lamang sa mga simpleng paghahambing at hindi mahusay sa mga kondisyong "AND" at "OR".
2. Hindi pare-pareho ang paggana ng mga cascading na kondisyon
3. Mabagal - mabigat sa database - maaari nitong pabagalin ang mahahabang survey.
4. May ilang naiulat na problema sa muling pag-load ng mga kondisyon.
5. Hindi maayos mag-scale ang GUI kapag may dose-dosena, daan-daan, o libu-libong tanong.
6. Maaaring mabagal ang pag-convert ng mga survey na nakabatay sa papel dahil kailangang gamitin ang mga pangalang SGQA.
7. Madalas na kailangan ng programmer para i-code ang lohikang kailangan sa masalimuot na branching.
Relevance 1. Sumusuporta sa napakasalimuot na lohika, kasama ang 80+ function at mga operator ng math/string.
2. Perpektong suporta para sa cascading logic.
3. Mabilis - walang karagdagang tawag sa database, sumusuporta sa mga survey na may 1000+ tanong.
4. Walang problema sa muling pag-load ng lohika dahil hindi nito kailangan ang mga code na SGQA.
5. Nag-i-scale ang syntax-highlighting hanggang sa mga survey na may 1000+ tanong.
6. Madali at mabilis gamitin para sa mga grupong nais i-computerize ang mga kasalukuyang survey na nakabatay sa papel.
7. Madali nitong sinusuportahan ang mga semi-structured na panayam at epidemiological na survey nang hindi nangangailangan ng programmer.
1. Walang GUI para sa mga simpleng kondisyon - gumagamit ito ng syntax-highlighting bilang kapalit.


Tandaan:
  • Inirerekomenda naming gamitin kung alin ang mas angkop sa iyong pangangailangan.
  • Para sa mas detalyadong paliwanag tungkol sa mga feature ng EM, i-click ang sumusunod na link.

Pagsisimula

Ang pinakamainam na paraan para magsimula sa EM ay ang:

  • I-install ang pinakabagong stable na bersyon mula sa https://www.limesurvey.org/en/download.
  • Mag-import at tuklasin ang ilang sample survey.
  • Tuklasin ang mga use case at how-to, at ang mga halimbawang hakbang-hakbang.
  • Tuklasin ang dokumentasyon ng EM (ang pahinang ito)
    • Unit Tests of Isolated Expressions (advanced)
      • nagpapakita ng mga halimbawa ng paggamit ng lahat ng function at operator ng EM, at ng mga resulta sa PHP at JavaScript;
      • tandaan na may ilang function na nagbibigay ng magkaibang resulta sa bersyon ng PHP at JavaScript, kaya hinahayaan ka ng pahinang ito na planuhin nang naaayon ang iyong lohika sa EM.

Terminolohiya

Karaniwang ginagamit ang mga salitang ito para ilarawan ang mga kakayahan ng EM:

  • Relevance-based Branching - kung relevant ang isang tanong, itatanong ito, kung hindi ay hindi (hal., gawin itong hindi nakikita at markahan bilang NULL sa database). Makikita mo ang mga field ng Relevance sa panel ng question editor pati na rin sa panel ng question group editor. Ang huli ay ginagamit para maglapat ng hanay ng mga kondisyon sa buong pangkat nang hindi kinokopya ang parehong kondisyon sa bawat tanong, at/o pagsamahin ang lohikang may kondisyon sa antas ng pangkat at tanong).
  • Tailoring - Kapag alam mo na kung aling mga tanong ang dapat itanong, tinutukoy ng tailoring (tinatawag minsan na piping) kung paano dapat itanong ang tanong. Sinusuportahan nito hindi lamang ang simpleng pagpapalit (tulad ng {TOKEN:FIRSTNAME}), kundi pati ang conjugation ng mga pandiwa at declination ng mga pangngalan batay sa kasarian o bilang ng iyong mga paksa. Pinapayagan ka rin nitong baguhin ang mensaheng ihahatid mo sa isang respondent ng survey batay sa kung sumagot sila (o kung paano sila sumagot) sa ibang mga tanong.
  • Equations - Nagdaragdag ang EM ng bagong uri ng tanong na tinatawag na Equation na nag-iimbak ng resulta ng isang Expression. Kinakalkula at isinusulat sa database ang mga resulta ng equation, kahit itago mo ang mga ito sa pahina. Kaya ginagamit ang mga ito para sa mga nakatagong kalkulasyon ng scoring, navigation batay sa masalimuot na equation, mga assessment, at mga ulat na bubuuin at iimbak sa loob ng database.


Relevance at Cascading Relevance

Ang bawat uri ng tanong ay mayroon na ngayong opsyong Relevance na kumokontrol kung ipapakita o hindi ang tanong. Pinoproseso ng EM ang bawat Relevance Equation ayon sa pagkakasunod-sunod ng paglitaw ng mga ito sa survey. Kung true ang expression (o wala - para suportahan ang mga lumang survey), ipapakita ang tanong. Kung hindi ito relevant, itatago ang tanong, at gagawing NULL ang value nito sa database. Kung walang relevant na tanong sa isang pangkat, lalaktawan ang buong pangkat.

Bukod dito, kung alinman sa mga variable sa loob ng isang expression ay hindi relevant, palaging magiging false ang resulta ng expression. Pinapagana nito ang Cascading Relevance para hindi mo na kailangang sumulat ng napakahabang Relevance equation para sa bawat tanong.

Sabihin nating mayroon kang limang tanong na Q1-Q5, at nais mo lang ipakita ang Q2 kung nasagot ang Q1, at ang Q3 kung nasagot ang Q2, atbp. Ang mga relevance equation ay maaaring ganito:

Code ng tanong Relevance Tanong
Q1 1 Ano ang iyong pangalan?
Q2 Q1 {Q1}, ilang taon ka na?
Q3 Q2 Kaya, {Q2} taong gulang ka na. May asawa ka na ba?
Q4 Q3 == "Y" {Q1}, gaano ka na katagal na kasal?
Q5 Q4 Ilan ang anak mo, {Q1}?


Relevance sa antas ng pangkat

Sinusuportahan din ng ExpressionScript ang relevance sa antas ng pangkat. Pinadadali nito ang pagpapatupad ng looping. Sabihin nating nais mong mangolekta ng impormasyon mula sa hanggang 10 entity (tulad ng mga produkto o mga tao sa isang sambahayan), kung saan unang tinutukoy kung ilang entity ang nangangailangan ng follow-up (tulad ng pagtatanong kung ilang tao ang nakatira sa sambahayan o pagpapapili sa mga tao kung aling mga produkto ang gusto nila mula sa mahabang listahan). Matapos malaman kung ilang entity ang nangangailangan ng follow-up, maaari mong gamitin ang relevance sa antas ng pangkat tulad ng {count >= 1}, {count >=2}, ... {count >= 10} para sa bawat isa sa 10 pangkat ng mga follow-up na tanong. Sa loob ng bawat pangkat, maaari kang magkaroon ng lohikang may kondisyon sa antas ng tanong (hal., mga follow-up na tanong na partikular sa kasarian o edad para sa bawat paksa). Pinagsasama gamit ang AND ang mga relevance equation sa antas ng tanong at pangkat para matukoy kung alin ang dapat ipakita.

Para masuri ang ganitong halimbawa, i-import ang sumusunod na survey: Halimbawang census survey.

Makikita sa screenshot sa ibaba na ipinapakita (o relevant) ang pangkat na Person 1 kung nakatira ang respondent kasama ang kahit isa pang kasambahay:



Tailoring/Piping

Anumang nasa loob ng curly braces ay itinuturing na ngayong Expression (maliban sa isang eksepsyon na inilarawan sa ibaba). May access ang mga expression sa lahat ng LimeReplacementFields at variable (sa pamamagitan ng ilang alias), sa lahat ng karaniwang operator ng equation (mathematical, logical, at comparison), at sa dose-dosenang function (na gumagana pa nga nang dynamic sa client-side).

Sa paggamit ng mga equation na ito, magagawa mo ang mga sumusunod:

  1. Magpakita nang may kondisyon ng mga naka-tailor na mensahe sa mga respondent batay sa mga naunang tugon;
  2. Gumawa ng mga pagtatasa at magpakita ng resulta ng pagtatasa (o mag-branch o magpakita ng mga mensahe nang may kondisyon) batay sa mga resultang iyon, nang hindi ginagamit ang mismong module ng pagtatasa;
  3. Mag-conjugate ng mga pandiwa at mag-decline ng mga pangngalan sa loob ng mga tanong, sagot, at ulat;
  4. Magpakita ng mga buod ng mga tugon bago ang pahinang "Show your answers" sa dulo ng survey.


Mga Equation

May bagong uri ng tanong na tinatawag na Equation. Isipin ito bilang isang uri ng tanong na Display ng text, maliban na iniimbak nito sa database ang value ng ipinapakita. Kaya kung ang text ng tanong na Equation ay naglalaman ng kalkulasyon ng pagtatasa, ang value na iyon ay maiimbak sa database sa isang variable na maaaring ipakita sa pampubliko o pribadong istatistika.


Syntax

Anumang nasa loob ng curly braces ay itinuturing na ngayong Expression (na may isang eksepsyon: walang dapat na nauuna o sumusunod na whitespace - kailangan ito upang matiyak na hindi susubukan ng ExpressionScript na iproseso ang naka-embed na JavaScript).

Tandaan na maaaring umabot sa maraming linya ang mga expression, basta walang whitespace pagkatapos ng pambungad na curly brace o bago ang pangsarang curly brace. Lalo itong nakatutulong para sa mga nested na "if()" statement tulad nito:

{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',
               ''
             )
           )
         )
       )
     )
   )
 )
)}

Sinusuportahan ng ExpressionScript ang sumusunod na syntax:

  • Lahat ng karaniwang mathematical operator (hal. +,-,*,/,!);
  • Lahat ng karaniwang comparison operator (hal. <,<=,==,!=,>,>=, pati ang mga katumbas nito: lt, le, eq, ne, gt, ge);
  • Mga panaklong (para makapag-grupo ka ng mga sub-expression);
  • Mga conditional operator (hal. &&,| | at ang mga katumbas nito: and, or);
  • Mga string na may single at double quote (na bawat isa ay maaaring mag-embed ng mga string na may kabilang uri ng quote);
  • Comma operator (kaya puwedeng magkaroon ng listahan ng mga expression at ibalik lang ang huling resulta);
  • Assignment operator (=);
  • Mga paunang-natukoy na variable (para tukuyin ang mga tanong, attribute ng tanong, at tugon) - hal., ang mga SGQA code;
  • Mga paunang-natukoy na function (mahigit 80 na ang mayroon, at madaling magdagdag ng iba pa).


Mga Operator

Sinusunod ng syntax ng EM ang normal na precedence ng mga operator:

Antas Operator Paglalarawan
1 () mga panaklong para sa pag-grupo o pagtawag ng mga function
2 ! - + mga unary operator: not, negation, unary-plus
3 * / multiplikasyon, dibisyon
4 + - dagdag, bawas
5 < <= > >= lt le gt ge mga relative na paghahambing
6 == != eq ne mga paghahambing ng pagkapantay
7 and logical AND
8 or logical OR
9 = assignment operator
10 , comma operator
Para sa pagkakapare-pareho ng JavaScript at PHP, ang plus operator (+) ay nagsasagawa ng pagdaragdag kung parehong numeric ang mga operand, ngunit nagsasagawa ng concatenation kung parehong hindi numeric na string ang dalawang bahagi. Gayunpaman, inirerekomenda naming gamitin ang function na "join()" para sa concatenation, dahil mas malinaw nito ang iyong intensyon. Iniiwasan din nito ang mga hindi inaasahang resulta kung string ang inaasahan mo ngunit numero ang nakuha (o kabaligtaran).

Babala tungkol sa hindi pagtutugma ng numero at string at alphabetical/numerical na paghahambing

Kapag gusto mong ihambing ang mga value gamit ang relative o equality comparison, mag-ingat sa mga hindi pagtutugma. Ang value na inilagay ng user (o ibinigay sa pamamagitan ng code ng sagot) ay magagamit bilang numero kung malinaw na numero ito. Kung babalutan mo ng " ang isa sa mga value, magaganap ang paghahambing ng text/string. Kung gusto mong ihambing bilang numero, huwag kailanman balutan ng " ang numero.

Halimbawa, ang Q0.NAOK > "50" ay true kung ang Q0.NAOK ay isang numeric na tanong na may value na 9. Ito ay dahil ipapalagay ng operator na > na alphabetical na paghahambing ito at hindi numerical.

Para matiyak na integer value ang inihahambing mo, maaari mong gamitin ang intval(Q0.NAOK) > 50. Tandaan lamang na kung ang Q0.NAOK ay hindi numero (walang laman o string), ang intval(Q0.NAOK) === 0. Para ihambing ang mga string value ("A" < "B") direktang gamitin ang strcmp : strcmp(Q0.NAOK,"B") o strcmp(Q0.NAOK,"A5").

Pag-iingat sa paggamit ng Assignment Operator (=)

Dapat mong iwasan ang paggamit ng mga assignment operator maliban kung talagang kinakailangan, dahil maaari silang magdulot ng mga hindi inaasahang side-effect. Halimbawa, kung babaguhin mo ang value ng isang nakaraang tugon, hindi muling kinakalkula ang cascading relevance at logic ng pag-validate sa pagitan ng tanong na iyon at ng kasalukuyang tanong, kaya maaari kang magkaroon ng data na hindi magkakatugma sa loob (hal., mga tanong na nananatiling may sagot ngunit dapat sana ay na-NULL, o mga tanong na nilaktawan ngunit dapat sanang sinagot). Sa pangkalahatan, kung gusto mong magtakda ng value sa isang variable, dapat kang gumawa ng tanong na uri ng Equation, at gumamit ng expression para itakda ang value nito. Gayunpaman, may ilang bihirang pagkakataon na talagang kailangan ng mga tao ang operator na ito, kaya ginawa naming available ito.

Bilang paalala tungkol sa operator na ito, ipinapakita ito sa pulang font sa loob ng mga syntax equation (para hindi mo ito malito sa "==").



Paggamit ng assignment operator

Ang mga pangunahing dahilan kung bakit maaaring gusto mong gamitin ang assignment operator ay:

  • Kailangan mong itakda ang default na value sa pamamagitan ng equation para sa isang tanong na hindi tumatanggap ng mga default na value (tulad ng list radio, kung saan hinahayaan ka ng user interface na pumili ng isa sa mga opsyon sa sagot, ngunit hindi ka pinapayagang maglagay ng equation). Gayunpaman, mag-ingat, dahil hindi mave-validate ng LimeSurvey na ang iyong equation ay bumubuo ng isa sa mga pinapayagang sagot para sa tanong na iyon;
  • Kailangan mong sapilitang baguhin ang tugon sa naunang tanong batay sa mas huling tugon;
  • atbp...


  Pansin : Sa PHP lamang ginagawa ang assignment. Ibig sabihin, hindi ina-update ang value sa parehong pahina, kundi kapag lumipat lang ang user sa susunod na pahina. Kaya mag-ingat kapag ginamit ang assignment operator sa parehong pahina kasama ng iba pang mga expression.



Magagamit mo ang buong sistema ng expression manager para sa layuning ito. Mas mainam na gumamit ng Equation para dito.

Ilang halimbawa:

  • Itakda ang sagot sa isang tanong na maikling teksto sa lowercase : {QCODE=strtolower(QCODE.NAOK)};
  • Magtakda ng default na sagot sa isang uri ng tanong na array sa simula ng survey : {Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)};
  • Magtakda ng default na sagot sa isang uri ng tanong na array texts sa simula ng survey : {Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)};
  • Magtakda ng sagot na may kondisyon : {QCODE=if(YesNo="Y","A1","")}.

Seguridad ng XSS

Kapag naka-enable ang XSS, may ilang bahagi ng sistema ng expression manager na hindi magagamit:

  • pagsisimula ng HTML tag sa isang expression ngunit pagtatapos nito sa ibang expression;
  • paggamit ng kumplikadong expression sa loob ng URL.


Pakitandaan na naka-enable ang XSS bilang default sa anumang installation ng LimeSurvey.


Mga halimbawa at workaround:

  • {if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")} ay hindi gumagana kapag may XSS security. Dito, maaari mong gamitin ang {if(1,"<strong>information</strong>","information")};
  • <a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, dito maaari kang gumamit ng equation na tanong dahil katanggap-tanggap ang paggamit ng kumpletong code ng tanong : <a href="/script.php?value={EQUATION.NAOK}">next</a>.


Pag-access sa mga variable

Nagbibigay ang ExpressionScript ng read-only na access sa anumang variable na maaaring kailanganin mo. Para sa backwards compatibility, nagbibigay ito ng access sa mga sumusunod:

  • TOKEN:xxx - ang value ng isang TOKEN (hal., TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (para lamang sa hindi anonymous na survey).
  • Lahat ng {XXX} value na ginagamit ng mga template.
  • Sa text ng tanong, maaari mong gamitin ang {QID} na pinapalitan ng ID ng tanong at ang {SGQ} na pinapalitan ng SGQA ng tanong.
  • {SAVEDID} para sa kasalukuyang ID ng tugon

Bukod dito, hinahayaan ka ng ExpressionScript na tukuyin ang mga variable gamit ang Code ng tanong (ang column na 'title' sa talahanayan ng mga tanong sa database). Ito rin ang label ng variable na ginagamit kapag ini-export mo ang iyong data sa SPSS, R, o SAS. Halimbawa, kung may mga tanong ka tungkol sa pangalan, edad, at kasarian, maaari mong tawagin ang mga variable na iyon na name, age, at gender sa halip na 12345X13X22, 12345X13X23, at 12345X13X24. Dahil dito, mas madaling mabasa ng lahat ang mga equation at ma-validate ang logic, at posible ring ilipat-lipat ang mga tanong nang hindi sinusubaybayan ang numero ng grupo o tanong.

Mahalaga: Mas ligtas na tukuyin ang mga variable na nasa mga naunang pahina o tanong.

Bukod pa rito, hinahayaan ka ng ExpressionScript na ma-access ang maraming property ng tanong:


Syntax Kahulugan Halimbawa Resulta ng halimbawa
Qcode alias para sa Qcode.code {implode(',',name,gender)} 'Tom','M'
Qcode.code ang napiling code ng tugon para sa tanong kung relevant ito (kung hindi, blangko), o ang text value kung hindi ito coded na tanong {implode(',',name.code,gender.code)} 'Tom','M'
Qcode.NAOK kapareho ng Qcode - tingnan ang talakayan tungkol sa NAOK {gender.NAOK} 'M'
Qcode.value ang value ng pagtatasa para sa tanong kung relevant ito (kung hindi, blangko), o ang text value kung hindi ito coded na tanong {gender.value} '1'
Qcode.valueNAOK kapareho ng Qcode.value - tingnan ang talakayan tungkol sa NAOK {gender.valueNAOK} '1'
Qcode.shown ang ipinapakitang value para sa tanong {implode(',',name.shown,gender.shown)} 'Tom','Male'
Qcode.question ang text ng tanong {gender.question} 'What is your gender?'
Qcode.mandatory kung mandatoryo ang tanong (Y/N) {gender.mandatory} 'N'
Qcode.qid ang internal na numero ng tanong (hindi ang sunud-sunod na numero) {gender.qid} 337
Qcode.type ang uri ng tanong {gender.type} 'G'
Qcode.jsName ang tamang javascript name para sa tanong, nasa pahinang ito man ito idineklara o wala {gender.jsName} 'java1827X3X337'
Qcode.gid ang internal na numero ng grupo (hindi ang sunud-sunod na numero) {gender.gid} 3
Qcode.qseq ang sunud-sunod na numero ng tanong, simula sa 0 {gender.qseq} 5
Qcode.gseq ang sunud-sunod na numero ng grupo, simula sa 0 {gender.gseq} 1
Qcode.relevanceStatus kung kasalukuyang relevant ang tanong (0 o 1) {gender.relevanceStatus} 1
Qcode.relevance ang relevance equation sa antas ng tanong {gender.relevance} '!is_empty(name)'
Qcode.grelevance ang relevance equation sa antas ng grupo {gender.grelevance} 'num_children >= 5'
Qcode.sgqa ang SGQA value para sa tanong na ito {gender.sgqa} '1827X3X337'


Isyu sa HTML editor

Kung gagamitin mo ang HTML editor, may ilang character na pinapalitan ng mga HTML entity.

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

Kung gagamit ka ng HTML editor, kailangan mong gamitin ang:

  • and para sa &
  • lt para sa <
  • le para sa <=
  • gt para sa >
  • ge para sa >=


Inirerekomendang alisin sa iyong expression ang HTML na lumilitaw sa loob nito. Kung gagamitin mo ang HTML editor ng LimeSurvey, i-click ang button na "Source" (matatagpuan sa itaas na kaliwang bahagi ng editor) at tanggalin ang lahat ng character na walang kinalaman sa iyong expression (hal.,

,
, at iba pa).

Pagpapangalan ng variable na Qcode

Narito ang mga detalye kung paano buuin ang isang Qcode (at ma-access ang ilang property) ayon sa uri ng tanong. Sa pangkalahatan, ganito binubuo ang mga Qcode:

 QuestionCode . '_' . SubQuestionID . '_' . ScaleId

Para sa comment at other, ang kaukulang code ng tanong ay QuestionCode_comment at QuestionCode_other, ayon sa pagkakasunod.

Uri Paglalarawan Code Mga subquestion Mga opsyon sa sagot Mga scale Code ng sagot Ipinapakitang sagot Relevance
5 Opsyong may 5 point na Radio-Button Q1 1-5 {Q1} {Q1.shown} {Q1==3}
B Array (opsyong may 10 point) na Radio-Button Q2 L1-L6 1-10 {Q2_L2} {Q2_L2.shown} {Q2_L2==7}
A Array (opsyong may 5 point) na Radio-Button Q3 1-5 1-5 {Q3_1} {Q3_1.shown} {Q3_1>=3}
1 Array (Flexible na Label) Dual Scale Q4 sq1-sq5 0:a1-a3 1:b1-b3 {Q4_sq1_0} {Q4_sq1_1.shown} {Q4_sq1_1=='b2'}
H Array (Flexible) - Format ng Column Q5 1-5 s,m,t {Q5_1} {Q5_1.shown} {Q5_1=='s'}
F Array (Flexible) - Format ng Row Q6 F1-F5 1-5 {Q6_F3} {Q6_F3.shown} {Q6_F3==4}
E Array (Dagdagan/Walang pinagbago/Bawasan) na Radio-Button Q7 1-7 I,S,D {Q7_4} {Q7_4.shown} {Q7_4=='D'}
: Array (Multi Flexi) 1 hanggang 10 Q8 ls1,todo,ls2 min,max,avg {Q8_ls1_max} {Q8_ls2_avg.shown} {Q8_ls2_min==7}
; Array (Multi Flexi) Text Q9 hp,st,sw 1st,2nd,3rd {Q9_hp_3rd} {Q9_hp_3rd.shown} {Q9_hp_3rd=='Peter'}
C Array (Oo/Hindi tiyak/Hindi) na Radio-Button Q10 1-5 Y,N,U {Q10_1} {Q10_1.shown} {Q10_3=='Y'}
X Boilerplate na tanong Q11 {Q11.shown}
D Petsa Q12 {Q12} {Q12.shown}
* Equation Q13 {Q13} {Q13.shown} {Q13>5}
~124~ Pag-upload ng file (itinatala ang bilang ng mga na-upload na file) Q14 {Q14} {Q14>0}
G Drop-down na listahan ng kasarian Q15 M,F {Q15} {Q15.shown} {Q15=='M'}
U Malaking free text Q16 {Q16} {Q16.shown} {strlen(Q16)>100}
I Tanong sa wika Q17 {Q17} {Q17.shown} {Q17=='en'}
! Listahan - Dropdown Q18 1-5 {Q18} {Q18.shown} {Q18==3}
L Drop-down na listahan/Radio-button na listahan Q19 A-Z {Q19} {Q19.shown} {Q19=='X'}
O Listahang may komento na Drop-down/Radio-button na listahan + Textarea Q20 A-F {Q20},{Q20comment} {Q20.shown} {Q20=='B'}
T Mahabang free text Q21 {Q21} {Q21.shown} {strstr(Q21,'hello')>0}
M Multiple choice na checkbox Q22 A-F, other {Q22_E}, {Q22_other} {Q22_E.shown}, {Q22_other.shown} {Q22_E=='Y'}
P Multiple choice na may komento na Checkbox + Text Q23 A-F {Q23_D}, {Q23_Dcomment} {Q23_D.shown} {!is_empty(Q23)}
K Tanong na maraming numerical Q24 self,mom,dad {Q24_self} {Q24_self.shown} {Q24_self>30}
Q Maraming maikling text Q25 A-F {Q25_B} {Q25_B.shown} {substr(Q25_B,1,1)=='Q'}
N Uri ng tanong na numerical Q26 {Q26} {Q26.shown} {Q26 > 30}
R Ranking na istilo Q27 1-4 {Q27_1} {Q27_1.shown} {Q27_1==3}
S Maikling free text Q28 {Q28} {Q28.shown} {Q28=='mine'}
Y Oo/Hindi na Radio-Button Q29 {Q29} {Q29.shown} {Q29=='Y'}


Paggamit ng NAOK

NAOK --> "Not Applicable" (NA) is alright (OK)


Ang paggamit ng NAOK ay nangangahulugang ang lahat o ilan sa mga variable ay irrelevant (hal. "Not Applicable" (NA) is alright (OK)).

Halimbawa: ang count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) ay laging magbibigay ng walang laman na string kung may isang subquestion ng Q1 na na-filter. Para mabilang ang bilang ng mga namarkahang subquestion sa ganitong tanong, maaaring gamitin ang count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Kung nakatago ang subquestion, magbabalik ang EM ng walang laman na string.

Kung walang NAOK, kapag may isang tanong o subquestion na nakatago, laging magbabalik ang EM ng walang laman na string (katumbas ng pagbabalik ng false).

Laging ginagamit ng .shown ang sistemang NAOK (walang laman na string kung nakatago), ngunit kung kailangan mo ang code ng sagot: mainam na laging idagdag ang .NAOK pagkatapos ng code ng tanong (maliban kung kailangan mo ito at alam mo ang ginagawa mo).

Mas marami pang impormasyon ang makikita sa subseksyon na Overriding Cascading Conditions.


Ang mga nakareserbang variable na "this", "self", at "that"

Madalas na gusto mong suriin ang lahat ng bahagi ng isang tanong, tulad ng pagbilang kung ilang subquestion ang nasagot o pagsusuma ng mga score. Sa ibang pagkakataon, gusto mong iproseso lamang ang ilang partikular na row o column ng isang tanong (tulad ng pagkuha ng kabuuan ng row o column at pag-iimbak nito sa database). Pinadadali ng mga nakareserbang variable na ito ang prosesong iyon.


Ang variable na "This"

Ang variable na "this" ay ginagamit lamang sa loob ng mga opsyong "Equation sa pag-validate ng buong tanong" at "Equation sa pag-validate ng subquestion" (ang huli ay hindi posible mula sa GUI). Pinapalawak nito ang mga pangalan ng variable ng bawat cell sa loob ng mga tanong na iyon. Kaya, kung gusto mong tiyakin na mas malaki sa tatlo ang bawat entry, itakda ang "Equation sa pag-validate ng subquestion" sa (this > 3).


Ang variable na "Self"

Ang mga variable na "self" at "that" ay mas makapangyarihan, at nagsisilbing mga macro na pinapalawak bago iproseso ang mga equation. Ang mga pagpipilian sa syntax para sa variable na "self" ay:

  • self
  • self.suffix
  • self.sub-selector
  • self.sub-selector.suffix
  1. Ang suffix ay alinman sa mga karaniwang suffix ng qcode (hal., NAOK, value, shown)
  1. Ang sub-selector ay maaaring isa sa mga sumusunod:
  • comments - mga subquestion lamang na komento (hal., multiple choice na may komento at listahang may komento);
  • nocomments - mga subquestion lamang na hindi komento;
  • sq_X - kung saan ang X ay identifier ng row o column. Pinipili lamang ang mga subquestion na tumutugma sa pattern na X. Tandaan na ang paghahanap ay ginagawa sa kumpletong code identifier, kaya ang sq_X ay tumutugma at isinasama ang mga subquestion na nX, X, Xn (hal., kung gagamitin mo ang sq_1, isasama ang mga subquestion na a1, 1a, 1, 11 o 001). Bigyang-pansin ang uri ng tanong na dual scale kung saan ang mga code ng subquestion ay QCODE_SQCODE_1 at QCODE_SQCODE_1, at ang uri ng tanong na ranking kung saan ang mga code ng subquestion ay QCODE_1, QCODE_2 ....

Mga halimbawa:

  • May nasagot na ba sa anumang bahagi ng isang tanong? -> {count(self.NAOK)>0}
  • Ano ang assessment score para sa tanong na ito? -> {sum(self.value)}

Magagamit mo rin ang mga ito upang makuha ang kabuuan ng row at column. Ipagpalagay na mayroon kang array ng mga numero na may mga row A-E at mga column 1-5.

  • Ano ang grand total? -> {sum(self.NAOK)}
  • Ano ang kabuuan ng row B? -> {sum(self.sq_B.NAOK)}
  • Ano ang kabuuan ng column 3? -> {sum(self.sq_3.NAOK)}


Ang variable na "That"

Ang variable na "that" ay katulad ng variable na "self", ngunit nagbibigay-daan itong tumukoy sa ibang mga tanong. Ang syntax nito ay:

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

Ang qname ay ang pangalan ng tanong na walang anumang extension ng subquestion. Kaya, gumawa tayo ng tanong na 'q1', kung saan ang 'q' ay kumakatawan din sa qname nito.

Mga halimbawa:

  • May nasagot na ba sa anumang bahagi ng tanong na q1? -> {count(that.q1.NAOK)>0}
  • Ano ang assessment score para sa q2? -> {sum(that.q2.NAOK)}
  • Ano ang grand total ng q3? -> {sum(that.q3.NAOK)}
  • Ano ang kabuuan ng row C sa q4? -> {sum(that.q4.sq_C.NAOK)}
  • Ano ang kabuuan ng column 2 sa q4? -> {sum(that.q4.sq_2.NAOK)}

Magagamit ang mga variable na "self" at "that" sa anumang relevance, pag-validate, o tailoring.

Ang isang dapat tandaan ay kapag ginamit mo ang feature na Show logic file, ipapakita nito ang pinalawak na halaga ng "self" at "that". Dahil dito, makikita mo ang aktwal na equation na mabubuo upang ikaw (at ang EM) ay makapag-validate kung umiiral ang mga variable o hindi. Maaaring nakakalito ito dahil maaari kang makakita ng napakahahabang equation. Gayunpaman, kapag in-edit mo ang tanong, makikita mo ang orihinal na equation na gumagamit ng "self" at/o "that".

Hindi mo dapat gamitin ang mga variable na ito kung
  • gusto mong pangalanan nang tahasan ang bawat variable na ginagamit sa isang equation, o
  • gumagamit ka ng mga variable na walang subquestion (hal., mga tanong na may iisang tugon). Sa mga kasong iyon, sobra na ang paglalagay ng "that" sa unahan ng variable, at may panganib kang makakuha ng hindi inaasahang resulta.

Access sa mga function

Nagbibigay ang ExpressionScript ng access sa mga mathematical, string, at user-defined na function, tulad ng ipinapakita sa ibaba. Mayroon itong katumbas sa PHP at JavaScript para sa mga function na ito upang pareho ang paggana ng mga ito sa server-side (PHP) at client-side (JavaScript). Madaling magdagdag ng mga bagong function.


Mga naipatupad na function

Kasalukuyang available ang mga sumusunod na function:

Function Kahulugan Syntax
abs Absolute value number abs(number)
acos Arkong kosayn number acos(number)
addslashes I-quote ang string gamit ang mga slash string addslashes(string)
asin Arkong sain number asin(number)
atan Arkong tanghente number atan(number)
atan2 Arkong tanghente ng dalawang paiba-iba number atan2(number, number)
ceil I-round up ang mga fraction number ceil(number)
checkdate Nagbabalik ng true(1) kung valid na petsa ito sa kalendaryong gregorian bool checkdate(month,day,year)
convert_value I-convert ang numerong value gamit ang inputTable at outputTable ng mga numerong value number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList)
cos Kosayn number cos(number)
count Bilangin ang mga sinagot (hindi blangko) na tanong sa listahan number count(arg1, arg12, ..., argN)
countif Bilangin ang mga sinagot na tanong sa listahan na katumbas ng unang argument number countif(matches, arg1, arg2, ... argN)
countifop Bilangin ang mga sinagot na tanong sa listahan na pumasa sa pamantayan (arg op value) number countifop(op, value, arg1, arg2, ... argN)
date I-format ang lokal na petsa/oras string date(format [, timestamp=time()])
exp Kinakalkula ang matematikong simbolo ng e number exp(number)
fixnum Ipakita ang mga numero na may kuwit bilang radix separator, kung kinakailangan string fixnum(number)
floor I-round down ang mga fraction number floor(number)
gmdate I-format ang petsa/oras sa GMT string gmdate(format [, timestamp=time()])
html_entity_decode I-convert ang lahat ng HTML entity sa mga katumbas nitong character (palaging gumagamit ng ENT_QUOTES at UTF-8) string html_entity_decode(string)
htmlentities I-convert ang lahat ng naaangkop na character sa mga HTML entity (palaging gumagamit ng ENT_QUOTES at UTF-8) string htmlentities(string)
expr_mgr_htmlspecialchars I-convert ang mga espesyal na character sa mga HTML entity (palaging gumagamit ng ENT_QUOTES at UTF-8) string htmlspecialchars(string)
expr_mgr_htmlspecialchars_decode I-convert pabalik sa mga character ang mga espesyal na HTML entity (palaging gumagamit ng ENT_QUOTES at UTF-8) string htmlspecialchars_decode(string)
idate I-format ang lokal na oras/petsa bilang integer string idate(string [, timestamp=time()])
if Excel-style na if(test,result_if_true,result_if_false) if(test,result_if_true,result_if_false)
implode Pagsama-samahin ang mga array element gamit ang string string implode(glue,arg1,arg2,...,argN)
intval Kunin ang integer value ng variable int intval(number [, base=10])
is_empty Alamin kung itinuturing na walang laman ang variable bool is_empty(var)
is_float Inaalam kung float ang uri ng variable bool is_float(var)
is_int Alamin kung integer ang uri ng variable bool is_int(var)
is_nan Inaalam kung hindi numero ang value bool is_nan(var)
is_null Inaalam kung NULL ang variable bool is_null(var)
is_numeric Inaalam kung numero o numerong string ang variable bool is_numeric(var)
is_string Alamin kung string ang uri ng variable bool is_string(var)
join (New in 2.0 build 130129) Pagsamahin ang mga element bilang bagong string join(arg1, arg2, ... argN)
list Mag-return ng listahan ng mga hindi blangkong value na pinaghihiwalay ng kuwit string list(arg1, arg2, ... argN)
listifop (New in 3.16.1 ) Mag-return ng listahang pinaghihiwalay ng 'glue' ng tinukoy na property ng tanong (retProp) mula sa mga tanong sa listahan na pumasa sa pamantayan (cmpProp op value) string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN)
ltrim Alisin ang whitespace (o iba pang character) sa simula ng string string ltrim(string [, charlist])
max Hanapin ang pinakamataas na halaga number max(arg1, arg2, ... argN)
min Hanapin ang pinakamababang halaga number min(arg1, arg2, ... argN)
mktime Kunin ang UNIX timestamp para sa isang petsa (opsyonal ang bawat isa sa 6 na argument) number mktime([hour [, minute [, second [, month [, day [, year ]]]]]])
modulo-function Hindi pa sinusuportahan ang modulo function. Magagamit mo na lang ang floor() function floor(x/y)==(x/y)
nl2br Naglalagay ng mga HTML line break bago ang lahat ng newline sa string string nl2br(string)
number_format I-format ang numero nang nakagrupo kada libo string number_format(number)
pi Kunin ang halaga ng pi number pi()
pow Exponential na expression number pow(base, exp)
quoted_printable_decode I-convert ang quoted-printable na string sa 8-bit na string string quoted_printable_decode(string)
quoted_printable_encode I-convert ang 8-bit na string sa quoted-printable na string string quoted_printable_encode(string)
quotemeta I-quote ang mga meta character string quotemeta(string)
rand Gumawa ng random na integer, tingnan ang halimbawang ito int rand() OR int rand(min, max)
regexMatch Ihambing ang string sa isang regular expression bool regexMatch(pattern,input)
round Nira-round off ang numero sa opsyonal na precision number round(val [, precision])
rtrim Alisin ang whitespace (o iba pang character) sa dulo ng string string rtrim(string [, charlist])
sin Sain number sin(arg)
sprintf Mag-return ng naka-format na string string sprintf(format, arg1, arg2, ... argN)
sqrt Square root number sqrt(arg)
stddev Kalkulahin ang Sample Standard Deviation para sa listahan ng mga numero number stddev(arg1, arg2, ... argN)
str_pad I-pad ang string hanggang sa isang tiyak na haba gamit ang ibang string string str_pad(input, pad_length [, pad_string])
str_repeat Ulitin ang string string str_repeat(input, multiplier)
str_replace Palitan ang lahat ng occurrence ng hinahanap na string ng kapalit na string string str_replace(search, replace, subject)
strcasecmp Binary-safe na paghahambing ng case-insensitive string int strcasecmp(str1, str2)
strcmp Binary-safe na paghahambing ng string int strcmp(str1, str2)
strip_tags Alisin ang mga HTML at PHP tag sa string string strip_tags(str, allowable_tags)
stripos Hanapin ang posisyon ng unang occurrence ng case-insensitive na unicode string (nagsisimula sa 0, nagbabalik ng false kung hindi nahanap) int stripos(haystack, needle [, offset=0])
stripslashes Nag-a-unquote ng naka-quote na string string stripslashes(string)
stristr Case-insensitive na strstr string stristr(haystack, needle [, before_needle=false])
strlen Kunin ang haba ng string int strlen(string)
strpos Hanapin ang posisyon ng unang occurrence ng unicode string (nagsisimula sa 0, nagbabalik ng false kung hindi nahanap) int strpos(haystack, needle [ offset=0])
strrev Baligtarin ang string string strrev(string)
strstr Hanapin ang unang occurrence ng string string strstr(haystack, needle[, before_needle=false])
strtolower Gawing lowercase ang string string strtolower(string)
strtotime I-parse ang halos anumang paglalarawan ng datetime sa tekstong Ingles bilang Unix timestamp int strtotime(string)
strtoupper Gawing uppercase ang string string strtoupper(string)
substr Mag-return ng bahagi ng unicode string string substr(string, start [, length])
sum Kalkulahin ang sum ng mga value sa array number sum(arg1, arg2, ... argN)
sumifop I-sum ang mga value ng mga sinagot na tanong sa listahan na pumasa sa pamantayan (arg op value) number sumifop(op, value, arg1, arg2, ... argN)
tan Tanghente number tan(arg)
time I-return ang kasalukuyang UNIX timestamp number time()
trim Alisin ang whitespace (o iba pang character) sa simula at dulo ng string string trim(string [, charlist])
ucwords Gawing uppercase ang unang character ng bawat salita sa string string ucwords(string)
unique Nagiging true kung natatangi ang lahat ng hindi blangkong tugon boolean unique(arg1, ..., argN)
Mag-click dito kung nais mong malaman pa ang tungkol sa mga nakaplano (o pinag-iisipang) function.

<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">

Gumawa ng mga bagong expression function gamit ang plugin (New in 4.0.0 )

Kung kailangan mo ng bagong function na wala sa core, maaari kang gumawa nito gamit ang plugin. Ang ganitong bagong function ay ginagawa gamit ang event na expressionManagerStart.

Alam ng ExpressionScript kung aling mga variable ang lokal

Upang maayos na mabuo ang JavaScript para sa isang pahina, kailangang malaman ng EM kung aling mga variable ang naka-set sa pahina, at kung ano ang JavaScript ID ng mga ito (hal., para sa document.getElementById(x)). Kailangan din nitong malaman kung aling mga variable ang naka-set sa ibang mga pahina (upang matiyak na nariyan at may laman ang mga kinakailangang <input type='hidden' value='x'> field).


Cascading Conditions

Kung alinman sa mga variable ay irrelevant, ang buong equation ay magiging irrelevant (false). Halimbawa, sa sumusunod na talahanayan, ang N/A ay nangangahulugang hindi relevant ang isa sa mga variable:


Operator Halimbawa a b Resulta
+ (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 (o blangko) true
function !is_empty(a) N/A false


Pag-override sa Cascading Conditions

Sabihin nating nais mong magpakita ng running total ng lahat ng relevant na sagot. Maaari mong subukang gamitin ang equation na {sum(q1,q2,q3,...,qN)}. Gayunpaman, sa loob ay isinasalin ito sa LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))). Kaya, kung alinman sa mga value na q1-qN ay irrelevant, laging magbabalik ng false ang equation. Sa kasong ito, magpapakita ang sum() ng "0" hanggang masagot ang lahat ng tanong.

Para maiwasan ito, maaaring dagdagan ang bawat variable ng suffix na ".NAOK" (nangangahulugang Not Applicable is OK). Sa ganitong mga kaso, ito ang mangyayari. Sabihin nating mayroon kang variable na q1.NAOK:

  1. Hindi idinadagdag ang q1 sa LEManyNA() clause
  2. Patuloy na susuriin ng LEMval('q1') kung relevant ang tugon at magbabalik ito ng "" kung hindi (kaya hindi papansinin ang mga indibidwal na irrelevant na tugon, ngunit hindi nito babawiin ang buong expression).

Kaya, ang solusyon sa problema ng running total ay ang paggamit ng equation na sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).

Pinapahintulutan din ng paggamit ng suffix na .NAOK ang mga author na magdisenyo ng mga survey na may ilang posibleng landas ngunit nagsasama-sama sa mga karaniwang landas sa dakong huli. Halimbawa, sabihin nating sumagot ang mga paksa sa survey sa paraang lampas sa normal na saklaw ng mga tugon. Maaaring balaan ng author ang mga paksa na maaaring hindi valid ang makuhang resulta, at tanungin kung nais pa ba nilang magpatuloy sa survey. Kung sasagot sila ng "Oo", ipapakita ang natitirang mga tanong. Susuriin ng kondisyon para sa "natitirang mga tanong" kung ang mga unang tugon ay nasa normal na saklaw O kung sumagot ng "Oo" ang paksa sa tanong na relevant lamang kung sumagot sila nang lampas sa normal na saklaw.

Paano sinusuportahan ng ExpressionScript ang conditional micro-tailoring?

Narito ang halimbawa ng micro-tailoring (kung saan ang Question Type=='expr' ay nangangahulugang Equation):


Code ng tanong Relevance Uri ng tanong Tanong
name 1 text Ano ang pangalan mo?
age 1 text Ilang taon ka na?
badage !is_empty(age) expr {(age<16) or (age>80)}
agestop badage message Paumanhin, {name}, masyado kang {if( (age<16),'bata',if( (age>80),'matanda','nasa katanghaliang gulang') ) } para sa pagsusulit na ito.
kids !badage yesno May mga anak ka ba?
parents 1 expr {!badage && kids=='Y'}
numKids parents text Ilan ang mga anak mo?
kid1 parents && numKids >= 1 text Ilang taon na ang panganay mong anak?
kid2 parents && numKids >= 2 text Ilang taon na ang pangalawa mong anak?
kid3 parents && numKids >= 3 text Ilang taon na ang pangatlo mong anak?
kid4 parents && numKids >= 4 text Ilang taon na ang pang-apat mong anak?
kid5 parents && numKids >= 5 text Ilang taon na ang panlima mong anak?
sumage 1 expr {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)}
report parents text {name}, sinabi mong {age} ang edad mo at mayroon kang {numKids} anak. Ang kabuuan ng edad ng iyong unang {min(numKids,5)} anak ay {sumage}


Para i-download ang halimbawang survey sa itaas, i-click ang sumusunod na link: Halimbawang survey ng bilang ng mga anak.

Maaaring nasa iisang pahina ang lahat ng tanong na ito (hal., sa parehong group), at ang mga relevant na tanong lamang ang ipapakita. Bukod pa rito, habang inilalagay mo ang edad ng mga bata, dynamic na maa-update ang sum() expression sa huling tanong.

Ibinibigay ng ExpressionScript ang functionality na ito sa pamamagitan ng pagbabalot sa bawat expression ng may pangalang <span> element. Tuwing nagbabago ang isang value, muling kinukwenta nito ang expression na dapat lumabas sa <span> element na iyon at muling binubuo ang display. Maaari kang magkaroon ng dose-dosena o daan-daang ganitong tailored expression sa iisang pahina.


Syntax highlighting

Upang makatulong sa paglalagay at pag-validate ng mga expression, nagbibigay ang EM ng syntax highlighting na may sumusunod na mga tampok:

Mga Uri at Kahulugan ng Syntax Highlighting

Kulay Sample Kahulugan Tooltip Mga komento
tan background Sample ang buong equation wala Anumang nasa loob ng curly braces na nakikilala bilang equation (hal., walang nauuna o sumusunod na whitespace) ay lalagyan ng tan na background upang mapaghiwalay ito sa nakapaligid na teksto
bold red text Sample Isang error Ilang paliwanag tungkol sa error Maaaring hindi kilalang variable o error sa function. Sira ang survey at hindi ipapakita sa mga respondent ang mga tanong na umaasa sa nasabing expression.
blue text Sample pangalan ng function kahulugan at pinapayagang syntax Tumutukoy ito sa mga pangalan ng function o mga bagay na dapat ay function dahil sinusundan sila ng bukas na panaklong. Ipinapakita ang mga ito sa bold blue text. Ipinapakita ng mga tooltip ang kahulugan at pinapayagang syntax ng function.
grey text Sample string wala Ang mga string na nasa single o double quote ay ipinapakita sa grey text.
cyan text Sample variable na naka-set sa parehong pahina, [name]: tanong; value; answerList na nagpapakita ng mga code para sa bawat value Anumang variable na naka-set sa parehong pahina ng tanong na kasalukuyan mong ine-edit ay ipinapakita sa cyan text (maaari itong ma-update sa javascript). Ipinapakita ng tooltip ang pangalan nito, ang aktwal na tanong, at ang kasalukuyang value nito (o blangko kung hindi naka-set). Kung ang uri ng tanong ay umaasa ng mga tugon mula sa isang nakalistang set ng value, ipapakita ang pagkaka-map ng mga code sa mga display value.
green text Sample variable na naka-set sa naunang pahina [name]: tanong; value; answerList na nagpapakita ng mga code para sa bawat value Anumang variable na naka-set sa naunang pahina ay ipinapakita sa bold green text. Ipinapakita ng tooltip ang pangalan nito, ang aktwal na tanong, at ang kasalukuyang value nito (o blangko kung hindi naka-set). Kung ang uri ng tanong ay umaasa ng mga tugon mula sa isang nakalistang set ng value, ipapakita ang pagkaka-map ng mga code sa mga display value.
bold pink text Sample variable na naka-set sa susunod na pahina sa pangkalahatan: walang laman sa simula ng survey, ngunit maaaring mapunan gamit ang index o pagbalik sa nakaraan [name o SGQA code]: tanong; value; answerList na nagpapakita ng mga code para sa bawat value Anumang variable na naka-set sa susunod na pahina ay ipinapakita sa bold pink text. Ipinapakita ng tooltip ang pangalan nito, ang aktwal na tanong, at ang kasalukuyang value nito (o blangko kung hindi naka-set). Kung ang uri ng tanong ay umaasa ng mga tugon mula sa isang nakalistang set ng value, ipapakita ang pagkaka-map ng mga code sa mga display value.
bold tan text Sample isang lime replacement value ang value Ang mga Lime Replacement String (tulad ng {TOKEN:xxx}, {PRIVACY_MESSAGE}) ay ipinapakita sa bold tan text.
red text Sample assignment operator (=) babala Kung gagamit ka ng assignment operator (=), ipapakita ang operator na iyon sa red text. Layunin nitong maiwasan ang hindi sinasadyang muling pag-assign ng mga value kung ang talagang nais mo ay suriin kung a == b sa halip na itakda ang value ng a = b.
normal black text Sample bantas wala Ang lahat ng iba pang bantas sa loob ng expression ay ipinapakita sa normal na black text.
red-boxed text isang bold na pulang linya ang nakapalibot sa error syntax error paglalarawan ng error Ang anumang natukoy na syntax error ay ipinapakita sa loob ng pulang kahon. Ipinapakita ng tooltip ang error. Kabilang sa mga halimbawa ang hindi magkapares na panaklong, paggamit ng hindi tinukoy na function, maling bilang ng argument na ipinasa sa mga function, hindi maayos na istruktura ng expression (hal., kulang na operator sa pagitan ng mga variable), pagsubok na magtakda ng bagong value sa read-only na variable, pagsubok na magtakda ng value sa mga hindi variable, o paggamit ng Hindi sinusuportahang syntax. Tandaan na maaaring isang error lamang ang iulat ng sistema ng pagtukoy ng syntax error sa isang expression kahit marami ang error; gayunpaman, kung may natukoy na error, hindi bababa sa isang error ang ipapakita.


Ang tinutukoy naming tooltip ay ang popup na mensaheng lumalabas kapag itinapat mo ang cursor sa ilang function at variable.


Karagdagang babasahin

Mga sample na survey ng ExpressionScript

Mga use case at how-to

Mga halimbawang hakbang-hakbang

Reference para sa mga Developer

RoadMap, status, at ToDo List