ExpressionScript - Танилцуулга
From LimeSurvey Manual
Танилцуулга
LimeSurvey нь Илэрхийллийн скрипт (Expression Script)-ийг ашигладаг бөгөөд энэ нь LimeSurvey-д илүү нарийн төвөгтэй салаалалт, үнэлгээ, баталгаажуулалт болон тохируулгыг дэмжих боломжийг олгодог. Энэ нь LimeSurvey-ийн Орлуулалт, нөхцөл болон үнэлгээг арын хэсэгт удирдах аргыг орлоно. Мөн ажиллах үед мэдээллийн сангаас унших ихэнх үйлдлийг арилгадаг тул боловсруулалтыг мэдэгдэхүйц хурдасгадаг. Илэрхийллийн скриптийг доктор Томас Уайт (TMSWhite) боловсруулсан.
Үндсэн тодорхойлолтууд
- Илэрхийлэл: Хаалтан дотор ({}) орсон аливаа зүйл:
- Нээх хаалтын шууд дараа эсвэл хаах хаалтын өмнө хоосон зай байхгүй байх шаардлагатай.
- Илэрхийллийн агуулгыг EM үнэлдэг тул математик томьёо, функц, нарийн төвөгтэй тэмдэгт мөр болон огнооны боловсруулалтыг агуулж болно.
- Тохируулга: Заримдаа "piping" гэж нэрлэдэг. Энэ нь текстийг нөхцөлтэйгээр өөрчлөх процесс юм:
- Та бүх 'орлуулах талбар', оролцогчийн өгөгдөл болон хариултын өгөгдөлд хандах эрхтэй.
- Мөн асуулт, хариулт болон тэдгээрийн шинж чанарт илүү хялбар хандаж болно.
- Холбогдох тэгшитгэл: Асуултын харагдах байдлыг удирддаг асуултын шинэ шинж чанар:
- Холбогдох тэгшитгэл байгаа бол асуулт нь тухайн тэгшитгэл үнэн (true) гэж үнэлэгдсэн тохиолдолд л харагдана.
- Дотооддоо бүх array_filter болон array_filter_exclude тушаалууд дэд асуултын түвшний холбогдох тэгшитгэл болдог.
- SGQA (өмнө нь хувьсагчдыг хэрхэн нэрлэдэг байсан):
- Survey-Group-Question-Answer гэсэн үгийн товчлол
- SGQA хувьсагчийн нэрс 123X5X382X971 шиг харагддаг бөгөөд дэд асуултын нэмэлт залгавартай байж болно.
- Эдгээр хувьсагчийн нэрс нь мэдээллийн сангийн S/Q/G/A кодуудад хамаарах тул ихэвчлэн өөрчлөх шаардлагатай болдог
- Тэгшитгэл асуултын төрөл: Тооцоолол эсвэл тайланг мэдээллийн санд хадгалдаг шинэ асуултын төрөл:
- Энэ нь Boilerplate асуулттай төстэй боловч "Энэ асуултийг нуу" гэж тохируулсан ч агуулгыг нь мэдээллийн санд хадгалдаг.
- Асуултын код: Энэ нь EM-д зориулсан илүүд үздэг хувьсагчийн нэр юм:
- Энэ нь асуултын зорилгыг илэрхийлсэн тайлбарлах нэр байж болох бөгөөд нарийн төвөгтэй логикийг уншихад хялбар болгодог.
- Зөв асуултын код тоогоор ЭХЭЛЖ БОЛОХГҮЙ тул асуултаа дугаарлахдаа "q1", "q1a" эсвэл "g1q2" гэж ашиглахад хангалттай.
- Хэрэв та мэдээллийг SPSS эсвэл R руу экспортлох бол энэ нь хувьсагчийн нэр болно. Тиймээс статистик шинжилгээ хийж байгаа бол зөвхөн давтагдашгүй асуултын код үүсгэх хэрэгтэй.
Би Илэрхийллийн скриптийг заавал ашиглах ёстой юу?
Богино хариулт нь "үгүй". Гэхдээ энэ нь таны үүсгэх гэж буй судалгааны нарийн төвөгтэй байдлаас ихээхэн хамаарна.
Жишээлбэл, Нөхцөл засварлагч нь судалгааныхаа асуултуудад хэрэглэж болох зарим энгийн илэрхийллийг хамардаг. Гэхдээ Нөхцөл засварлагч хязгаарлагдмал. Тийм учраас Илэрхийллийн скриптийг ашигладаг бөгөөд энэ нь өөрчлөн тохируулах боломжуудын хүрээг тэлдэг.
Нөхцөл болон Холбогдох тэгшитгэлийг хослуулж болох уу?
Тийм. Зарим асуултад Нөхцөл засварлагчийг, бусад асуултад Холбогдох тэгшитгэлийг ашиглаж болно.
Нэг асуултад нөхцөл болон илэрхийллийг хоёуланг нь тохируулж болохгүй! Нөхцөл тохируулсны дараа энэ нь холбогдох тэгшитгэлийн талбарт бичигдсэн аливаа илэрхийллийг орлоно. Түүнчлэн Холбогдох тэгшитгэл талбарыг цаашид гараар засах боломжгүй болно.
Гэсэн ч нэг асуултад илэрхийлэл болон нөхцөл хоёуланг ашиглах арга байдаг. Дээр дурдсанчлан нөхцөл нь холбогдох тэгшитгэлийн талбарыг орлодог. Үүний дараа шинээр үүссэн тэгшитгэлийг шалгаад текст засварлагчид хуулж ав. Шинээр үүсгэсэн нөхцөлийг Нөхцөл засварлагчаас устгаад, дараа нь асуултыг засаж, текст засварлагчийн файлд байгаа нөхцөлд суурилсан илэрхийллүүдийг бусад ашиглахыг хүсч буй илэрхийллүүдийн хамт нэмнэ үү.
Нөхцөл болон Холбогдох тэгшитгэлийн аль нэгийг хэрхэн сонгох вэ?
Доор арга тус бүрийн давуу болон сул талуудын жагсаалтыг үзүүллээ:
| Хэлбэр | Давуу тал | Сул тал |
|---|---|---|
| Нөхцөл | 1. Энгийн нөхцөл үүсгэхэд зориулсан тохиромжтой GUI. 2. GUI сайн баримтжуулагдсан бөгөөд дэмжлэгийн баг сайн ойлгодог |
1. Зөвхөн энгийн харьцуулалтыг дэмждэг бөгөөд "AND" болон "OR" нөхцөлийг сайн дэмждэггүй. 2. Давхарласан нөхцөл тогтворгүй ажилладаг 3. Удаан - мэдээллийн санд ачаалал өгдөг тул урт судалгааг удаашруулж болно. 4. Нөхцөлийг дахин ачаалахад зарим асуудал мэдээлэгдсэн. 5. Хэдэн арав, хэдэн зуу, хэдэн мянган асуулт байх үед GUI сайн өргөжихгүй. 6. SGQA нэр ашиглах ёстой тул цаасан судалгааг хөрвүүлэх нь удаан байж болно. 7. Нарийн төвөгтэй салаалалтад шаардлагатай логикийг тусгайлан кодлоход ихэвчлэн программист хэрэгтэй. |
| Ач холбогдол | 1. 80 гаруй функц болон математик/тэмдэгт мөрийн оператор зэрэг маш нарийн төвөгтэй логикийг дэмждэг. 2. Давхарласан логикийг төгс дэмждэг. 3. Хурдан - мэдээллийн сан руу нэмэлт дуудлага хийхгүй бөгөөд 1000 гаруй асуулттай судалгааг дэмждэг. 4. SGQA код шаарддаггүй тул логикийг дахин ачаалахад асуудал гарахгүй. 5. Синтакс тодруулалт нь 1000 гаруй асуулттай судалгаанд тохирно. 6. Одоо байгаа цаасан судалгааг компьютержүүлэхийг хүссэн баг хэрэглэхэд хялбар бөгөөд хурдан. 7. Хагас бүтэцтэй ярилцлага болон эпидемиологийн судалгааг программистгүйгээр амархан дэмждэг. |
1. Энгийн нөхцөлд зориулсан GUI байхгүй - оронд нь синтакс тодруулалтыг ашигладаг. |
- Өөрийн хэрэгцээнд хамгийн сайн тохирохыг нь ашиглахыг зөвлөж байна.
- EM-ийн боломжуудын талаарх дэлгэрэнгүй тайлбарыг үзэхийн тулд дараах холбоос дээр дарна уу.
Эхлэх
EM-ийг эхлэн ашиглах хамгийн сайн арга нь:
- https://www.limesurvey.org/en/download хаягаас хамгийн сүүлийн тогтвортой хувилбарыг суулгах.
- Зарим жишээ судалгааг импортлож судлах.
- Хэрэглээний тохиолдол ба зааврууд, мөн алхам алхмаар жишээнүүдийг судлах.
- EM-ийн баримт бичгийг (энэ хуудас) судлах
- Тусгаарлагдсан илэрхийллүүдийн нэгжийн тест (ахисан түвшин)
- EM-ийн бүх функц болон операторыг ашигласан жишээ, мөн PHP болон JavaScript-ийн үр дүнг харуулдаг;
- PHP болон JavaScript хувилбарт өөр үр дүн өгдөг цөөн хэдэн функц байдгийг анхаараарай, иймээс энэ хуудас нь EM логикоо үүний дагуу төлөвлөхөд тусална.
- Тусгаарлагдсан илэрхийллүүдийн нэгжийн тест (ахисан түвшин)
Нэр томьёо
Эдгээр үгсийг EM-ийн чадамжийг тодорхойлоход түгээмэл ашигладаг:
- Ач холбогдолд суурилсан салаалалт - асуулт холбогдох бол асууна, үгүй бол асуухгүй (жишээ нь, үүнийг үл үзэгдэх болгож мэдээллийн санд NULL гэж тэмдэглэнэ). Ач холбогдол талбаруудыг асуултын засварлагчийн самбар болон асуултын бүлгийн засварлагчийн самбараас олж болно. Сүүлийнх нь нэг нөхцөлийг асуулт бүрт хуулахгүйгээр нөхцөлүүдийн багцыг бүхэл бүлэгт хэрэглэх, ба/эсвэл бүлэг болон асуултын түвшний нөхцөлт логикийг хослуулахад ашиглагддаг.
- Тохируулга - Аль асуултыг асуухаа мэдсэний дараа тохируулга (заримдаа piping гэж нэрлэдэг) нь асуултыг хэрхэн асуухыг тодорхойлдог. Энэ нь энгийн орлуулалтыг ({TOKEN:FIRSTNAME} шиг) төдийгүй сэдвүүдийн хүйс эсвэл тооноос хамаарч үйл үгийн хувирал, нэр үгийн тийн ялгалыг дэмжих боломжийг олгодог. Мөн бусад асуултад хариулсан эсэх (эсвэл хэрхэн хариулсан) байдлаас хамааран судалгааны оролцогчид хүргэх мессежийг өөрчлөх боломжтой.
- Тэгшитгэл - EM нь Илэрхийллийн үр дүнг хадгалдаг Тэгшитгэл нэртэй шинэ асуултын төрлийг нэмдэг. Тэгшитгэлийн үр дүнг хуудсан дээр нуусан ч тооцоолж мэдээллийн санд бичдэг. Иймээс эдгээрийг далд оноо тооцоолол, нарийн төвөгтэй тэгшитгэлд суурилсан навигаци, үнэлгээ, мөн мэдээллийн санд үүсгэж хадгалагдах тайланд ашигладаг.
Ач холбогдол ба давхарласан ач холбогдол
Асуултын төрөл бүр одоо асуултыг харуулах эсэхийг удирддаг Ач холбогдол сонголттой болсон. EM нь Холбогдох тэгшитгэл бүрийг судалгаанд гарч буй дарааллаар нь боловсруулдаг. Хэрэв илэрхийлэл үнэн (эсвэл байхгүй - хуучин судалгааг дэмжих үүднээс) бол асуулт харагдана. Хэрэв холбогдохгүй бол асуулт нуугдаж, утга нь мэдээллийн санд NULL болно. Бүлэгт холбогдох асуулт байхгүй бол бүхэл бүлгийг алгасна.
Түүнчлэн илэрхийлэл доторх аль нэг хувьсагч холбогдохгүй бол илэрхийлэл үргэлж худал (false) гэж үнэлэгдэнэ. Энэ нь асуулт бүрт маш урт Холбогдох тэгшитгэл бичих шаардлагагүй болгодог Давхарласан ач холбогдлыг боломжтой болгодог.
Танд Q1-Q5 гэсэн таван асуулт байгаа бөгөөд Q2-ийг зөвхөн Q1-д хариулсан тохиолдолд, Q3-ийг Q2-д хариулсан тохиолдолд гэх мэтээр харуулахыг хүсч байна гэж үзье. Холбогдох тэгшитгэлүүд дараах байдалтай байж болно:
| Асуултын код | Ач холбогдол | Асуулт |
|---|---|---|
| Q1 | 1 | Таны нэр хэн бэ? |
| Q2 | Q1 | {Q1}, та хэдэн настай вэ? |
| Q3 | Q2 | Тэгэхээр та {Q2} настай юм байна. Та гэрлэсэн үү? |
| Q4 | Q3 == "Y" | {Q1}, та хэр удаан гэрлэсэн бэ? |
| Q5 | Q4 | {Q1}, танд хэдэн хүүхэд байдаг вэ? |
Бүлгийн түвшний ач холбогдол
ExpressionScript нь бүлгийн түвшний ач холбогдлыг мөн дэмждэг. Энэ нь давталтыг хэрэгжүүлэхэд хялбар болгодог. Танд 10 хүртэлх объектоос (жишээлбэл бүтээгдэхүүн эсвэл өрхийн гишүүд) мэдээлэл цуглуулах шаардлагатай гэж үзье. Эхлээд хэдэн объектод дараагийн асуулт хэрэгтэйг тодорхойлно (жишээ нь өрхөд хэдэн хүн амьдардгийг асуух эсвэл урт жагсаалтаас аль бүтээгдэхүүн таалагддагийг сонгуулах замаар). Хэдэн объектод дараагийн асуулт хэрэгтэйг мэдсэний дараа дараагийн асуултуудын 10 бүлэг тус бүрт {count >= 1}, {count >=2}, ... {count >= 10} гэх мэт бүлгийн түвшний ач холбогдлыг ашиглаж болно. Бүлэг бүрийн дотор асуултын түвшний нөхцөлт логик (жишээ нь сэдэв бүрт хүйс эсвэл насанд тохирсон дараагийн асуултууд) байж болно. Асуулт болон бүлгийн түвшний холбогдох тэгшитгэлүүдийг AND-ээр холбож аль нь харагдахыг тодорхойлдог.
Ийм жишээг үзэхийн тулд дараах судалгааг импортлоорой: Хүн амын тооллогын судалгааны жишээ.
Доорх дэлгэцийн зургаас хариулагч дор хаяж нэг хамт амьдрагчтай амьдардаг бол Person 1 бүлэг харагдаж (буюу холбогдох) байгааг харж болно:

Тохируулга/Дамжуулалт (Tailoring/Piping)
Хаалтан дотор ({ }) байгаа бүх зүйлийг одоо Илэрхийлэл гэж үзнэ (доор дурдсан нэг үл хамаарах тохиолдлоос бусад). Илэрхийлэлүүд нь бүх LimeReplacementFields болон хувьсагчид (хэд хэдэн өөр нэрээр), бүх энгийн тэгшитгэлийн оператор (математик, логик, харьцуулалт), мөн олон арван функцэд (клиент талд ч динамикаар ажилладаг) хандах эрхтэй.
Эдгээр тэгшитгэлийг ашигласнаар дараах зүйлсийг хийж болно:
- Өмнөх хариултууд дээр үндэслэн хариулагчдад тохирсон мессежийг нөхцөлтэйгээр харуулах;
- Үнэлгээ үүсгэж, үнэлгээний үр дүнг харуулах (эсвэл үр дүнд нь үндэслэн нөхцөлтэйгээр салаалах эсвэл мессеж харуулах) бөгөөд үүнд үнэлгээний модуль-ийг огт ашиглахгүй;
- Асуулт, хариулт, тайлан доторх үйл үгийг хувирган нөхөж, нэр үгийг тохирох хэлбэрт оруулах;
- Судалгааны төгсгөлд "Хариултуудаа харуулах" хуудасны өмнө хариултуудын хураангуйг харуулах.
Тэгшитгэлүүд
Тэгшитгэл нэртэй асуултын шинэ төрөл байна. Үүнийг дэлгэцэнд текст харагдана асуултын төрөл гэж төсөөлөөрэй, гэхдээ харуулсан зүйлийн утгыг мэдээллийн санд хадгалдгаараа ялгаатай. Тэгэхээр Тэгшитгэл асуултын текст үнэлгээний тооцоолол агуулсан бол тухайн утга нийтийн эсвэл хувийн статистикт харуулж болох хувьсагчид хэлбэрээр мэдээллийн санд хадгалагдана.
Синтакс
Хаалтан дотор ({ }) байгаа бүх зүйлийг одоо Илэрхийлэл гэж үзнэ (нэг үл хамаарах зүйлтэй: эхэнд болон төгсгөлд хоосон зай байж болохгүй - энэ нь ExpressionScript суулгагдсан JavaScript-ийг боловсруулахыг оролдохгүй байхын тулд шаардлагатай).
Нээх хаалтны дараа болон хаах хаалтны өмнө хоосон зай байхгүй бол илэрхийлэл олон мөр хамарч болно. Энэ нь ялангуяа дараах мэт давхар "if()" илэрхийллүүдэд тустай:
{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',
''
)
)
)
)
)
)
)
)}
ExpressionScript нь дараах синтаксийг дэмждэг:
- Бүх стандарт математик оператор (жишээ нь +,-,*,/,!);
- Бүх стандарт харьцуулах оператор (жишээ нь <,<=,==,!=,>,>=, мөн тэдгээрийн дүйцэх хэлбэрүүд: lt, le, eq, ne, gt, ge);
- Хаалт (дэд илэрхийллийг бүлэглэх боломжтой);
- Нөхцөлт оператор (жишээ нь &&,| | мөн тэдгээрийн дүйцэх хэлбэрүүд: and, or);
- Дан болон давхар хашилттай тэмдэгт мөр (тус бүр нь нөгөө төрлийн хашилттай мөрийг агуулж болно);
- Таслалын оператор (илэрхийллүүдийн жагсаалт бичиж, зөвхөн сүүлийн үр дүнг буцаах боломжтой);
- Оноох оператор (=);
- Урьдчилан тодорхойлсон хувьсагчид (асуулт, асуултын атрибут, хариулт руу хандах) - жишээ нь SGQA кодууд;
- Урьдчилан тодорхойлсон функцүүд (одоо 80 гаруй байгаа бөгөөд шинийг нэмэхэд хялбар).
Операторууд
EM синтакс нь операторын энгийн тэргүүлэх дарааллыг дагана:
| Түвшин | Оператор(ууд) | Тайлбар |
|---|---|---|
| 1 | () | бүлэглэх эсвэл функц дуудах хаалт |
| 2 | ! - + | нэг операндтай оператор: үгүйсгэл, сөрөг тэмдэг, эерэг тэмдэг |
| 3 | * / | үржих, хуваах |
| 4 | + - | нэмэх, хасах |
| 5 | < <= > >= lt le gt ge | харьцангуй харьцуулалт |
| 6 | == != eq ne | тэнцүү эсэхийг харьцуулах |
| 7 | and | логик AND |
| 8 | or | логик OR |
| 9 | = | оноох оператор |
| 10 | , | таслалын оператор |
Тоо ба тэмдэгт мөрийн тохиромжгүй байдал болон цагаан толгойн/тоон харьцуулалтын талаарх анхааруулга
Утгыг харьцангуй эсвэл тэнцүү эсэхийг харьцуулахдаа тохиромжгүй байдалд анхаарна уу. Хэрэглэгчийн оруулсан (эсвэл хариултын кодоор өгөгдсөн) утгыг тодорхой тоо бол тоо болгон ашиглаж болно.
Хэрэв утгуудын аль нэгийг "-аар хүрээлбэл текст/тэмдэгт мөрийн харьцуулалт хийгдэнэ. Тоо болгон харьцуулахыг хүсвэл тоог хэзээ ч "-аар бүү хүрээл.
Жишээ нь Q0.NAOK нь 9 утгатай тоон асуулт бол Q0.NAOK > "50" үнэн байна. Учир нь > оператор үүнийг тоон бус цагаан толгойн харьцуулалт гэж үзнэ.
Бүхэл тоон утгыг харьцуулж байгаагаа баталгаажуулахын тулд intval(Q0.NAOK) > 50 гэж ашиглаж болно. Хэрэв Q0.NAOK тоо биш (хоосон эсвэл тэмдэгт мөр) бол intval(Q0.NAOK) === 0 болохыг санаарай. Тэмдэгт мөрийн утгыг ("A" < "B") харьцуулахдаа strcmp-г шууд ашиглана уу: strcmp(Q0.NAOK,"B") эсвэл strcmp(Q0.NAOK,"A5").
Оноох оператор (=)-ыг ашиглахтай холбоотой анхааруулга
Оноох операторыг зайлшгүй шаардлагатай үед нь бус бол ашиглахаас зайлсхийх хэрэгтэй, учир нь тэд гэнэтийн гаж нөлөө үүсгэж болно. Жишээлбэл, өмнөх хариултын утгыг өөрчилбөл тэр асуулт болон одоогийн асуултын хоорондох дараалсан холбогдол ба баталгаажуулалтын логик дахин тооцоологдохгүй, улмаар дотооддоо зөрчилтэй өгөгдөл үүсч болно (жишээ нь хариулагдсан хэвээр үлдэх ёстой биш NULL болох ёстой асуултууд, эсвэл алгасагдсан атлаа хариулагдах ёстой асуултууд). Ерөнхийдөө хувьсагчид утга оноохыг хүсвэл Тэгшитгэл асуултын төрөл үүсгэж, түүний утгыг илэрхийллээр тохируулах хэрэгтэй. Гэсэн хэдий ч хааяа энэ оператор үнэхээр хэрэгтэй тохиолдол гардаг тул бид үүнийг боломжтой болгосон.
Энэ операторын талаар анхааруулахын тулд синтакс тэгшитгэлүүд дотор үүнийг улаан үсгээр харуулдаг ("=="-тэй андуурахгүйн тулд).
Оноох операторыг ашиглах
Оноох операторыг ашиглахыг хүсэж болох үндсэн шалтгаанууд:
- Үндсэн утга хүлээн авдаггүй асуултад (жишээ нь радио жагсаалт, хэрэглэгчийн интерфейс хариултын сонголтуудаас нэгийг сонгохыг зөвшөөрдөг ч тэгшитгэл оруулахыг зөвшөөрдөггүй) тэгшитгэлээр үндсэн утга тохируулах хэрэгтэй үед. Гэхдээ болгоомжтой байгаарай, учир нь LimeSurvey таны тэгшитгэл тухайн асуултын зөвшөөрөгдсөн хариултуудын нэгийг үүсгэж байгааг баталгаажуулж чадахгүй;
- Дараачийн хариултад үндэслэн өмнөх асуултын хариултыг хүчээр өөрчлөх шаардлагатай үед;
- гэх мэт...
Энэ зорилгоор илэрхийллийн менежерийн бүх системийг ашиглаж болно. Гэхдээ энэ зорилгоор тэнцүү асуултын төрлийг ашиглах нь дээр.
Зарим жишээ:
- Богино текст асуултын хариултыг жижиг үсгээр тохируулах :
{QCODE=strtolower(QCODE.NAOK)}; - Судалгааны эхэнд хүснэгт асуултын төрөлд үндсэн хариулт тохируулах :
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}; - Судалгааны эхэнд текст хүснэгт асуултын төрөлд үндсэн хариулт тохируулах :
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}; - Нөхцөлтэйгээр хариулт тохируулах :
{QCODE=if(YesNo="Y","A1","")}.
XSS аюулгүй байдал
XSS идэвхжсэн үед илэрхийллийн менежер системийн зарим хэсгийг ашиглах боломжгүй:
- HTML таг-ийг нэг илэрхийлэлд эхлүүлж, нөгөө илэрхийлэлд төгсгөх;
- URL дотор нарийн төвөгтэй илэрхийлэл ашиглах.
Жишээ болон шийдлүүд:
{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}нь XSS хамгаалалттай үед ажиллахгүй. Энэ тохиолдолд{if(1,"<strong>information</strong>","information")}гэж ашиглаж болно;<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>, энд асуултын кодыг бүтнээр нь ашиглах нь зөвшөөрөгддөг тул тэгшитгэлийн асуултыг ашиглаж болно:<a href="/script.php?value={EQUATION.NAOK}">next</a>.
Хувьсагчдад хандах хандалт
ExpressionScript нь танд хэрэгтэй аливаа хувьсагчид зөвхөн унших эрхээр хандах боломжийг олгоно. Хоёр талын нийцтэй байдлыг хангахын тулд дараахад хандах боломжтой:
- TOKEN:xxx - TOKEN-ий утга (жишээ нь TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (нэргүй судалгаа биш үед л).
- Загваруудад ашиглагддаг {XXX} утгууд бүгд.
- Асуултын текстэд {QID}-г асуултын id-аар, {SGQ}-г асуултын SGQA-аар солиулан ашиглаж болно.
- {SAVEDID} - одоогийн хариултын ID
Үүнээс гадна ExpressionScript нь хувьсагчдыг асуултын кодоор (өгөгдлийн сан дахь асуултуудын хүснэгтийн 'title' багана) нэрлэх боломжийг олгодог. Энэ нь мөн өгөгдлөө SPSS, R эсвэл SAS руу экспортлоход ашиглагдах хувьсагчийн шошго юм. Жишээ нь нэр, нас, хүйсийн талаарх асуултуудтай бол тэдгээр хувьсагчийг 12345X13X22, 12345X13X23, 12345X13X24 гэхийн оронд name, age, gender гэж нэрлэж болно. Ингэснээр тэгшитгэлийг хүн бүр уншиж, логикийг нь шалгахад хялбар болохоос гадна бүлэг эсвэл асуултын дугаарыг мөшгөхгүйгээр асуултуудын дарааллыг сольж болно.
Чухал: Өмнөх хуудас эсвэл асуултуудад байгаа хувьсагчдыг дурдах нь илүү аюулгүй.
Түүнчлэн ExpressionScript нь асуултын олон шинж чанарт хандах боломжийг олгоно:
| Синтакс | Утга | Жишээ | Жишээний үр дүн |
|---|---|---|---|
| Qcode | Qcode.code-ийн өөр нэр | {implode(',',name,gender)} | 'Tom','M' |
| Qcode.code | асуулт холбогдох бол сонгосон хариултын код (эс бөгөөс хоосон), эсвэл кодтой асуулт биш бол текст утга | {implode(',',name.code,gender.code)} | 'Tom','M' |
| Qcode.NAOK | Qcode-тэй адил - NAOK-ийн тайлбарыг үзнэ үү | {gender.NAOK} | 'M' |
| Qcode.value | асуулт холбогдох бол асуултын үнэлгээний утга (эс бөгөөс хоосон), эсвэл кодтой асуулт биш бол текст утга | {gender.value} | '1' |
| Qcode.valueNAOK | Qcode.value-тэй адил - NAOK-ийн тайлбарыг үзнэ үү | {gender.valueNAOK} | '1' |
| Qcode.shown | асуултын харуулах утга | {implode(',',name.shown,gender.shown)} | 'Tom','Male' |
| Qcode.question | асуултын текст | {gender.question} | 'What is your gender?' |
| Qcode.mandatory | асуулт заавал бөглөх эсэх (Y/N) | {gender.mandatory} | 'N' |
| Qcode.qid | асуултын дотоод дугаар (дарааллын дугаар биш) | {gender.qid} | 337 |
| Qcode.type | асуултын төрөл | {gender.type} | 'G' |
| Qcode.jsName | энэ хуудсанд зарлагдсан эсэхээс үл хамааран асуултын зөв javascript нэр | {gender.jsName} | 'java1827X3X337' |
| Qcode.gid | бүлгийн дотоод дугаар (дарааллын дугаар биш) | {gender.gid} | 3 |
| Qcode.qseq | асуултын дарааллын дугаар, 0-ээс эхэлнэ | {gender.qseq} | 5 |
| Qcode.gseq | бүлгийн дарааллын дугаар, 0-ээс эхэлнэ | {gender.gseq} | 1 |
| Qcode.relevanceStatus | асуулт одоогоор холбогдох эсэх (0 эсвэл 1) | {gender.relevanceStatus} | 1 |
| Qcode.relevance | асуултын түвшний холбогдох тэгшитгэл | {gender.relevance} | '!is_empty(name)' |
| Qcode.grelevance | бүлгийн түвшний холбогдох тэгшитгэл | {gender.grelevance} | 'num_children >= 5' |
| Qcode.sgqa | энэ асуултын SGQA утга | {gender.sgqa} | '1827X3X337' |
HTML засварлагчийн асуудал
HTML засварлагч ашиглавал зарим тэмдэгт HTML entity-гээр солигддог.
- & нь &
- < нь <
- > нь >
HTML засварлагч ашиглаж байгаа бол дараахыг хэрэглэх хэрэгтэй:
- and нь & -ийн оронд
- lt нь < -ийн оронд
- le нь <= -ийн оронд
- gt нь > -ийн оронд
- ge нь >= -ийн оронд
Илэрхийлэл доторх HTML-г цэвэрлэхийг зөвлөж байна. LimeSurvey-н HTML засварлагчийг ашигладаг бол засварлагчийн зүүн дээд хэсэгт байрлах "Source" товчийг дарж, илэрхийлэлтэй холбоогүй бүх тэмдэгтийг (жишээ нь
,
гэх мэт) устгана уу.
Qcode хувьсагчийн нэршил
Доор асуултын төрлөөр Qcode-г хэрхэн байгуулах (мөн зарим шинж чанарт хандах) дэлгэрэнгүйг харуулав. Ерөнхийдөө Qcode дараах байдлаар байгуулагдана:
QuestionCode . '_' . SubQuestionID . '_' . ScaleId
comment болон other-ийн хувьд харгалзах асуултын кодууд нь QuestionCode_comment болон QuestionCode_other байна.
| Төрөл | Тодорхойлолт | Код | Дэд асуултууд | Хариултын сонголтууд | Хэмжүүрүүд | Хариултын код | Харагдах хариулт | Холбогдох байдал |
|---|---|---|---|---|---|---|---|---|
| 5 | 5 онооны сонголт, радио товчнууд | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
| B | Массив (10 онооны сонголт) радио товчнууд | Q2 | L1-L6 | 1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | |
| A | Массив (5 онооны сонголт) радио товчнууд | Q3 | 1-5 | 1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | |
| 1 | Хүснэгт (уян хатан шошго) хос хэмжүүр | Q4 | sq1-sq5 | 0:a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
| H | Хүснэгт (уян хатан) - баганан формат | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
| F | Хүснэгт (уян хатан) - мөрөн формат | Q6 | F1-F5 | 1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | |
| E | Хүснэгт (өсөх / тэнцэх / буурах) радио товчнууд | Q7 | 1-7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
| : | Хүснэгт (олон уян хатан) 1-ээс 10 | Q8 | ls1,todo,ls2 | min,max,avg | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
| ; | Хүснэгт (олон уян хатан) текст | Q9 | hp,st,sw | 1st,2nd,3rd | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
| C | Хүснэгт (тийм/эргэлзээтэй/үгүй) радио товчнууд | Q10 | 1-5 | Y,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
| X | Бэлэн текстийн асуулт | Q11 | {Q11.shown} | |||||
| D | Огноо | Q12 | {Q12} | {Q12.shown} | ||||
| * | Тэгшитгэл | Q13 | {Q13} | {Q13.shown} | {Q13>5} | |||
| ~124~ | Файл upload (хуулсан файлын тоог бүртгэнэ) | Q14 | {Q14} | {Q14>0} | ||||
| G | Хүйсийн жагсаалтыг доош буулгах | Q15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
| U | Асар том үнэгүй текст | Q16 | {Q16} | {Q16.shown} | {strlen(Q16)>100} | |||
| I | Хэлний асуулт | Q17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
| ! | Жагсаалт - доош буулгах | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
| L | Жагсаалт, доош буулгах/радио товчтой жагсаалт | Q19 | A-Z | {Q19} | {Q19.shown} | {Q19=='X'} | ||
| O | Тайлбартай жагсаалт, доош буулгах/радио товчтой жагсаалт + текст талбар | Q20 | A-F | {Q20},{Q20comment} | {Q20.shown} | {Q20=='B'} | ||
| T | Үнэгүй урт текст | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
| M | Олон сонголт, чагтлах нүд | Q22 | A-F, other | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
| P | Тайлбартай олон сонголт, чагтлах нүд + текст | Q23 | A-F | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
| K | Олон тоон асуулт | Q24 | self,mom,dad | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
| Q | Олон тооны богино текст | Q25 | A-F | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
| N | Тоон асуултын төрөл | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
| R | Зэрэглэлийн хэлбэр | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
| S | Богино үнэгүй текст | Q28 | {Q28} | {Q28.shown} | {Q28=='mine'} | |||
| Y | Тийм/Үгүй радио товчнууд | Q29 | {Q29} | {Q29.shown} | {Q29=='Y'} |
NAOK-ийн хэрэглээ
NAOK --> "Not Applicable" (NA) is alright (OK) буюу "Хамаарахгүй" байсан ч зүгээр
NAOK-ийг ашиглах нь бүх эсвэл зарим хувьсагч холбогдохгүй байх (жишээ нь "Not Applicable" (NA) is alright (OK)) боломжтой гэсэн үг.
Жишээ нь: Q1-ийн нэг дэд асуулт шүүгдсэн бол count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) нь үргэлж хоосон тэмдэгт мөр буцаана. Тийм асуултад сонгосон дэд асуултын тоог тоолохын тулд count(Q1_SQ1.NAOK,Q1_SQ2.NAOK,Q1_SQ3.NAOK,Q1_SQ4.NAOK) гэж ашиглаж болно. Хэрэв дэд асуулт нуугдсан бол EM хоосон тэмдэгт мөр буцаана.
NAOK-гүй үед нэг асуулт эсвэл нэг дэд асуулт нуугдсан бол EM үргэлж хоосон тэмдэгт мөр буцаана (false буцаахтай адил).
.shown нь үргэлж NAOK системийг ашигладаг (нуугдсан бол хоосон мөр буцаана). Харин танд хариултын код хэрэгтэй бол асуултын кодын дараа .NAOK нэмэх нь үргэлж зөв шийдэл байдаг (хэрэв танд өөр зүйл хэрэгтэй бөгөөд юу хийж байгаагаа мэдэж байгаагаас бусад тохиолдолд).
Дэлгэрэнгүй мэдээллийг Давхарласан нөхцлийг дарах дэд хэсгээс үзнэ үү.
Нөөцлөгдсөн "this", "self", "that" хувьсагчид
Асуултын бүх хэсгийг үнэлэх шаардлага ихэвчлэн гардаг, жишээ нь хэдэн дэд асуултад хариулсныг тоолох эсвэл оноог нэгтгэх. Бусад үед асуултын зөвхөн тодорхой мөр эсвэл баганыг боловсруулах хэрэгтэй болдог (жишээ нь мөр эсвэл баганын нийлбэрийг гарган өгөгдлийн санд хадгалах). Эдгээр нөөцлөгдсөн хувьсагчид уг үйлдлийг нэлээд хялбар болгодог.
"This" хувьсагч
"this" хувьсагчийг зөвхөн "Асуулт бүхлээрх баталгаажуулалтын тэгшитгэл" болон "Дэд асуултын баталгаажуулалтын тэгшитгэл" сонголтуудад ашиглана (сүүлийнх нь GUI-аас боломжгүй). Энэ нь тэдгээр асуултууд доторх нүд бүрийн хувьсагчийн нэр болж өргөжинө. Тиймээс бүх оруулга гурваас их байхыг шалгах бол "Дэд асуултын баталгаажуулалтын тэгшитгэл"-ийг (this > 3) гэж тохируулна.
"Self" хувьсагч
"self" болон "that" хувьсагчид илүү хүчирхэг бөгөөд тэгшитгэлийг боловсруулахаас өмнө өргөжих макро болж ажиллана. "self" хувьсагчийн синтаксийн сонголтууд:
- self
- self.suffix
- self.sub-selector
- self.sub-selector.suffix
- дагавар нь qcode-ийн ердийн дагавруудын аль нэг байна (жишээ нь: NAOK, value, shown)
- дэд сонгогч нь дараахын аль нэг байж болно:
- comments - зөвхөн тайлбар болох дэд асуултууд (жишээ нь: Тайлбартай олон сонголт болон Тайлбартай жагсаалт);
- nocomments - зөвхөн тайлбар биш дэд асуултууд;
- sq_X - энд X нь мөр эсвэл баганын тодорхойлогч. Зөвхөн X хэв маягт таарах дэд асуултууд сонгогдоно. Хайлт нь кодын бүрэн тодорхойлогч дээр хийгдэх бөгөөд sq_X нь nX, X, Xn дэд асуултуудыг хамруулна (жишээ нь sq_1 ашиглавал a1, 1a, 1, 11 эсвэл 001 дэд асуултууд орно). QCODE_SQCODE_1 болон QCODE_SQCODE_1 гэсэн дэд асуултын кодтой хос шкалтай асуултын төрөл, мөн QCODE_1,QCODE_2 ... гэсэн дэд асуултын кодтой зэрэглэлийн асуултын төрөлд анхаарна уу.
Жишээ:
- Асуултын аль нэг хэсэгт хариулсан эсэх? -> {count(self.NAOK)>0}
- Энэ асуултын үнэлгээний оноо хэд вэ? -> {sum(self.value)}
Эдгээрийг мөр болон баганын нийлбэрийг гаргахад мөн ашиглаж болно. A-E мөртэй, 1-5 баганатай тоон хүснэгт байна гэж үзье.
- Нийт дүн хэд вэ? -> {sum(self.NAOK)}
- B мөрийн нийлбэр хэд вэ? -> {sum(self.sq_B.NAOK)}
- 3-р баганын нийлбэр хэд вэ? -> {sum(self.sq_3.NAOK)}
"That" хувьсагч
"that" хувьсагч нь "self" хувьсагчтай төстэй боловч бусад асуултыг лавлах боломж олгодог. Синтакс нь:
- that.qname
- that.qname.дагавар
- that.qname.дэд сонгогч
- that.qname.дэд сонгогч.дагавар
qname нь дэд асуултын өргөтгөлгүй асуултын нэр юм. Жишээлбэл, 'q1' асуулт үүсгэвэл 'q' нь мөн түүний qname болно.
Жишээ:
- q1 асуултын аль нэг хэсэгт хариулсан эсэх? -> {count(that.q1.NAOK)>0}
- q2-ийн үнэлгээний оноо хэд вэ? -> {sum(that.q2.NAOK)}
- q3-ийн нийт дүн хэд вэ? -> {sum(that.q3.NAOK)}
- q4 дэх C мөрийн нийлбэр хэд вэ? -> {sum(that.q4.sq_C.NAOK)}
- q4 дэх 2-р баганын нийлбэр хэд вэ? -> {sum(that.q4.sq_2.NAOK)}
"self" болон "that" хувьсагчийг аливаа холбогдох нөхцөл, баталгаажуулалт эсвэл тохируулгад ашиглаж болно.
Нэг анхаарах зүйл нь Логик файл харуулах боломжийг ашиглахад "self" болон "that"-ийн өргөтгөсөн утгыг харуулдаг. Ингэснээр үүсгэгдэх бодит тэгшитгэлийг харж, та (болон EM) хувьсагчид байгаа эсэхийг баталгаажуулах боломжтой. Тэгшитгэлүүд нэлээд урт харагдаж болох тул төөрөгдүүлж магадгүй. Гэхдээ асуултыг засах үед "self" болон/эсвэл "that" ашигласан анхны тэгшитгэлийг харна.
- тэгшитгэлд ашиглах хувьсагч бүрийг тодорхой нэрлэхийг хүсвэл, эсвэл
- дэд асуултгүй хувьсагч (жишээ нь: нэг хариулттай асуулт) ашиглаж байгаа бол. Эдгээр тохиолдолд хувьсагчийн өмнө "that" залгах нь илүүц бөгөөд санаанд оромгүй үр дүн гарах эрсдэлтэй.
Функцүүдэд хандах
ExpressionScript нь доор үзүүлсэн математик, тэмдэгт мөр болон хэрэглэгчийн тодорхойлсон функцүүдэд хандах боломж олгодог. Эдгээр функцийн PHP болон JavaScript эквивалент байдаг тул сервер талд (PHP) болон клиент талд (JavaScript) ижилхэн ажиллана. Шинэ функц нэмэхэд хялбар.
Хэрэгжүүлсэн функцүүд
Одоогоор дараах функцүүд боломжтой:
| Функц | Утга | Синтакс |
|---|---|---|
| abs | Абсолют утга | number abs(number) |
| acos | нум хэлбэрийн косинус | number acos(number) |
| addslashes | Мөрийг налуу зураасаар хашилтлах | string addslashes(string) |
| asin | нум хэлбэрийн синус | number asin(number) |
| atan | нум хэлбэрийн тангенс | number atan(number) |
| atan2 | 2 хувьсах хэмжигдэхүүн бүхий нуман тангенс | number atan2(number, number) |
| ceil | бутархай тоог бүхэл тоонд хүргэж ойролцоогоор өсгөх | number ceil(number) |
| checkdate | Григорийн тооллын зөв огноо бол үнэн(1) буцаана | bool checkdate(month,day,year) |
| convert_value | Тоон утгыг тоон утгуудын inputTable болон outputTable ашиглан хөрвүүлэх | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
| cos | Косинус | number cos(number) |
| count | жагсаалт дахь хариулсан (хоосон биш) асуултуудын тоог тоолох | number count(arg1, arg12, ..., argN) |
| countif | Жагсаалт дахь эхний аргументтай тэнцүү хариулсан асуултуудын тоог тоолох | number countif(matches, arg1, arg2, ... argN) |
| countifop | Жагсаалт дахь шалгуурыг (arg op value) хангасан хариулсан асуултуудын тоог тоолох | number countifop(op, value, arg1, arg2, ... argN) |
| date | тогтмол байрлах өдөр/ цаг форматлах | string date(format [, timestamp=time()]) |
| exp | е зэрэгт дэвшүүлэн тооцоол | number exp(number) |
| fixnum | Шаардлагатай бол тоог бутархай салгагчаар таслал ашиглан харуулах | string fixnum(number) |
| floor | бутархай тоог бүхэл тоонд хүргэж ойролцоогоор бууруулах | number floor(number) |
| gmdate | GMT огноо/цагийн формат | string gmdate(format [, timestamp=time()]) |
| html_entity_decode | Бүх HTML entity-г тохирох тэмдэгт болгон хөрвүүлэх (үргэлж ENT_QUOTES болон UTF-8 ашиглана) | string html_entity_decode(string) |
| htmlentities | Тохирох бүх тэмдэгтийг HTML entity болгон хөрвүүлэх (үргэлж ENT_QUOTES болон UTF-8 ашиглана) | string htmlentities(string) |
| expr_mgr_htmlspecialchars | Тусгай тэмдэгтүүдийг HTML entity болгон хөрвүүлэх (үргэлж ENT_QUOTES болон UTF-8 ашиглана) | string htmlspecialchars(string) |
| expr_mgr_htmlspecialchars_decode | Тусгай HTML entity-г буцаан тэмдэгт болгох (үргэлж ENT_QUOTES болон UTF-8 ашиглана) | string htmlspecialchars_decode(string) |
| idate | тогтмол байрлах өдөр/ цаг -ыг бүхэл тоо руу форматлах | string idate(string [, timestamp=time()]) |
| if | Excel маягийн if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
| implode | цуглуулагдсан элэментүүдэд хэлхээгээр нэгдэх | string implode(glue,arg1,arg2,...,argN) |
| intval | хувьсах хэмжигдэхүүний үр дүнг бүхэл болгох | int intval(number [, base=10]) |
| is_empty | Хувьсах хэмжигдэхүүн хоосон гэж тооцогдох эсэхийг тодорхойлох | bool is_empty(var) |
| is_float | Хувьсах хэмжигдэхүүний төрөл нь float эсэхийг шалгах | bool is_float(var) |
| is_int | Хувьсах хэмжигдэхүүний төрөл нь бүхэл тоо эсэхийг шалгах | bool is_int(var) |
| is_nan | үр дүн нь тоогоор биш байхаар олох уу үгүй юу | bool is_nan(var) |
| is_null | хувьсах хэмжигдэхүүн нь NULL байхаар олох уу үгүй юу | bool is_null(var) |
| is_numeric | Хувьсах хэмжигдэхүүн нь тоо эсвэл тоон мөр эсэхийг шалгах | bool is_numeric(var) |
| is_string | Хувьсах хэмжигдэхүүний төрөл нь мөр эсэхийг шалгах | bool is_string(var) |
| join (New in 2.0 build 130129) | Элементүүдийг шинэ мөр болгон нэгтгэх | join(arg1, arg2, ... argN) |
| list | Хоосон биш утгуудын таслалаар тусгаарласан жагсаалтыг буцаах | string list(arg1, arg2, ... argN) |
| listifop (New in 3.16.1 ) | Шалгуурыг (cmpProp op value) хангасан жагсаалт дахь асуултуудаас заасан асуултын шинж чанарыг (retProp) 'glue' тусгаарлагчаар тусгаарласан жагсаалтаар буцаах | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
| ltrim | Мөрийн эхнээс хоосон зай (эсвэл бусад тэмдэгт) хасах | string ltrim(string [, charlist]) |
| max | Хамгийн том утгыг олох | number max(arg1, arg2, ... argN) |
| min | Хамгийн бага утгыг олох | number min(arg1, arg2, ... argN) |
| mktime | Огнооны UNIX timestamp авах (6 аргумент тус бүр сонголттой) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
| modulo-function | Модуль функц одоогоор дэмжигдээгүй. Оронд нь floor() функцийг ашиглаж болно | floor(x/y)==(x/y) |
| nl2br | Мөрийн бүх шинэ мөрийн өмнө HTML мөр таслагч оруулах | string nl2br(string) |
| number_format | дугаарлагдсан мянган групыг форматлах | string number_format(number) |
| pi | үр дүнг 3,14 болгох | number pi() |
| pow | зргийн илтгэгчтэй илэрхийлэл | number pow(base, exp) |
| quoted_printable_decode | Quoted-printable мөрийг 8 битийн мөр болгон хөрвүүлэх | string quoted_printable_decode(string) |
| quoted_printable_encode | 8 битийн мөрийг quoted-printable мөр болгон хөрвүүлэх | string quoted_printable_encode(string) |
| quotemeta | өөрчлөгдсөн бичгүүдийг үнэл | string quotemeta(string) |
| rand | Санамсаргүй бүхэл тоо гаргах, энэ жишээг үзнэ үү | int rand() OR int rand(min, max) |
| regexMatch | Мөрийг тогтмол хэмжигдэхүүнтэй харьцуулах | bool regexMatch(pattern,input) |
| round | тоог сонгон нарийвчил | number round(val [, precision]) |
| rtrim | Мөрийн төгсгөлөөс хоосон зай (эсвэл бусад тэмдэгт) хасах | string rtrim(string [, charlist]) |
| sin | Синус | number sin(arg) |
| sprintf | форматлагдсан хэлхээг буцаах | string sprintf(format, arg1, arg2, ... argN) |
| sqrt | квадрат язгуур | number sqrt(arg) |
| stddev | Тооны жагсаалтын түүврийн стандарт хазайлтыг тооцоолох | number stddev(arg1, arg2, ... argN) |
| str_pad | Мөрийг өөр мөрөөр тодорхой уртад хүртэл дүүргэх | string str_pad(input, pad_length [, pad_string]) |
| str_repeat | давтагдсан хэлхээ | string str_repeat(input, multiplier) |
| str_replace | Хайсан мөрийн бүх илрэлийг орлуулах мөрөөр солих | string str_replace(search, replace, subject) |
| strcasecmp | давхар баталгаажсан кейсэн мэдээгүй хэлхээн харьцуулалт | int strcasecmp(str1, str2) |
| strcmp | давхар баталгаажсан хэлхээн харьцуулалт | int strcmp(str1, str2) |
| strip_tags | хэлхээгээс HTML болон PHP-д хаяглагдсан зурвас | string strip_tags(str, allowable_tags) |
| stripos | Том, жижиг үсгийг ялгахгүйгээр юникод мөрийн эхний илрэлийн байрлалыг олох (0-ээс эхэлнэ, олдохгүй бол false буцаана) | int stripos(haystack, needle [, offset=0]) |
| stripslashes | үнэлсэн хэлхээг үнэлэхгүй байх | string stripslashes(string) |
| stristr | кейсэн мэдээгүй strstr | string stristr(haystack, needle [, before_needle=false]) |
| strlen | Мөрийн уртыг авах | int strlen(string) |
| strpos | Юникод мөрийн эхний илрэлийн байрлалыг олох (0-ээс эхэлнэ, олдохгүй бол false буцаана) | int strpos(haystack, needle [ offset=0]) |
| strrev | Мөрийг тонгоруулах | string strrev(string) |
| strstr | Мөрийн эхний илрэлийг олох | string strstr(haystack, needle[, before_needle=false]) |
| strtolower | Мөрийг жижиг үсэгтэй болгох | string strtolower(string) |
| strtotime | Англи хэл дээрх огноо цагийн тэмдэгт тайлбарыг Unix timestamp болгон задлах | int strtotime(string) |
| strtoupper | Мөрийг том үсэгтэй болгох | string strtoupper(string) |
| substr | Юникод мөрийн нэг хэсгийг буцаах | string substr(string, start [, length]) |
| sum | цуглуулагдсан үр дүнгийн нийлбэрийг тооцоол | number sum(arg1, arg2, ... argN) |
| sumifop | Жагсаалт дахь шалгуурыг (arg op value) хангасан хариулсан асуултуудын утгыг нэмэх | number sumifop(op, value, arg1, arg2, ... argN) |
| tan | Тангенс | number tan(arg) |
| time | түгээмэл UNIXхугацааны ангиллыг буцаах | number time() |
| trim | Мөрийн эхлэл болон төгсгөлөөс хоосон зай (эсвэл бусад тэмдэгт) хасах | string trim(string [, charlist]) |
| ucwords | Мөр дэх үг бүрийн эхний тэмдэгтийг том үсэг болгох | string ucwords(string) |
| unique | хэрэв бүх хоосон биш үр дүнгүүд нь хосгүй бол буцаалт нь үнэн | boolean unique(arg1, ..., argN) |
<span id="Create_new_expression_functions_with_plugin_ (New in 4.0.0 )">
Плагинаар илэрхийллийн шинэ функц үүсгэх (New in 4.0.0 )
Хэрэв үндсэн системд байхгүй шинэ функц хэрэгтэй бол плагин ашиглан үүсгэж болно. Ийм шинэ функцийг expressionManagerStart үйл явдлыг ашиглан үүсгэнэ.
ExpressionScript аль хувьсагчууд локал болохыг мэддэг
Хуудасны JavaScript-ийг зөв үүсгэхийн тулд EM нь хуудсан дээр ямар хувьсагчид тохируулагдсан болон тэдгээрийн JavaScript ID юу болохыг (жишээ нь document.getElementById(x)-д зориулж) мэдэх шаардлагатай. Мөн бусад хуудсан дээр ямар хувьсагчид тохируулагдсаныг мэдэх ёстой (ингэснээр шаардлагатай <input type='hidden' value='x'> талбарууд байгаа бөгөөд утгаар дүүрсэн эсэхийг баталгаажуулна).
Дараалсан нөхцөлүүд
Хэрэв хувьсагчдын аль нэг нь холбогдолгүй бол бүх тэгшитгэл холбогдолгүй (false) болно. Жишээлбэл, дараах хүснэгтэд N/A нь хувьсагчдын аль нэг нь холбогдолгүй байсныг илэрхийлнэ:
| Оператор | Жишээ | a | b | Үр дүн |
|---|---|---|---|---|
| + (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 |
Дараалсан нөхцөлүүдийг давах
Та бүх холбогдох хариултуудын нийлбэрийг үзүүлэхийг хүсч байна гэе. Та {sum(q1,q2,q3,...,qN)} тэгшитгэлийг ашиглаж үзэж болно. Гэвч энэ нь дотооддоо LEMif(LEManyNA("q1","q2","q3",...,"qN"),"",sum(LEMval("q1"),LEMval("q2"),LEMval("q3"),...,LEMval("qN"))) болж хөрвөнө. Тиймээс q1-qN утгуудын аль нэг нь холбогдолгүй бол тэгшитгэл үргэлж false буцаана. Энэ тохиолдолд sum() нь бүх асуултад хариулах хүртэл "0" гэж харуулна.
Үүнийг тойрохын тулд хувьсагч бүрт ".NAOK" дагавар (Not Applicable is OK буюу холбогдолгүй байж болно гэсэн утгатай) нэмж болно. Ингэснээр дараах байдлаар ажиллана. Танд q1.NAOK хувьсагч байна гэе:
- q1 нь LEManyNA() хэсэгт нэмэгдэхгүй
- LEMval('q1') нь хариулт холбогдолтой эсэхийг үргэлжлүүлэн шалгах бөгөөд холбогдолгүй бол "" буцаана (тиймээс холбогдолгүй хариултууд тус тусдаа үл тооцогдох боловч бүх илэрхийллийг хүчингүй болгохгүй).
Иймд нийлбэрийн асуудлыг шийдэх арга бол sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK) тэгшитгэлийг ашиглах явдал юм.
.NAOK дагаврыг ашигласнаар зохиогчид хэд хэдэн боломжит замтай боловч дараа нь нийтлэг замд нийлдэг судалгаа зохиох боломжтой болно. Жишээлбэл, оролцогчид судалгаанд хариултын хэвийн мужаас гадуур хариулсан гэе. Зохиогч оролцогчдод зөв үр дүн гарахгүй байж болзошгүйг сануулж, судалгааг үнэхээр үргэлжлүүлэхийг хүсч байгаа эсэхийг асууж болно. Хэрэв тэд "Тийм" гэж хариулбал үлдсэн асуултууд харагдана. "Үлдсэн асуултууд"-ын нөхцөл нь анхны хариултууд хэвийн мужид байсан ЭСВЭЛ хэвийн мужаас гадуур хариулсан тохиолдолд л холбогдох асуултад оролцогч "Тийм" гэж хариулсан эсэхийг шалгана.
ExpressionScript нөхцөлт микро-тохируулгыг хэрхэн дэмждэг вэ?
Микро-тохируулгын жишээ энд байна (Question Type=='expr' нь Тэгшитгэл гэсэн утгатай):
| Асуултын код | Холбогдол | Асуултын төрөл | Асуулт |
|---|---|---|---|
| name | 1 | text | Таны нэр хэн бэ? |
| age | 1 | text | Та хэдэн настай вэ? |
| badage | !is_empty(age) | expr | {(age<16) or (age>80)} |
| agestop | badage | message | Уучлаарай, {name}, та энэ тестэд хэт {if( (age<16),'залуу',if( (age>80),'настай','дундаж настай') ) } байна. |
| kids | !badage | yesno | Танд хүүхэд байгаа юу? |
| parents | 1 | expr | {!badage && kids=='Y'} |
| numKids | parents | text | Танд хэдэн хүүхэд байгаа вэ? |
| kid1 | parents && numKids >= 1 | text | Таны анхны хүүхэд хэдэн настай вэ? |
| kid2 | parents && numKids >= 2 | text | Таны хоёр дахь хүүхэд хэдэн настай вэ? |
| kid3 | parents && numKids >= 3 | text | Таны гурав дахь хүүхэд хэдэн настай вэ? |
| kid4 | parents && numKids >= 4 | text | Таны дөрөв дэх хүүхэд хэдэн настай вэ? |
| kid5 | parents && numKids >= 5 | text | Таны тав дахь хүүхэд хэдэн настай вэ? |
| sumage | 1 | expr | {sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |
| report | parents | text | {name}, та {age} настай бөгөөд {numKids} хүүхэдтэй гэж хэллээ. Таны эхний {min(numKids,5)} хүүхдийн насны нийлбэр {sumage} байна |
Дээрх судалгааны жишээг татаж авахын тулд дараах холбоос дээр дарна уу: Хүүхдийн тоотой судалгааны жишээ.
Эдгээр бүх асуултыг нэг хуудсан дээр (жишээ нь нэг бүлэгт) байрлуулж болох бөгөөд зөвхөн холбогдох асуултууд харагдана. Түүнчлэн хүүхдүүдийн насыг оруулах үед сүүлийн асуулт доторх sum() илэрхийлэл динамикаар шинэчлэгдэнэ.
ExpressionScript энэ боломжийг илэрхийлэл бүрийг нэртэй <span> элементээр хүрээлж өгөх замаар хангадаг. Утга өөрчлөгдөх бүрт тухайн <span> элемент дотор харагдах ёстой илэрхийллийг дахин тооцоолж, дэлгэцийг шинэчилдэг. Нэг хуудсан дээр ийм тохируулсан олон арван, бүр олон зуун илэрхийлэл байж болно.
Өгүүлбэр зүйн тодруулга
Илэрхийллийг оруулах болон шалгахад туслахын тулд EM нь дараах онцлогуудтай өгүүлбэр зүйн тодруулгыг хангадаг:
Өгүүлбэр зүйн тодруулгын төрөл ба утга
| Өнгө | Жишээ | Утга | Зөвлөмж мэдээлэл | Тайлбар |
|---|---|---|---|---|
| tan background | Sample | бүх тэгшитгэл | байхгүй | Тэгшитгэл гэж танигдсан буржгар хаалт доторх бүх зүйл (жишээ нь эхэнд эсвэл төгсгөлд хоосон зай байхгүй) нь эргэн тойрны текстээс ялгахын тулд шаргал дэвсгэр өнгөөр тодрогдоно |
| bold red text | Sample | Алдаа | Алдааны тухай тайлбар | Үл мэдэгдэх хувьсагч эсвэл функц доторх алдаа байж болно. Судалгаа эвдэрсэн бөгөөд тухайн илэрхийлэлд тулгуурласан асуултууд хариулагчдад харагдахгүй. |
| blue text | Sample | функцийн нэр | утга болон зөвшөөрөгдөх өгүүлбэр зүй | Функцийн нэр эсвэл нээлттэй хаалтаар үргэлжилж буй тул функц байх ёстой зүйлсийг илэрхийлнэ. Тэдгээр нь тод цэнхэр өнгөөр харагдана. Зөвлөмж мэдээлэл нь функцийн утга болон зөвшөөрөгдөх өгүүлбэр зүйг харуулна. |
| grey text | Sample | тэмдэгт мөр | байхгүй | Нэг болон давхар хашилттай тэмдэгт мөрүүд саарал өнгөөр харагдана. |
| cyan text | Sample | ижил хуудсан дээр тохируулсан хувьсагч, | [name]: асуулт; утга; утга бүрийн кодыг харуулсан хариултын жагсаалт | Таны одоо засварлаж буй асуулттай ижил хуудсан дээр тохируулсан аливаа хувьсагч цэнхэрдүү өнгөөр харагдана (үүнийг javascript-ээр шинэчилж болно). Зөвлөмж мэдээлэл нь түүний нэр, бодит асуулт, одоогийн утгыг (тохируулаагүй бол хоосон) харуулна. Хэрэв асуултын төрөл тоолсон утгын олонлогоос хариулт хүлээдэг бол кодуудыг харуулах утгуудтай харгалзуулсан жагсаалт харагдана. |
| green text | Sample | өмнөх хуудсан дээр тохируулсан хувьсагч | [name]: асуулт; утга; утга бүрийн кодыг харуулсан хариултын жагсаалт | Өмнөх хуудсан дээр тохируулсан аливаа хувьсагч тод ногоон өнгөөр харагдана. Зөвлөмж мэдээлэл нь түүний нэр, бодит асуулт, одоогийн утгыг (тохируулаагүй бол хоосон) харуулна. Хэрэв асуултын төрөл тоолсон утгын олонлогоос хариулт хүлээдэг бол кодуудыг харуулах утгуудтай харгалзуулсан жагсаалт харагдана. |
| bold pink text | Sample | дараагийн хуудсан дээр тохируулсан хувьсагч ерөнхийдөө: судалгааны эхэнд хоосон байх боловч индекс эсвэл өмнөх рүү шилжих үед дүүрч болно | [name эсвэл SGQA код]: асуулт; утга; утга бүрийн кодыг харуулсан хариултын жагсаалт | Дараагийн хуудсан дээр тохируулсан аливаа хувьсагч тод ягаан өнгөөр харагдана. Зөвлөмж мэдээлэл нь түүний нэр, бодит асуулт, одоогийн утгыг (тохируулаагүй бол хоосон) харуулна. Хэрэв асуултын төрөл тоолсон утгын олонлогоос хариулт хүлээдэг бол кодуудыг харуулах утгуудтай харгалзуулсан жагсаалт харагдана. |
| bold tan text | Sample | lime replacement утга | утга | Lime Replacement Strings ({TOKEN:xxx}, {PRIVACY_MESSAGE} гэх мэт) тод шаргал хүрэн өнгөөр харагдана. |
| red text | Sample | онооих оператор (=) | анхааруулах мессеж | Хэрэв та онооих операторуудын нэгийг (=) ашиглавал тэр оператор улаан өнгөөр харагдана. Энэ нь a == b эсэхийг шалгах гэсэн байтал a = b гэж утга оноохоос санамсаргүйгээр сэргийлэхэд зориулагдсан. |
| normal black text | Sample | тэмдэгтүүд | байхгүй | Илэрхийлэл доторх бусад бүх тэмдэгтүүд энгийн хар өнгөөр харагдана. |
| red-boxed text | тод улаан шугам алдааг хүрээлнэ | өгүүлбэр зүйн алдаа | алдааны тайлбар | Илрүүлсэн бүх өгүүлбэр зүйн алдаа улаан хүрээн дотор харагдана. Зөвлөмж мэдээлэл нь алдааг харуулна. Жишээнд хаагдаагүй хаалт, тодорхойлогдоогүй функц ашиглах, функцэд буруу тооны аргумент дамжуулах, муу бүтэцтэй илэрхийлэл (жишээ нь хувьсагчдын хооронд оператор дутуу), зөвхөн унших хувьсагчид шинэ утга оноохыг оролдох, хувьсагч бус зүйлд утга оноохыг оролдох эсвэл ямар нэгэн дэмжлэггүй өгүүлбэр зүй ашиглах орно. Өгүүлбэр зүйн алдаа илрүүлэх систем нь олон алдаа байсан ч илэрхийлэл дэх зөвхөн нэг алдааг мэдээлж болохыг анхаарна уу; гэхдээ ямар нэг алдаа илрсэн бол дор хаяж нэг алдаа харагдана. |
Нэмэлт унших материал
ExpressionScript-ийн жишээ судалгаанууд
Хэрэглээний тохиолдол ба зааварчилгаа
Алхам алхмаар жишээнүүд
Хөгжүүлэгчдэд зориулсан лавлах