LimeSurvey Manual
Menu
Navigation
Main page
Recent changes
Help
Special pages
Printable version
Recent changes
Help
English
Log in to Manual
Login
Log in to your account
English
Log in to Manual
Get started for free
Sign up
Actions
Translate
Language statistics
Message group statistics
Export
Special
Export translations
Settings
Group
Activating a survey
Adding answers or subquestions
Administering LimeSurvey
Alternatives to the LimeSurvey import function
Assessments
Backup entire database
Batch deletion
Category:Advanced Question Settings
Category:General Question Options
Category:Question Settings
Central Participant Database
Changing an active survey
Check data integrity
Check question logic
Check survey logic - Advanced
Closing a survey
ComfortUpdate
Copy question
Custom translation
Data encryption
Data entry
Data policy settings
DateFunctions
Default answers
Delete question
Delete survey
Display/Export survey
Edit question
Email bounce tracking system
Email templates
Export question
Export responses
Exporting results
Expression Manager
Expression Manager sample surveys
ExpressionScript - Presentation
ExpressionScript Engine - Quick start guide
ExpressionScript examples
ExpressionScript How-tos
ExpressionScript sample surveys
Extension compatibility
Failed email notifications
First login - your user preferences
General FAQ
General settings
Getting started
Global settings
Google API howto
Home page settings
How to design a good survey (guide)
Import responses
Importing a survey
Installation - LimeSurvey CE
Installation FAQ
Installation of the LimeSurvey XAMPP package
Installation security hints
Installation using a command line interface (CLI)
Installation Version 1.92 or older
Iterate survey
Label sets
LDAP settings
License
LimeSurvey Manual
LimeSurvey PRO vs LimeSurvey CE
LimeSurvey Users
LimeSurvey Video-Tutorial
LimeSurvey-compatible hosting companies
List question groups
List questions
Localization
Major version upgrade
Make your plugin compatible with LS4
Manage user groups
Manage users
Menu configuration
Menu entries configuration
Multilingual survey
New Template System in LS3.x
Not categorized and advanced features
Notifications & data
Optional settings
Overview
Panel integration
Participant settings
Plugin manager
Plugin menu
Plugins - advanced
Presentation
Preview function
Problems & solutions
Publication & access
QS:Allowed filetypes
QS:Alphasort
QS:Answer width
QS:Array filter
QS:Array filter exclude
QS:Array filter style
QS:Assessment value
QS:Autocheck exclusive option
QS:Category separator
QS:Chart type
QS:Choice column width
QS:Choice header
QS:Code filter
QS:Commented checkbox
QS:CSS Class
QS:Date max
QS:Date min
QS:Date time format
QS:Display chart
QS:Display columns
QS:Display map
QS:Display rows
QS:Display type
QS:Dropdown dates
QS:Dropdown dates year max
QS:Dropdown dates year min
QS:Dropdown prefix
QS:Dropdown prepostfix
QS:Dropdown separators
QS:Dropdown size
QS:Dualscale headerA
QS:Dualscale headerB
QS:Em validation q
QS:Em validation q tip
QS:Em validation sq
QS:Em validation sq tip
QS:Encryption
QS:Equals num value
QS:Equation
QS:Exclusive option
QS:Get order previous q
QS:Hidden
QS:Hide tip
QS:Input box size
QS:Input boxes
QS:Input max characters
QS:Label column width
QS:Location city
QS:Location country
QS:Location defaultcoordinates
QS:Location mapheight
QS:Location mapservice
QS:Location mapwidth
QS:Location mapzoom
QS:Location nodefaultfromip
QS:Location postal
QS:Location state
QS:Mandatory
QS:Max answers
QS:Max filesize
QS:Max num value
QS:Max num value n
QS:Max num value sgqa
QS:Max subquestions
QS:Maximum chars
QS:Maximum number of files
QS:Min answers
QS:Min num value
QS:Min num value n
QS:Minimum number of files
QS:Minute step interval
QS:Month display style
QS:Multiflexible checkbox
QS:Multiflexible max
QS:Multiflexible min
QS:Multiflexible step
QS:Num value int only
QS:Numbers only
QS:Other
QS:Other comment mandatory
QS:Other numbers only
QS:Other Position
QS:Other replace text
QS:Page break
QS:Prefix
QS:Preg validation
QS:Printable survey relevance help
QS:Public statistics
QS:Question theme
QS:Random group
QS:Random order
QS:Rank header
QS:Relevance
QS:Remove text or uncheck checkbox
QS:Repeat headers
QS:Reverse
QS:Samechoiceheight
QS:Samelistheight
QS:Scale export
QS:Show comment
QS:Show grand total
QS:Show title
QS:Show totals
QS:Showpopups
QS:Slider accuracy
QS:Slider default
QS:Slider handle shape
QS:Slider handle Unicode shape
QS:Slider initial value
QS:Slider layout
QS:Slider max
QS:Slider middlestart
QS:Slider min
QS:Slider orientation
QS:Slider rating
QS:Slider reset
QS:Slider reverse
QS:Slider separator
QS:Slider showminmax
QS:Subquestion width
QS:Suffix
QS:Text input width
QS:Theme editor - advanced options
QS:Time limit
QS:Time limit action
QS:Time limit countdown message
QS:Time limit disable next
QS:Time limit disable prev
QS:Time limit message
QS:Time limit message delay
QS:Time limit message style
QS:Time limit timer style
QS:Time limit warning
QS:Time limit warning display time
QS:Time limit warning message
QS:Time limit warning style
QS:Use dropdown
QS:Value range allows missing
Question groups - introduction
Question toolbar options
Question type - 5 point choice
Question type - Array
Question type - Array (10 point choice)
Question type - Array (5 point choice)
Question type - Array (Increase-Same-Decrease)
Question type - Array (Numbers)
Question type - Array (Texts)
Question type - Array (Yes-No-Uncertain)
Question type - Array by column
Question type - Array dual scale
Question type - Date
Question type - Equation
Question type - File upload
Question type - Gender
Question type - Huge free text
Question type - Language switch
Question type - List (Dropdown)
Question type - List (Radio)
Question type - List with comment
Question type - Long free text
Question type - Multiple choice
Question type - Multiple choice with comments
Question type - Multiple numerical input
Question type - Multiple short text
Question type - Numerical input
Question type - Ranking
Question type - Short free text
Question type - Text display
Question type - Yes-No
Question types
Questions - introduction
QueXML PDF Export
Quick start guide - LimeSurvey 2.50+
Quick start guide - LimeSurvey 3.0+
Quick-translation
Regenerate question codes
Reorder questions and question groups
Reset conditions
Resources
Responses & statistics
Responses (survey results)
Running a survey safely
Setting conditions
SGQA identifier
Statistics
Survey group permissions
Survey menu
Survey participants
Survey permissions
Survey quotas
Survey settings
Survey settings version 2
Survey structure
Survey toolbar options
Surveys - introduction
Surveys - management
Tab Separated Value survey structure
Template:Deprecated
Template:DeprecatedIn
Template:Example
Template:FeatureChange
Template:FeatureStarting
Template:Hint
Template:NewIn
Template:UpdatedIn
Testing a survey
Text elements
Theme editor
Theme options
Themes
Timing statistics
Tools
Transferring an installation
Translating LimeSurvey
Troubleshooting
TwoFactorAdminLogin
Upgrading from a previous version
URL fields
Using regular expressions
Version change log
Version guide
View saved but not submitted responses
Workarounds
Language
aa - Afar
aae - Arbëresh
ab - Abkhazian
abs - Ambonese Malay
ace - Achinese
acm - Iraqi Arabic
ady - Adyghe
ady-cyrl - Adyghe (Cyrillic script)
aeb - Tunisian Arabic
aeb-arab - Tunisian Arabic (Arabic script)
aeb-latn - Tunisian Arabic (Latin script)
af - Afrikaans
aln - Gheg Albanian
alt - Southern Altai
am - Amharic
ami - Amis
an - Aragonese
ang - Old English
ann - Obolo
anp - Angika
ar - Arabic
arc - Aramaic
arn - Mapuche
arq - Algerian Arabic
ary - Moroccan Arabic
arz - Egyptian Arabic
as - Assamese
ase - American Sign Language
ast - Asturian
atj - Atikamekw
av - Avaric
avk - Kotava
awa - Awadhi
ay - Aymara
az - Azerbaijani
azb - South Azerbaijani
ba - Bashkir
ban - Balinese
ban-bali - Balinese (Balinese script)
bar - Bavarian
bbc - Batak Toba
bbc-latn - Batak Toba (Latin script)
bcc - Southern Balochi
bci - Baoulé
bcl - Central Bikol
bdr - West Coast Bajau
be - Belarusian
be-tarask - Belarusian (Taraškievica orthography)
bew - Betawi
bg - Bulgarian
bgn - Western Balochi
bh - Bhojpuri
bho - Bhojpuri
bi - Bislama
bjn - Banjar
blk - Pa'O
bm - Bambara
bn - Bangla
bo - Tibetan
bpy - Bishnupriya
bqi - Bakhtiari
br - Breton
brh - Brahui
bs - Bosnian
btm - Batak Mandailing
bto - Iriga Bicolano
bug - Buginese
bxr - Russia Buriat
ca - Catalan
cbk-zam - Chavacano
cdo - Mindong
ce - Chechen
ceb - Cebuano
ch - Chamorro
chn - Chinook Jargon
cho - Choctaw
chr - Cherokee
chy - Cheyenne
ckb - Central Kurdish
co - Corsican
cps - Capiznon
cpx - Pu–Xian Min
cpx-hans - Pu–Xian Min (Simplified Han script)
cpx-hant - Pu–Xian Min (Traditional Han script)
cpx-latn - Pu–Xian Min (Latin script)
cr - Cree
crh - Crimean Tatar
crh-cyrl - Crimean Tatar (Cyrillic script)
crh-latn - Crimean Tatar (Latin script)
crh-ro - Dobrujan Tatar
cs - Czech
csb - Kashubian
cu - Church Slavic
cv - Chuvash
cy - Welsh
da - Danish
dag - Dagbani
de - German
de-at - Austrian German
de-ch - Swiss High German
de-formal - German (formal address)
dga - Dagaare
din - Dinka
diq - Zazaki
dsb - Lower Sorbian
dtp - Central Dusun
dty - Doteli
dv - Divehi
dz - Dzongkha
ee - Ewe
efi - Efik
egl - Emilian
el - Greek
eml - Emiliano-Romagnolo
en - English
en-ca - Canadian English
en-gb - British English
eo - Esperanto
es - Spanish
es-419 - Latin American Spanish
es-formal - Spanish (formal address)
et - Estonian
eu - Basque
ext - Extremaduran
fa - Persian
fat - Fanti
ff - Fula
fi - Finnish
fit - Tornedalen Finnish
fj - Fijian
fo - Faroese
fon - Fon
fr - French
frc - Cajun French
frp - Arpitan
frr - Northern Frisian
fur - Friulian
fy - Western Frisian
ga - Irish
gaa - Ga
gag - Gagauz
gan - Gan
gan-hans - Gan (Simplified Han script)
gan-hant - Gan (Traditional Han script)
gcf - Guadeloupean Creole
gcr - Guianan Creole
gd - Scottish Gaelic
gl - Galician
gld - Nanai
glk - Gilaki
gn - Guarani
gom - Goan Konkani
gom-deva - Goan Konkani (Devanagari script)
gom-latn - Goan Konkani (Latin script)
gor - Gorontalo
got - Gothic
gpe - Ghanaian Pidgin
grc - Ancient Greek
gsw - Alemannic
gu - Gujarati
guc - Wayuu
gur - Frafra
guw - Gun
gv - Manx
ha - Hausa
hak - Hakka Chinese
haw - Hawaiian
he - Hebrew
hi - Hindi
hif - Fiji Hindi
hif-latn - Fiji Hindi (Latin script)
hil - Hiligaynon
hno - Northern Hindko
ho - Hiri Motu
hr - Croatian
hrx - Hunsrik
hsb - Upper Sorbian
hsn - Xiang
ht - Haitian Creole
hu - Hungarian
hu-formal - Hungarian (formal address)
hy - Armenian
hyw - Western Armenian
hz - Herero
ia - Interlingua
ibb - Ibibio
id - Indonesian
ie - Interlingue
ig - Igbo
igl - Igala
ii - Sichuan Yi
ik - Inupiaq
ike-cans - Eastern Canadian (Aboriginal syllabics)
ike-latn - Eastern Canadian (Latin script)
ilo - Iloko
inh - Ingush
io - Ido
is - Icelandic
it - Italian
iu - Inuktitut
ja - Japanese
jam - Jamaican Creole English
jbo - Lojban
jut - Jutish
jv - Javanese
ka - Georgian
kaa - Kara-Kalpak
kab - Kabyle
kai - Karekare
kbd - Kabardian
kbd-cyrl - Kabardian (Cyrillic script)
kbp - Kabiye
kcg - Tyap
kea - Kabuverdianu
kg - Kongo
kge - Komering
khw - Khowar
ki - Kikuyu
kiu - Kirmanjki
kj - Kuanyama
kjh - Khakas
kjp - Eastern Pwo
kk - Kazakh
kk-arab - Kazakh (Arabic script)
kk-cn - Kazakh (China)
kk-cyrl - Kazakh (Cyrillic script)
kk-kz - Kazakh (Kazakhstan)
kk-latn - Kazakh (Latin script)
kk-tr - Kazakh (Turkey)
kl - Kalaallisut
km - Khmer
kn - Kannada
ko - Korean
ko-kp - Korean (North Korea)
koi - Komi-Permyak
kr - Kanuri
krc - Karachay-Balkar
kri - Krio
krj - Kinaray-a
krl - Karelian
ks - Kashmiri
ks-arab - Kashmiri (Arabic script)
ks-deva - Kashmiri (Devanagari script)
ksh - Colognian
ksw - S'gaw Karen
ku - Kurdish
ku-arab - Kurdish (Arabic script)
ku-latn - Kurdish (Latin script)
kum - Kumyk
kus - Kʋsaal
kv - Komi
kw - Cornish
ky - Kyrgyz
la - Latin
lad - Ladino
lb - Luxembourgish
lbe - Lak
lez - Lezghian
lfn - Lingua Franca Nova
lg - Ganda
li - Limburgish
lij - Ligurian
liv - Livonian
lki - Laki
lld - Ladin
lmo - Lombard
ln - Lingala
lo - Lao
loz - Lozi
lrc - Northern Luri
lt - Lithuanian
ltg - Latgalian
lus - Mizo
luz - Southern Luri
lv - Latvian
lzh - Literary Chinese
lzz - Laz
mad - Madurese
mag - Magahi
mai - Maithili
map-bms - Basa Banyumasan
mdf - Moksha
mg - Malagasy
mh - Marshallese
mhr - Eastern Mari
mi - Māori
min - Minangkabau
mk - Macedonian
ml - Malayalam
mn - Mongolian
mnc - Manchu
mnc-latn - Manchu (Latin script)
mnc-mong - Manchu (Mongolian script)
mni - Manipuri
mnw - Mon
mo - Moldovan
mos - Mossi
mr - Marathi
mrh - Mara
mrj - Western Mari
ms - Malay
ms-arab - Malay (Jawi script)
mt - Maltese
mus - Muscogee
mwl - Mirandese
my - Burmese
myv - Erzya
mzn - Mazanderani
na - Nauru
nah - Nāhuatl
nan - Minnan
nap - Neapolitan
nb - Norwegian Bokmål
nds - Low German
nds-nl - Low Saxon
ne - Nepali
new - Newari
ng - Ndonga
nia - Nias
nit - కొలామి
niu - Niuean
nl - Dutch
nl-informal - Dutch (informal address)
nmz - Nawdm
nn - Norwegian Nynorsk
no - Norwegian
nod - Northern Thai
nog - Nogai
nov - Novial
nqo - N’Ko
nrm - Norman
nso - Northern Sotho
nv - Navajo
ny - Nyanja
nyn - Nyankole
nyo - Nyoro
nys - Nyungar
oc - Occitan
ojb - Northwestern Ojibwa
olo - Livvi-Karelian
om - Oromo
or - Odia
os - Ossetic
pa - Punjabi
pag - Pangasinan
pam - Pampanga
pap - Papiamento
pcd - Picard
pcm - Nigerian Pidgin
pdc - Pennsylvania German
pdt - Plautdietsch
pfl - Palatine German
pi - Pali
pih - Norfuk / Pitkern
pl - Polish
pms - Piedmontese
pnb - Western Punjabi
pnt - Pontic
prg - Prussian
ps - Pashto
pt - Portuguese
pt-br - Brazilian Portuguese
pwn - Paiwan
qu - Quechua
qug - Chimborazo Highland Quichua
rgn - Romagnol
rif - Riffian
rki - Arakanese
rm - Romansh
rmc - Carpathian Romani
rmy - Vlax Romani
rn - Rundi
ro - Romanian
roa-tara - Tarantino
rsk - Pannonian Rusyn
ru - Russian
rue - Rusyn
rup - Aromanian
ruq - Megleno-Romanian
ruq-cyrl - Megleno-Romanian (Cyrillic script)
ruq-latn - Megleno-Romanian (Latin script)
rut - Rutul
rw - Kinyarwanda
ryu - Okinawan
sa - Sanskrit
sah - Yakut
sat - Santali
sc - Sardinian
scn - Sicilian
sco - Scots
sd - Sindhi
sdc - Sassarese Sardinian
sdh - Southern Kurdish
se - Northern Sami
se-fi - Northern Sami (Finland)
se-no - Northern Sami (Norway)
se-se - Northern Sami (Sweden)
sei - Seri
ses - Koyraboro Senni
sg - Sango
sgs - Samogitian
sh - Serbo-Croatian
sh-cyrl - Serbo-Croatian (Cyrillic script)
sh-latn - Serbo-Croatian (Latin script)
shi - Tachelhit
shi-latn - Tachelhit (Latin script)
shi-tfng - Tachelhit (Tifinagh script)
shn - Shan
shy - Shawiya
shy-latn - Shawiya (Latin script)
si - Sinhala
simple - Simple English
sjd - Kildin Sami
sje - Pite Sami
sk - Slovak
skr - Saraiki
skr-arab - Saraiki (Arabic script)
sl - Slovenian
sli - Lower Silesian
sm - Samoan
sma - Southern Sami
smn - Inari Sami
sms - Skolt Sami
sn - Shona
so - Somali
sq - Albanian
sr - Serbian
sr-ec - Serbian (Cyrillic script)
sr-el - Serbian (Latin script)
srn - Sranan Tongo
sro - Campidanese Sardinian
ss - Swati
st - Southern Sotho
stq - Saterland Frisian
sty - Siberian Tatar
su - Sundanese
sv - Swedish
sw - Swahili
syl - Sylheti
szl - Silesian
szy - Sakizaya
ta - Tamil
tay - Tayal
tcy - Tulu
tdd - Tai Nuea
te - Telugu
tet - Tetum
tg - Tajik
tg-cyrl - Tajik (Cyrillic script)
tg-latn - Tajik (Latin script)
th - Thai
ti - Tigrinya
tk - Turkmen
tl - Tagalog
tly - Talysh
tly-cyrl - Talysh (Cyrillic script)
tn - Tswana
to - Tongan
tok - Toki Pona
tpi - Tok Pisin
tr - Turkish
tru - Turoyo
trv - Taroko
ts - Tsonga
tt - Tatar
tt-cyrl - Tatar (Cyrillic script)
tt-latn - Tatar (Latin script)
ttj - Tooro
tum - Tumbuka
tw - Twi
ty - Tahitian
tyv - Tuvinian
tzm - Central Atlas Tamazight
udm - Udmurt
ug - Uyghur
ug-arab - Uyghur (Arabic script)
ug-latn - Uyghur (Latin script)
uk - Ukrainian
ur - Urdu
uz - Uzbek
uz-cyrl - Uzbek (Cyrillic script)
uz-latn - Uzbek (Latin script)
ve - Venda
vec - Venetian
vep - Veps
vi - Vietnamese
vls - West Flemish
vmf - Main-Franconian
vmw - Makhuwa
vo - Volapük
vot - Votic
vro - Võro
wa - Walloon
wal - Wolaytta
war - Waray
wls - Wallisian
wo - Wolof
wuu - Wu
wuu-hans - Wu (Simplified Han script)
wuu-hant - Wu (Traditional Han script)
xal - Kalmyk
xh - Xhosa
xmf - Mingrelian
xsy - Saisiyat
yi - Yiddish
yo - Yoruba
yrl - Nheengatu
yue - Cantonese
yue-hans - Cantonese (Simplified Han script)
yue-hant - Cantonese (Traditional Han script)
za - Zhuang
zea - Zeelandic
zgh - Standard Moroccan Tamazight
zh - Chinese
zh-cn - Chinese (China)
zh-hans - Simplified Chinese
zh-hant - Traditional Chinese
zh-hk - Chinese (Hong Kong)
zh-mo - Chinese (Macau)
zh-my - Chinese (Malaysia)
zh-sg - Chinese (Singapore)
zh-tw - Chinese (Taiwan)
zu - Zulu
Format
Export for off-line translation
Export in native format
Export in CSV format
Fetch
{{DISPLAYTITLE:Trình quản lý biểu thức}}<languages /> __TOC__ <div class="simplebox">Lưu ý: Tính năng này chỉ khả dụng trong LimeSurvey 1.92 trở lên.</div> <span id="Quick_Start_Tutorial"></span> =Hướng dẫn bắt đầu nhanh= <span id="Overview"></span> ==Tổng quan== Khi tùy chỉnh khảo sát của mình, bạn thường cần một cách để chỉ định những điều sau: #'''Điều hướng/Phân nhánh''' - để câu trả lời của chủ đề thay đổi thứ tự đặt câu hỏi #'''Tailoring/ Piping''' - cách diễn đạt câu hỏi (chẳng hạn như đề cập đến các câu trả lời trước đó hoặc cách chia các câu dựa trên số lượng hoặc giới tính của chủ đề của bạn) hoặc cách tạo báo cáo tùy chỉnh (như điểm đánh giá hoặc lời khuyên phù hợp). #'''Xác thực''' - đảm bảo rằng các câu trả lời vượt qua các tiêu chí nhất định, như giá trị tối thiểu và tối đa hoặc khớp với mẫu đầu vào Trình quản lý biểu thức (EM) cung cấp một cách trực quan để chỉ định logic cho từng tính năng đó. Gần như mọi thứ bạn có thể viết dưới dạng phương trình toán học tiêu chuẩn đều là biểu thức hợp lệ, ngay cả khi bạn đang gọi hàm. EM hiện cung cấp quyền truy cập vào 80 chức năng và có thể dễ dàng mở rộng để hỗ trợ nhiều hơn. Nó cũng cho phép bạn truy cập các biến của mình bằng cách sử dụng tên biến mà con người có thể đọc được (chứ không phải tên SGQA). Các phần sau đây hiển thị những vị trí chính nơi Trình quản lý biểu thức được sử dụng <span id="Relevance_(Controlling_Navigation/Branching)"></span> ==Mức độ liên quan (Kiểm soát điều hướng/phân nhánh)== Một số khảo sát sử dụng "Goto Logic", chẳng hạn như nếu bạn trả lời Câu hỏi 1 với tùy chọn C thì sẽ chuyển sang Câu hỏi 5. Cách tiếp cận này rất hạn chế vì khó xác thực và dễ bị hỏng khi bạn phải sắp xếp lại các câu hỏi. EM sử dụng phương trình liên quan Boolean để chỉ định tất cả các điều kiện mà theo đó một câu hỏi có thể hợp lệ. Nếu câu hỏi có liên quan thì câu hỏi đó sẽ được hiển thị, nếu không thì câu hỏi đó là Không áp dụng và giá trị NULL được lưu trữ trong cơ sở dữ liệu. Điều này tương tự với những gì có thể được thực hiện thông qua trình soạn thảo Điều kiện, nhưng EM cho phép bạn dễ dàng chỉ định các tiêu chí phức tạp và mạnh mẽ hơn nhiều (và cho phép bạn sử dụng tên biến thay vì đặt tên SGQA). Hình ảnh này cho thấy một cách để xem lại logic liên quan của một cuộc khảo sát. Nó tính toán chỉ số khối cơ thể. Phương trình liên quan được hiển thị trong dấu ngoặc vuông ngay sau tên biến (có màu xanh lục). Vì vậy, mức độ liên quan của cân nặng, trọng lượng_đơn vị, chiều cao và chiều cao_đơn vị đều bằng 1, nghĩa là những câu hỏi đó luôn được đặt ra. Tuy nhiên, mức độ liên quan của BMI là {!is_empty(height) và !is_empty(weight)}, nghĩa là BMI sẽ chỉ được tính nếu đối tượng nhập giá trị cho cả chiều cao và cân nặng (do đó tránh nguy cơ chia cho 0 lỗi). Ngoài ra, câu hỏi Báo cáo chỉ được hiển thị nếu đối tượng trả lời cả bốn câu hỏi chính (chiều cao, đơn vị chiều cao, cân nặng, đơn vị cân nặng). [[File:tutorial1.jpg]] Mức độ liên quan được hiển thị và có thể chỉnh sửa ở những nơi sau: <span id="Viewing_/_Editing_Question-Level_Relevance"></span> ===Xem/Chỉnh sửa Mức độ liên quan ở cấp độ câu hỏi=== Phương trình này tính toán Chỉ số khối cơ thể (BMI). Người ta chỉ hỏi liệu người đó có nhập chiều cao và cân nặng của họ lần đầu tiên hay không. [[File:tutorial2.jpg]] Đây là màn hình chỉnh sửa câu hỏi BMI. [[File:tutorial3.jpg]] Lưu ý rằng bạn không sử dụng dấu ngoặc nhọn khi nhập Phương trình liên quan. <span id="Viewing_/_Editing_Group-Level_Relevance"></span> ===Xem / Chỉnh sửa Mức độ liên quan ở cấp độ nhóm=== Đây là một cuộc khảo sát điều tra dân số mẫu. Trang đầu tiên hỏi có bao nhiêu người sống cùng bạn và lưu số liệu đó vào biến "cohabs". Trang này chỉ được hiển thị nếu bạn có nhiều hơn một người sống chung (vì vậy nó được hiển thị cho người thứ hai sống chung với bạn) và cũng chỉ hiển thị nếu bạn chỉ định Người thứ nhất có liên quan như thế nào với bạn (p1_rel). [[File:tutorial4.jpg]] Như bạn có thể thấy, nhóm cũng có các tiêu chí về mức độ phù hợp ở cấp độ câu hỏi, sao cho mỗi câu hỏi chỉ xuất hiện khi bạn đã trả lời câu hỏi trước đó (ví dụ: {!is_empty(p1_sex)}). EM kết hợp mức độ phù hợp của Nhóm và Cấp độ câu hỏi cho bạn. Các câu hỏi trong một nhóm chỉ được hỏi nếu toàn bộ nhóm có liên quan. Sau đó, chỉ một số câu hỏi trong nhóm có liên quan mới được hỏi. Đây là màn hình để chỉnh sửa mức độ liên quan ở cấp độ nhóm cho câu hỏi đó: [[File:tutorial5.jpg]] Lưu ý rằng bạn không sử dụng dấu ngoặc nhọn khi nhập Phương trình liên quan. <span id="Tailoring/Piping"></span> ==May/Đường ống== EM cho phép bạn dễ dàng thực hiện việc điều chỉnh các câu hỏi có điều kiện đơn giản và phức tạp. Đôi khi bạn chỉ cần thay thế đơn giản, chẳng hạn như nói, "Bạn nói rằng bạn đã mua<nowiki> [</nowiki> Sản phẩm]. Bạn thích điều gì nhất ở nó?". Đôi khi bạn cần sự thay thế có điều kiện như "<nowiki> [</nowiki> Ông bà.]<nowiki> [</nowiki> LastName], bạn có sẵn lòng hoàn thành bản khảo sát của chúng tôi không?". Trong trường hợp này, bạn muốn sử dụng Ông hoặc Bà dựa trên giới tính của người đó. Những lúc khác, bạn thậm chí còn cần sự thay thế phức tạp hơn (chẳng hạn như dựa trên một phép tính toán học) .EM hỗ trợ từng loại đường may/đường ống này. <span id="Conditional_Equations"></span> ===Phương trình có điều kiện=== Ví dụ về Chỉ số khối cơ thể cho thấy khả năng tính toán chỉ số BMI của một người, ngay cả khi cho phép họ nhập chiều cao và cân nặng theo đơn vị hệ mét hoặc phi hệ mét. [[File:tailoring7.jpg]] Ở đây Weight_kg là {if(weight_units == 'kg', trọng lượng, trọng lượng * .453592)}. Hàm if() này có nghĩa là nếu đối tượng nhập trọng lượng bằng kilôgam thì hãy sử dụng giá trị đó, nếu không thì nhân giá trị đã nhập (tính bằng pound) với 0,453592 để chuyển đổi thành kilôgam. Biến Height_m sử dụng cách tiếp cận tương tự để tính chiều cao của một người theo mét, ngay cả khi người đó nhập chiều cao của mình theo inch. BMI tính công thức cân nặng là {weight_kg / (height_m * Height_m)}. Cuối cùng, báo cáo điều chỉnh thông điệp có điều kiện cho phù hợp với chủ đề, cho anh ta biết những gì anh ta đã nhập. ("Bạn nói bạn cao 2 mét và nặng 70 kg.") Mặc dù không được hiển thị rõ ràng trong hình ảnh trên, nhưng Weight_status sử dụng các câu lệnh if() lồng nhau để phân loại một người từ thiếu cân đến béo phì nghiêm trọng. Bạn có thể xem phương trình của nó trong Show Logic View [[File:tailoring8.jpg]] Từ cửa sổ chỉnh sửa cho câu hỏi này, bạn có thể thấy hai điều: #Tailoring phải bao quanh các biểu thức bằng Niềng răng xoăn #Biểu thức có thể trải dài trên nhiều dòng nếu, như trong trường hợp này, bạn muốn làm cho nó dễ đọc hơn logic điều kiện lồng nhau. [[File:tailoring9.jpg]] <span id="Tailored_Questions,_Answers,_and_Reports"></span> ===Câu hỏi, câu trả lời và báo cáo phù hợp=== <div class="simplebox">Lưu ý: Điều chỉnh động có thể không hoạt động nếu các tùy chọn trả lời có sẵn trong các hộp chọn trên cùng một trang câu hỏi. Điều này xuất phát từ thực tế là việc may đo chèn một<nowiki></nowiki> <span>thẻ không hợp lệ bên trong các tùy chọn được chọn.</span> Ví dụ này hiển thị báo cáo BMI. [[File:tailoring10.jpg]] Đây là cửa sổ chỉnh sửa cho cùng một câu hỏi. [[File:tailoring11.jpg]] Như bạn có thể thấy, mọi thứ trong dấu ngoặc nhọn đều được coi là một biểu thức, do đó được đánh dấu theo cú pháp (mã màu) trong hình ảnh trước đó. Nếu bạn mắc bất kỳ lỗi chính tả nào (chẳng hạn như tên hoặc hàm sai chính tả hoặc không xác định), EM sẽ hiển thị lỗi, chẳng hạn như lỗi này, cho thấy rằng Height_unit là tên biến không xác định (thực tế là Height_units) và rnd() là một hàm không xác định (tên hàm thích hợp là round()). Trong cả hai trường hợp, các lỗi đều được bao quanh bởi một hộp màu đỏ để giúp bạn dễ dàng phát hiện và sửa chúng hơn. [[File:tailoring12.jpg]] Bạn cũng có thể thấy rằng bạn có thể nhanh chóng tạo các báo cáo phức tạp, chẳng hạn như bảng giá trị đã nhập hoặc lời khuyên phù hợp. Hãy nhớ rằng tất cả các thao tác chỉnh sửa phải bao quanh các biểu thức bằng Niềng răng xoăn để LimeSurvey biết phần nào của câu hỏi là văn bản tự do và phần nào cần được phân tích cú pháp thông qua Trình quản lý biểu thức. <span id="Validation"></span> ==Xác thực== EM kiểm soát cách hoạt động của hầu hết các tùy chọn câu hỏi nâng cao. Các khía cạnh kiểm soát này như số lượng câu trả lời tối thiểu/tối đa; giá trị riêng lẻ tối thiểu/tối đa; giá trị tổng tối thiểu/tối đa; và kiểm tra xem các giá trị đã nhập có khớp với các mẫu chuỗi đã chỉ định hay không. Bạn tiếp tục nhập các tùy chọn câu hỏi nâng cao đó như bình thường. Tuy nhiên, hiện tại, bất kỳ giá trị nào trong một trong các trường đó đều được coi là một biểu thức, do đó bạn có thể có tiêu chí tối thiểu/tối đa với các mối quan hệ điều kiện phức tạp với các câu hỏi khác. Trong tất cả các trường hợp này, vì tùy chọn câu hỏi nâng cao luôn được coi là một biểu thức nên bạn không sử dụng dấu ngoặc nhọn khi chỉ định nó. Trang [[Khảo sát mẫu Trình quản lý biểu thức|Khảo sát mẫu]] hiển thị nhiều ví dụ hoạt động về cách sử dụng biểu thức để xác thực. <span id="Introduction"></span> =Giới thiệu= LimeSurvey sử dụng mô-đun Trình quản lý biểu thức (EM) mới, cho phép LimeSurvey hỗ trợ phân nhánh, đánh giá, xác thực và điều chỉnh phức tạp hơn. Nó sẽ thay thế cách LimeSurvey quản lý các Thay thế, Điều kiện và Đánh giá ở mặt sau. Nó cũng sẽ tăng tốc độ xử lý đáng kể vì nó loại bỏ hầu hết các lần đọc cơ sở dữ liệu trong thời gian chạy. EM được phát triển bởi Tiến sĩ Thomas White (TMSWhite). Trang wiki này là tài liệu tham khảo chính xác về cú pháp và chức năng của Trình quản lý Biểu thức. ==Định nghĩa chính== #'''Biểu thức''': Bất cứ thứ gì được bao quanh bởi dấu ngoặc nhọn #*Miễn là không có khoảng trắng ngay sau dấu ngoặc nhọn mở hoặc trước dấu ngoặc nhọn đóng #*Nội dung của Biểu thức được EM đánh giá, do đó chúng có thể chứa các công thức toán học, hàm và xử lý chuỗi và ngày phức tạp. #'''Tailoring''': Đôi khi được gọi là "đường ống", đây là quá trình văn bản sửa đổi có điều kiện #*Bạn có quyền truy cập vào tất cả 'trường thay thế', dữ liệu người tham gia và dữ liệu phản hồi. #*Bạn cũng có quyền truy cập dễ dàng hơn vào các câu hỏi, câu trả lời và thuộc tính của chúng. #'' Phương trình 'Mức độ liên quan''': Một thuộc tính câu hỏi mới kiểm soát khả năng hiển thị của câu hỏi #*Nếu có một phương trình liên quan thì câu hỏi chỉ được hiển thị nếu mức độ liên quan được đánh giá là đúng. #*Bên trong, tất cả array_filter và array_filter_exclude các lệnh trở nên phù hợp ở cấp độ câu hỏi phụ #'''Equation''' Loại câu hỏi: Một loại câu hỏi mới lưu các phép tính hoặc báo cáo vào cơ sở dữ liệu #*Nó giống như một câu hỏi Boilerplate, nhưng nội dung của nó được lưu vào cơ sở dữ liệu ngay cả khi bạn đặt "Luôn ẩn câu hỏi này" #'''Mã câu hỏi''': Đây là tên biến ưa thích cho EM #*Đây có thể là tên mô tả cho biết mục đích của câu hỏi , giúp đọc logic phức tạp dễ dàng hơn #*Mã câu hỏi hợp lệ KHÔNG được bắt đầu bằng một số, vì vậy khi sử dụng mã câu hỏi để đánh số câu hỏi của bạn, bạn chỉ cần sử dụng "q1" hoặc "q1a" hoặc "g1q2".! N!#*Đây là tên hiện trở thành tên biến nếu bạn xuất dữ liệu sang SPSS hoặc R, vì vậy nếu bạn thực hiện phân tích thống kê, có thể bạn đã đặt tên biến này là duy nhất. <span id="Do_I_have_to_use_EM?"></span> ==Tôi có phải sử dụng EM không?== Câu trả lời ngắn gọn là Không (nhưng cũng có). EM hoàn toàn tương thích ngược với các khảo sát hiện có. Vì vậy, nếu bạn hài lòng khi sử dụng Điều kiện và Đánh giá theo kiểu mà LimeSurvey đã sử dụng trong các phiên bản <= 1.91+, bạn có thể tiếp tục làm như vậy. Tuy nhiên, EM thay thế hoàn toàn cách LimeSurvey xử lý nội bộ các Điều kiện. Mặc dù bạn vẫn có thể sử dụng Trình chỉnh sửa điều kiện để tạo và quản lý các điều kiện, nhưng LimeSurvey 1.92 sẽ chuyển đổi những điều kiện đó thành Phương trình liên quan tương đương. Là một phần của quá trình nâng cấp, LimeSurvey 1.92 sẽ tự động chuyển đổi tất cả các Điều kiện hiện có thành Phương trình Mức độ liên quan. Điều này sẽ mang lại cho bạn những điều tốt nhất của cả hai thế giới - bạn có thể tiếp tục sử dụng LimeSurvey như bạn đã quen, nhưng sẽ thấy Phương trình mức độ liên quan tương đương để bạn có thể di chuyển dần dần sang Phương trình mức độ liên quan bất cứ khi nào bạn thấy phù hợp. <span id="Can_I_mix_use_of_Conditions_and_Relevance?"></span> ==Tôi có thể kết hợp việc sử dụng Điều kiện và Mức độ liên quan không?== Đúng. Bạn có thể sử dụng trình chỉnh sửa Điều kiện cho một số câu hỏi và trình chỉnh sửa Mức độ liên quan cho các câu hỏi khác. Các điều kiện được tự động chuyển đổi thành Mức độ liên quan khi bạn lưu câu hỏi. Lưu ý, chúng tôi giả định rằng nếu bạn đang sử dụng trình chỉnh sửa Điều kiện thì bạn muốn các Điều kiện đó ghi đè bất kỳ phương trình Mức độ liên quan nào được nhập theo cách thủ công. Vì vậy, nếu bạn đã có Điều kiện và muốn chỉnh sửa Mức độ liên quan theo cách thủ công, trước tiên hãy xóa Điều kiện cho câu hỏi đó. Cụ thể, sao chép phương trình mức độ liên quan đã tạo vào trình soạn thảo văn bản, sử dụng menu Điều kiện để xóa tất cả các điều kiện cho câu hỏi đó (thao tác này cũng sẽ xóa mức độ liên quan), sau đó chỉnh sửa câu hỏi và dán lại phương trình mức độ liên quan đã tạo từ trình soạn thảo văn bản vào trường liên quan cho câu hỏi đó (và lưu câu hỏi). Nếu có đủ nhu cầu xóa các điều kiện mà không xóa phương trình liên quan đã tạo, chúng tôi có thể thêm quy trình chuyển đổi hàng loạt. <span id="How_should_I_choose_between_Conditions_and_Relevance?"></span> ==Tôi nên chọn như thế nào giữa Điều kiện và Mức độ liên quan?== Dưới đây là danh sách ưu và nhược điểm của từng phong cách: {| class="wikitable" !Style!!Ưu điểm!!Nhược điểm |- |Điều kiện||1. GUI đẹp để tạo điều kiện đơn giản<br/> 2. GUI được nhóm hỗ trợ ghi chép đầy đủ và hiểu rõ||1. Chỉ hỗ trợ các so sánh đơn giản và không điều kiện AND/OR tốt<br/> 2. Điều kiện xếp tầng hoạt động thất thường<br/> 3. Chậm - cần nhiều cơ sở dữ liệu, do đó có thể làm chậm các cuộc khảo sát dài<br/> 4. Một số vấn đề được báo cáo với điều kiện tải lại<br/> 5. GUI không mở rộng tốt khi có hàng chục, hàng trăm hoặc hàng nghìn câu hỏi<br/> 6. Có thể chậm chuyển đổi các khảo sát trên giấy vì phải sử dụng tên SGQA<br/> 7. Thường cần một lập trình viên để tùy chỉnh mã logic cần thiết cho việc phân nhánh phức tạp |- |Relevance||1. Hỗ trợ logic rất phức tạp, bao gồm hơn 80 hàm và toán tử/chuỗi<br/> 2. Hỗ trợ hoàn hảo cho logic xếp tầng<br/> 3. Nhanh chóng - không cần gọi thêm cơ sở dữ liệu, do đó hỗ trợ hơn 1000 câu hỏi khảo sát<br/> 4. Không có vấn đề gì khi tải lại logic vì không yêu cầu mã SGQA<br/> 5. Đánh dấu cú pháp theo tỷ lệ cho hơn 1000 khảo sát câu hỏi<br/> 6. Sử dụng dễ dàng và nhanh chóng cho các nhóm muốn tin học hóa các cuộc điều tra trên giấy hiện có.<br/> 7. Dễ dàng hỗ trợ các cuộc phỏng vấn bán cấu trúc và khảo sát dịch tễ học mà không cần người lập trình||1. Không có GUI cho các điều kiện đơn giản - thay vào đó hãy sử dụng tính năng đánh dấu cú pháp<br/> 2. Mới nên nhóm hỗ trợ chưa thành thạo EM. |} Điểm mấu chốt là nếu bạn hài lòng với cách hoạt động của LimeSurvey 1.91+ thì không có lý do gì để thay đổi việc bạn làm. <span id="What_are_some_other_benefits_of_using_EM?"></span> ==Một số lợi ích khác của việc sử dụng EM là gì?== Dưới đây là một số lý do khác khiến bạn có thể muốn sử dụng EM. #Calculations - bạn có thể tạo bất kỳ phép tính nào bạn có thể nghĩ ra: #*Bạn có quyền truy cập vào tất cả các toán tử và hàm toán học phổ biến #* Bạn có quyền truy cập vào hơn 70 hàm toán học, ngày tháng và xử lý chuỗi #*Các nhà phát triển khá dễ dàng thêm các hàm mới nếu người dùng cần chúng #Lưu trữ các phép tính vào cơ sở dữ liệu #*Bây giờ bạn có thể tính toán các phép tính đơn giản và phức tạp và/hoặc thang điểm VÀ lưu trữ chúng trong cơ sở dữ liệu mà không cần JavaScript. #*Bạn sử dụng loại câu hỏi Phương trình để thực hiện việc này. #Assessments #*Bây giờ bạn có thể tạo các đánh giá hoặc thang điểm từ bất kỳ loại câu hỏi nào, không chỉ tập hợp con từng được hỗ trợ #*Bạn có thể sử dụng Tailoring để hiển thị số điểm đang chạy hoặc tổng điểm đánh giá ở bất cứ đâu cần thiết - ngay cả trên cùng một trang #*Bạn có nhiều quyền kiểm soát hơn trên các báo cáo được tạo dựa trên các điểm đánh giá đó #*Bạn có thể lưu trữ điểm đánh giá trong cơ sở dữ liệu mà không cần JavaScript #*Bạn có thể ẩn điểm đánh giá mà không cần JavaScript hoặc CSS #Trường thay thế # *Thay vì sử dụng {INSERTANS:SGQA}, bạn chỉ có thể sử dụng Mã câu hỏi - điều này giúp dễ đọc và xác thực hơn. #*Điều này cũng tránh được nhu cầu chỉnh sửa câu hỏi thông thường để thay đổi mã SGQA để mọi thứ hoạt động bình thường . #Tailoring - bạn có thể hiển thị văn bản có điều kiện dựa trên các giá trị khác #*Sử dụng tiêu đề thích hợp cho một chủ đề, như (ví dụ "Xin chào<nowiki> [</nowiki> Mr./Mrs.] Smith") #*Xuất ra các câu đúng ngữ pháp dựa trên số ít/số nhiều: (ví dụ: "Bạn có 1 con" so với "Bạn có 2 con") #*Chia động từ một cách thích hợp và từ chối các danh từ dựa trên giới tính và số nhiều của chủ đề. #Thuộc tính biến mới - bạn có thể truy cập thông tin sau để thực hiện điều chỉnh của mình: #* (không có hậu tố) - bí danh cho qcode.code #*. mã - mã câu trả lời được chọn cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu đó không phải là câu hỏi được mã hóa #*.NAOK - giống như .code, nhưng có thể là một phần của phép tính hoặc danh sách ngay cả khi không liên quan #*.value - giá trị đánh giá cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu đó không phải là câu hỏi được mã hóa -- có sẵn là các đánh giá được bật cho khảo sát, nếu không thì luôn luôn zero #*.valueNAOK - giống như .value, nhưng có thể là một phần của phép tính hoặc danh sách ngay cả khi không liên quan #*.shown - câu trả lời được hiển thị cho người dùng (đây là những gì {INSERTANS:xxx} thực hiện ) #*.qid - ID câu hỏi #*.gid - ID nhóm #*.sgqa - giá trị SGQA cho câu hỏi #*.jsName - tên biến javascript chính xác cho câu hỏi, bất kể được xác định trên trang này hay trang khác #*.qseq - chuỗi câu hỏi (bắt đầu từ 0) #*.gseq - chuỗi nhóm (bắt đầu từ 0) #*. bắt buộc - liệu câu hỏi có bắt buộc không (Y/N) #*.question - nội dung của câu hỏi #*.relevance - phương trình liên quan cho câu hỏi #*.grevance - phương trình liên quan cho nhóm #*.relevanceStatus - câu hỏi hiện có liên quan hay không (boolean (có thể khác nhau trong PHP và JS)) #*.type - loại câu hỏi (mã một ký tự)!N !#Thay đổi động trên trang #*Tất cả mức độ liên quan, tính toán và điều chỉnh hoạt động linh hoạt trên một trang - vì vậy các thay đổi về giá trị sẽ cập nhật trang ngay lập tức #*Vì vậy, bạn có câu hỏi tự động xuất hiện/biến mất dựa trên việc liệu chúng có liên quan #*Các câu hỏi cũng được điều chỉnh linh hoạt dựa trên các câu trả lời trên trang, do đó bạn có thể xem tổng số đang chạy, các câu được điều chỉnh và báo cáo tùy chỉnh. #Màn hình nhập dữ liệu mới #*Ngoài việc sử dụng hệ thống nhập dữ liệu hiện tại, bạn chỉ cần sử dụng Survey-All-In-One. #*Điều này hỗ trợ tính liên quan và điều chỉnh trên trang, vì vậy nhân viên nhập dữ liệu có thể nhanh chóng duyệt qua và họ sẽ chỉ phải nhập các câu trả lời có liên quan #*Điều này có thể rất quan trọng nếu người nhập dữ liệu của bạn cần xem quá trình điều chỉnh, cũng rất linh hoạt. #Loại bỏ nhu cầu về hầu hết JavaScript tùy chỉnh #*EM dễ dàng hỗ trợ các phép tính phức tạp, tính điểm , điều chỉnh và logic có điều kiện. #*Một số thứ vẫn sẽ cần JavaScript (như bố cục tùy chỉnh và ẩn các thành phần phụ câu hỏi có điều kiện), nhưng JavaScript của bạn có thể sử dụng các hàm EM để bạn có thể truy cập các câu hỏi bằng Qcode của chúng thay vì SGQA và truy cập bất kỳ thuộc tính câu hỏi nào được liệt kê ở trên. <span id="What_are_some_other_helpful_new_features_enabled_by_EM?"></span> ==Một số tính năng mới hữu ích khác được EM kích hoạt là gì?== Bất kể bạn tiếp tục sử dụng Trình chỉnh sửa điều kiện hay soạn phương trình liên quan theo cách thủ công, bạn sẽ nhận được những lợi ích bổ sung sau: #Bạn có thể tạo tiêu chí xác thực phức tạp hơn #*Tất cả thuộc tính câu hỏi nâng cao (như max_answers, min_num_value_n, max_num_value) có thể sử dụng Biểu thức. Vì vậy, tiêu chí tối thiểu/tối đa của bạn có thể được điều chỉnh dễ dàng dựa trên các phản hồi trước đó, ngay cả khi chúng nằm trên cùng một trang. #*EM cũng xử lý tất cả xác thực dựa trên biểu thức chính quy, do đó bạn có thể kết hợp mạnh mẽ preg và phương trình- dựa trên thuộc tính câu hỏi. #Easy Sắp xếp lại (hoặc xóa) các Câu hỏi và Nhóm #*Trước phiên bản 1.92, bạn không thể sắp xếp lại các câu hỏi hoặc nhóm nếu LimeSurvey cho rằng việc sắp xếp lại như vậy có thể bị hỏng điều kiện mà chúng được sử dụng. Tương tự, bạn không thể xóa câu hỏi nếu có bất kỳ câu hỏi nào khác phụ thuộc vào chúng. #*Với tính năng tô sáng cú pháp của EM, thật dễ dàng để xem và xác thực xem bạn có cố gắng sử dụng câu hỏi trước khi chúng được khai báo hay không. Vì vậy, giờ đây chúng tôi cho phép bạn sắp xếp lại hoặc xóa các câu hỏi và nhóm bất cứ khi nào bạn muốn. EM sẽ cập nhật tất cả phần tô sáng cú pháp để hiển thị cho bạn các lỗi tiềm ẩn. #*Chế độ xem các câu hỏi sắp xếp lại đã được cải tiến để trợ giúp việc xem xét đó. Giờ đây, nó hiển thị phương trình liên quan và sự điều chỉnh của câu hỏi, vì vậy bạn có thể xem ngay liệu có bất kỳ biến nào chuyển sang màu hồng hay không (nghĩa là chúng được sử dụng trước khi được khai báo) #Chỉ mục Điều hướng Câu hỏi/Nhóm luôn có sẵn và chính xác #* Trước phiên bản 1.92, những chỉ mục này không có sẵn nếu có các điều kiện phức tạp #*Với EM, chúng tôi có thể đảm bảo rằng chúng chính xác. #*Chủ đề thậm chí có thể quay lại câu hỏi trước đó, thay đổi câu trả lời , sau đó nhảy về phía trước (hoặc gửi) #**Khi nhảy về phía trước, EM sẽ xác thực lại tất cả các câu hỏi/nhóm can thiệp. #**Nếu bất kỳ câu hỏi nào không liên quan, chúng sẽ bị NULLed trong cơ sở dữ liệu để dữ liệu của bạn nhất quán nội bộ #**Nếu bất kỳ câu hỏi nào trở nên có liên quan hoặc mới không đạt yêu cầu bắt buộc hoặc quy tắc xác thực, EM sẽ dừng trên trang đó và buộc người dùng phải trả lời những câu hỏi đó trước khi chuyển đến đích cuối cùng. #Tự động chuyển đổi các điều kiện thành mức độ phù hợp #*Khi bạn nâng cấp cơ sở dữ liệu của mình, tất cả các khảo sát hiện có có các điều kiện sẽ có các phương trình liên quan được tạo cho chúng #*Bất cứ khi nào bạn nhập một khảo sát, các phương trình liên quan sẽ được tạo khi cần #*Bất cứ khi nào bạn thêm, xóa hoặc sửa đổi các điều kiện, EM sẽ tạo ra phương trình liên quan thích hợp. #Đánh dấu cú pháp thuận tiện #*Khi EM hiển thị phương trình liên quan, nó sẽ hiển thị Qcode, ngay cả khi bạn đã nhập mã SGQA, vì chúng tôi cho rằng mã này sẽ dễ đọc hơn. #*Tất cả các biến đều được mã hóa màu để cho biết chúng được khai báo trước hay sau câu hỏi hiện tại (hoặc trước hay sau nhóm hiện tại). Điều này cho phép bạn nhanh chóng phát hiện và khắc phục các trường hợp trong đó bạn cố gắng sử dụng các biến cho mức độ liên quan (bao gồm array_filter), điều chỉnh hoặc phương trình xác thực trước khi khai báo chúng. #*Ngoài ra, nếu bạn di chuột qua biến được mã hóa màu , bạn sẽ thấy siêu dữ liệu quan trọng nhất về câu hỏi đó. Điều này bao gồm Chuỗi nhóm #, Chuỗi câu hỏi #, Qcode, Văn bản của câu hỏi và tất cả các lựa chọn trả lời có sẵn (nếu đó là loại câu hỏi có các lựa chọn trả lời được liệt kê). #**Danh sách các lựa chọn câu trả lời sử dụng cú pháp này : 'answers':{key:val, ... }. #**''key'' có cú pháp ''''scale~code'''' trong đó ''scale'' là thang đo câu trả lời (ví dụ: đối với tỷ lệ kép) và ''code'' là mã câu trả lời. #**''val'' có cú pháp ''''value~shown'''' trong đó ''value'' là giá trị đánh giá (nếu sử dụng đánh giá, nếu không thì ''mã'')(ví dụ Qcode.value) và ''được hiển thị'' là giá trị hiển thị mà đối tượng nhìn thấy (ví dụ Qcode.shown) #**This có nghĩa là nhiều khảo sát có thể sử dụng phép tính mà không cần chế độ đánh giá. Nếu bạn có các tùy chọn câu trả lời được liệt kê là duy nhất, không thập phân và không âm, bạn chỉ cần thực hiện các phép tính trên các giá trị Qcode.code. #Easy xem xét toàn bộ logic và nội dung khảo sát #*Có tính năng Hiển thị logic khảo sát mới cho phép bạn xem mọi thứ về khảo sát (hoặc nhóm hoặc câu hỏi) trên một trang. #*Nó hiển thị chi tiết cấp độ Nhóm, Câu hỏi, Câu hỏi phụ và Câu trả lời cho phạm vi đã chọn (khảo sát so với nhóm so với câu hỏi) #*Nó cũng hiển thị mức độ liên quan, mức độ liên quan ở cấp độ câu hỏi phụ (đối với array_filter và array_filter_exclude) và phương trình xác thực được tạo (đối với preg và bất kỳ quy tắc xác thực nào như tổng tối thiểu/tối đa/số lượng value) và tất cả các thuộc tính câu hỏi không trống. #*Mọi thứ đều được đánh dấu theo cú pháp để bạn có thể thấy các lỗi cú pháp tiềm ẩn (như dấu ngoặc đơn không cân bằng hoặc việc sử dụng các biến trước khi chúng được khai báo) #*Cú pháp- việc tô sáng hỗ trợ điều hướng và chỉnh sửa nhanh chóng bản khảo sát. #**Nếu bạn nhấp vào tên biến, nó sẽ mở ra một cửa sổ (hoặc tab) trình duyệt hiển thị cho bạn câu hỏi đó và cho phép bạn chỉnh sửa nó. #** Nếu bạn nhấp vào tên nhóm, nó sẽ mở ra một cửa sổ (hoặc tab) trình duyệt hiển thị chế độ xem sắp xếp lại nhóm để bạn có thể dễ dàng di chuyển các câu hỏi xung quanh. #**Tất cả các thuộc tính câu hỏi cũng được đánh dấu cú pháp. Điều này cho phép bạn đặt và xem các biểu thức trong các tùy chọn câu hỏi nâng cao (chẳng hạn như tính số/tổng giá trị tối đa/tối thiểu trên một biểu thức) #*Tác giả EM đã sử dụng chế độ xem tương tự (sạch hơn một chút) để cho phép các nhà dịch tễ học và tổ chức cộng tác của mình Hội đồng xét duyệt xác nhận và ủy quyền các cuộc khảo sát với hàng nghìn câu hỏi trong các cuộc phỏng vấn có cấu trúc phù hợp và phân nhánh cao <span id="Getting_Started"></span> =Bắt đầu= Cách tốt nhất để bắt đầu với EM là: *Cài đặt phiên bản ổn định mới nhất từ http://www.limesurvey.org/en/download *Nhập và khám phá [[khảo sát mẫu ExpressionScript|khảo sát mẫu ]]. *Khám phá [[Cách thực hiện ExpressionScript|các trường hợp sử dụng và Cách thực hiện]] và [[Ví dụ về ExpressionScript|ví dụ từng bước]]. *Khám phá tài liệu EM (trang này)! N!*Kiểm tra bộ kiểm tra EM tích hợp **Từ bất kỳ khảo sát nào, trong phần công cụ, hãy chọn tùy chọn EM **Các hàm có sẵn liệt kê hơn 70 hàm và cú pháp **Kiểm tra đơn vị của Cô lập Biểu thức ***hiển thị các ví dụ về cách sử dụng tất cả các hàm và toán tử EM cũng như các kết quả PHP và JavaScript ***lưu ý rằng có một số hàm tạo ra các kết quả khác nhau trong các phiên bản PHP và JavaScript, vì vậy trang này cho phép bạn lập kế hoạch logic EM của bạn cho phù hợp. <span id="What_Functionality_does_Expression_Manager_Extend/Replace?_(LimeSurvey_<=_1.91+)"></span> =Trình quản lý biểu thức mở rộng/thay thế chức năng gì? (Khảo sát vôi <= 1,91+)= <span id="Conditions_=>_Relevance"></span> ==Điều kiện => Mức độ liên quan== Các điều kiện kiểm soát những câu hỏi nào được hiển thị. Cú pháp chung là ''Giá trị toán tử SGQA'', như ''111X2X3 == "Y"''. Các điều kiện có thể được AND hoặc OR cùng nhau, nhưng việc trộn AND và OR rất khó. Bản thân các điều kiện được lưu trữ trong một bảng riêng biệt và phần lớn mã của LimeSurvey được dành để quản lý các Điều kiện. Do khả năng truy cập cơ sở dữ liệu rộng rãi, việc xử lý số lượng lớn các điều kiện có thể gây ra các vấn đề về hiệu suất đáng chú ý. Hơn nữa, một khi bạn đã gán các điều kiện cho câu hỏi hoặc nhóm, bạn thường không được phép sắp xếp lại hoặc xóa chúng. <span id="Assessments_=>_Equations_and_Micro-Tailoring"></span> ==Đánh giá => Phương trình và May đo vi mô== Đánh giá cho phép người dùng tạo thang điểm từ một tập hợp các câu hỏi. Tuy nhiên, chúng không thể thay đổi linh hoạt trên trang hiện tại và giá trị của chúng không được lưu vào cơ sở dữ liệu. <span id="Replacements_=>_Micro-Tailoring"></span> ==Thay thế => May vi mô== Người dùng có thể điều chỉnh một số tin nhắn và câu hỏi dựa trên các phản hồi trước đó. Ví dụ: câu hỏi có thể là ''{TOKEN:FIRSTNAME}, bạn đã nói rằng {INSERTANS:111X3X4} là môn thể thao yêu thích của bạn''. Tuy nhiên, không thể thực hiện việc điều chỉnh có điều kiện (chẳng hạn như nói "Mr." hoặc "Mrs." tùy thuộc vào giới tính của người đó) hoặc chia động từ hoặc danh từ từ chối mà không có JavaScript ưa thích. Các tác giả có thể thực hiện các cuộc khảo sát dường như điều chỉnh các câu hỏi, nhưng nó yêu cầu các câu hỏi riêng biệt cho từng hoán vị và các điều kiện phức tạp để quyết định câu hỏi nào sẽ hiển thị. <span id="Validation"></span> ==Xác thực== Câu hỏi có thể được xác thực bằng Biểu thức thông thường hoặc giá trị tối thiểu/tối đa hoặc để phản hồi SGQA đóng vai trò là giá trị tối thiểu hoặc tối đa. Tuy nhiên, việc xác thực không thể dựa trên tính toán của các biến khác nếu không có JavaScript ưa thích. <span id="Equations"></span> ==Phương trình== Các phương trình không được hỗ trợ nếu không có JavaScript ưa thích. <span id="Equation_Question_Type"></span> ==Loại câu hỏi phương trình== Không thể lưu các phương trình vào cơ sở dữ liệu (ví dụ: điểm cuối cùng của bài đánh giá) nếu không có JavaScript ưa thích. <span id="How_Will_Expression_Manager_Replace/Extend_That_Functionality?"></span> =Trình quản lý biểu thức sẽ thay thế/mở rộng chức năng đó như thế nào?= Trình quản lý biểu thức là một mô-đun cốt lõi mới trong LimeSurvey giúp việc hỗ trợ loại chức năng phức tạp thường yêu cầu JavaScript tùy chỉnh trở nên dễ dàng hơn nhiều. Nó cũng đang thay thế cách LimeSurvey hiện quản lý Điều kiện và Đánh giá. <span id="New_Terminology_When_Referring_to_Expression_Manager_(EM)"></span> ==Thuật ngữ mới khi đề cập đến Trình quản lý biểu thức (EM)== EM "nghĩ" về chức năng của nó theo các thuật ngữ sau: *'''Phân nhánh dựa trên mức độ liên quan''' - nếu một câu hỏi có liên quan thì hãy hỏi nó, nếu không thì không (ví dụ: làm cho nó ẩn đi và đánh dấu nó dưới dạng NULL trong cơ sở dữ liệu). Có một trường Mức độ liên quan mới cho tất cả các loại Câu hỏi và cho từng Nhóm (vì vậy bạn có thể áp dụng một bộ điều kiện cho toàn bộ nhóm mà không cần phải sao chép cùng một điều kiện cho mỗi câu hỏi và/hoặc kết hợp các điều kiện ở cấp độ câu hỏi và nhóm. logic). *'''Tailoring''' - Khi bạn biết những câu hỏi nào nên được hỏi, việc điều chỉnh (đôi khi được gọi là ''piping'') sẽ chỉ định cách đặt câu hỏi. Điều này cho phép bạn không chỉ hỗ trợ cách thay thế đơn giản (như {TOKEN:FIRSTNAME}) mà còn hỗ trợ cách chia động từ và biến cách của danh từ dựa trên giới tính hoặc số lượng chủ ngữ của bạn. Nó cũng cho phép bạn thay đổi thông điệp bạn gửi đến một chủ đề dựa trên việc họ có trả lời (hoặc cách họ trả lời) các câu hỏi khác hay không. *'''Equations''' - EM thêm một loại câu hỏi mới gọi là Phương trình để lưu kết quả của một biểu thức. Các kết quả phương trình này được tính toán và ghi vào cơ sở dữ liệu, ngay cả khi bạn ẩn chúng trên trang. Do đó, chúng rất hữu ích cho các phép tính điểm ẩn, điều hướng dựa trên các phương trình, đánh giá và báo cáo phức tạp cần được tạo và dễ dàng có sẵn trong cơ sở dữ liệu. <span id="Relevance_and_Cascading_Relevance"></span> ===Mức độ liên quan và mức độ liên quan theo tầng=== Giờ đây, mọi loại câu hỏi đều có tùy chọn Mức độ liên quan để kiểm soát xem câu hỏi có được hiển thị hay không. EM xử lý từng Phương trình liên quan theo thứ tự chúng sẽ xuất hiện trong khảo sát. Nếu biểu thức đúng (hoặc bị thiếu - để hỗ trợ các khảo sát cũ), câu hỏi sẽ được hiển thị. Nếu nó không liên quan thì câu hỏi sẽ bị ẩn và giá trị sẽ là NULL trong cơ sở dữ liệu. Nếu không có câu hỏi nào liên quan trong một nhóm, toàn bộ nhóm sẽ bị bỏ qua. Hơn nữa, nếu bất kỳ biến nào trong biểu thức không liên quan thì biểu thức đó luôn đánh giá là sai. Điều này cho phép Xếp tầng mức độ liên quan để bạn không phải viết các phương trình Mức độ liên quan quá dài cho mỗi câu hỏi. Giả sử bạn có 5 câu hỏi Q1-Q5 và bạn chỉ muốn hiển thị Q2 nếu Q1 đã được trả lời và Q3 nếu Q2 đã được trả lời, v.v. Các phương trình liên quan có thể là: {| class="wikitable" !Mã câu hỏi!!Mức độ liên quan!!Câu hỏi |- |Q1||1||Tên bạn là gì? |- |Q2||Q1 ||{Q1}, bạn bao nhiêu tuổi? |- |Q3||Q2||Vậy bạn {Q2} tuổi. Bạn đã kết hôn chưa? |- |Q4||Q3 == "Y"||{Q1}, bạn đã kết hôn được bao lâu rồi? |- |Q5||Q4|| Bạn có bao nhiêu đứa con, {Q1}? |} Tính toán mức độ liên quan cũng hoạt động trong JavaScript - vì vậy bạn có thể đặt tất cả các câu hỏi trên vào một trang và nó vẫn hoạt động như mong đợi. Trên thực tế, EM thay thế hoàn toàn cách EM xử lý các định dạng Khảo sát so với Nhóm so với Câu hỏi tại một thời điểm. Giờ đây tất cả đều sử dụng cùng một công cụ điều hướng nên hoạt động giống hệt nhau bất kể kiểu khảo sát nào. Miễn là bạn ở trên cùng một trang, mọi dữ liệu bạn đã nhập sẽ vẫn ở đó, chỉ bị ẩn. Vì vậy, nếu bạn nhập một số thông tin, sau đó chọn một tùy chọn khiến chúng không liên quan, sau đó làm cho chúng có liên quan trở lại, câu trả lời của bạn sẽ vẫn có sẵn. Tuy nhiên, ngay khi bạn chuyển sang một trang khác, tất cả các phản hồi không liên quan sẽ bị mất tính toàn vẹn của tập dữ liệu. <span id="Group-Level_Relevance"></span> ===Mức độ liên quan ở cấp độ nhóm=== Trình quản lý biểu thức cũng hỗ trợ mức độ liên quan ở cấp độ nhóm. Điều này làm cho việc thực hiện vòng lặp dễ dàng hơn. Giả sử bạn muốn thu thập thông tin về tối đa 10 thực thể (như sản phẩm hoặc người trong một hộ gia đình), trước tiên bạn xác định có bao nhiêu thực thể cần theo dõi (chẳng hạn như bằng cách hỏi có bao nhiêu người sống trong một hộ gia đình hoặc yêu cầu mọi người kiểm tra những sản phẩm họ thích từ một danh sách dài). Sau khi biết có bao nhiêu thực thể cần theo dõi, bạn có thể sử dụng mức độ liên quan ở cấp Nhóm như {count >= 1}, {count >=2}, ... {count >= 10} cho mỗi nhóm trong số 10 nhóm theo dõi- lên câu hỏi. Trong mỗi nhóm, bạn có thể có logic điều kiện ở cấp độ câu hỏi (ví dụ: các câu hỏi tiếp theo dành riêng cho giới tính hoặc độ tuổi cho từng chủ đề). Câu hỏi và các phương trình liên quan ở cấp độ nhóm được AND cùng nhau để xác định phương trình nào sẽ được hiển thị. <span id="Tailoring_/_Piping"></span> ===May / Đường ống=== Mọi thứ trong dấu ngoặc nhọn hiện được coi là Biểu thức (với một ngoại lệ được mô tả bên dưới). Các biểu thức có quyền truy cập vào tất cả LimeReplacementFields, tất cả các biến (thông qua một số bí danh), tất cả các toán tử phương trình điển hình (toán học, logic và so sánh) và hàng tá hàm (thậm chí còn hoạt động linh hoạt ở phía máy khách). Bằng cách sử dụng các phương trình này, bạn có thể thực hiện những việc như: #Có điều kiện hiển thị các thông báo phù hợp cho người trả lời dựa trên các phản hồi trước đó #Tạo Đánh giá và hiển thị kết quả Đánh giá (hoặc phân nhánh có điều kiện hoặc hiển thị thông báo) dựa trên các kết quả đó, tất cả mà không cần sử dụng chính mô-đun Đánh giá #Liên hợp động từ và danh từ từ chối trong câu hỏi, câu trả lời và báo cáo. #Hiển thị tóm tắt các câu trả lời trước trang "Hiển thị câu trả lời của bạn" ở cuối cuộc khảo sát <span id="Equations"></span> ===Phương trình=== Có một loại câu hỏi mới gọi là Phương trình. Nó giống như các câu hỏi soạn sẵn, ngoại trừ việc nó lưu trữ giá trị của những gì được hiển thị trong cơ sở dữ liệu. Vì vậy, nếu văn bản Câu hỏi Phương trình chứa phép tính Đánh giá, giá trị đó sẽ được lưu trữ trong cơ sở dữ liệu dưới dạng một biến có thể được hiển thị trong số liệu thống kê công khai hoặc riêng tư. Điều này giải quyết một yêu cầu chung về lưu trữ điểm Đánh giá trong cơ sở dữ liệu <span id="Syntax"></span> ==Cú pháp== Bất cứ điều gì có trong dấu ngoặc nhọn hiện được coi là Biểu thức (với một ngoại lệ: không được có khoảng trắng ở đầu hoặc cuối - điều này là cần thiết để đảm bảo Trình quản lý biểu thức không cố xử lý JavaScript được nhúng). Lưu ý, các biểu thức có thể trải dài trên nhiều dòng, miễn là không có khoảng trắng sau dấu ngoặc nhọn mở hoặc trước dấu ngoặc nhọn đóng. Điều này đặc biệt hữu ích cho các câu lệnh if() lồng nhau như thế này: <syntaxhighlight lang="java">{if(is_empty(PFTotals), '', if(PFTotals >= -5 && PFTotals <= -4, 'Rất mềm', if(PFTotals >= -3 && PFTotals <= -2, 'Soft', if(PFTotals == -1, 'Hơi mềm', if(PFTotals == 0, 'Trung bình',! N! if(PFTotals == 1, 'Hơi khó', if(PFTotals >= 2 && PFTotals <= 3, 'Hard', if(PFTotals >= 4 && PFTotals <= 5, 'Rất khó', '' ) ) ) ) ) ) ) )} </syntaxhighlight> <div id="EMsyntax">Trình quản lý biểu thức hỗ trợ cú pháp sau:</div> *Tất cả các toán tử tiêu chuẩn (ví dụ +,-,*,/,!) *Tất cả các toán tử so sánh tiêu chuẩn (ví dụ <,<=,==,!=,>,>=, cộng với các giá trị tương đương sau: lt,le,eq,ne,gt,ge) *Dấu ngoặc đơn (để bạn có thể nhóm các biểu thức con) *Các toán tử có điều kiện (ví dụ &&,| | và các giá trị tương đương này: and,or) * Các chuỗi trích dẫn đơn và kép (mỗi chuỗi có thể nhúng các chuỗi với loại trích dẫn khác) *Toán tử dấu phẩy (vì vậy có thể có danh sách các biểu thức và chỉ trả về kết quả cuối cùng) *Toán tử gán (=) *Các biến được xác định trước (để tham khảo các câu hỏi, thuộc tính câu hỏi và câu trả lời) - ví dụ: tất cả các mã SGQA *Các hàm được xác định trước (đã có hơn 70 và rất dễ dàng để thêm nhiều hơn) <span id="Operators"></span> === Toán tử === Cú pháp EM tuân theo mức độ ưu tiên của toán tử thông thường: {| class="wikitable" !Level!!Operator(s)!!Description |- |1||()||dấu ngoặc đơn để nhóm hoặc gọi các hàm |- | 2||! - +||toán tử một ngôi: không, phủ định, một ngôi-cộng |- |3||* /||lần, chia |- |4||+ -||cộng , trừ |- |5||< <= > >= lt le gt ge||so sánh tương đối |- |6||== != eq ne||so sánh đẳng thức |- |7||và||logic AND |- |8||hoặc||logic OR |- |9||=||chuyển nhượng toán tử |- |10||,||toán tử dấu phẩy |} <span id="Warning_with_plus_operator_(+)"></span> ==== Cảnh báo với toán tử dấu cộng (+) ==== Để nhất quán giữa JavaScript và PHP, toán tử cộng (+) sẽ thực hiện phép cộng nếu cả hai toán hạng đều là số, nhưng thực hiện phép nối nếu cả hai phần đều là chuỗi không phải số. Tuy nhiên, '''chúng tôi khuyên bạn nên sử dụng hàm join() để nối và hàm sum() để cộng''', vì điều đó làm cho ý định của bạn rõ ràng hơn và tránh các kết quả không mong muốn nếu bạn đang mong đợi các chuỗi nhưng thay vào đó lại nhận được các số (hoặc ngược lại ngược lại). <span id="Warning_with_mismatch_between_number_and_string_and_alphabetic_comparison"></span> ==== Cảnh báo không khớp giữa số và chuỗi và so sánh chữ cái ==== Khi bạn muốn so sánh giá trị với so sánh tương đối hoặc bằng nhau, hãy chú ý đến kiểu không khớp. Giá trị do người dùng nhập hoặc mã câu trả lời đã chọn có thể được sử dụng làm số nếu nó rõ ràng là một số. Nếu bạn bao quanh một trong các giá trị bằng <code>"</code> nó sẽ buộc so sánh dưới dạng văn bản (so sánh theo bảng chữ cái). Nếu bạn muốn so sánh bằng số, không bao giờ đặt số trong dấu ngoặc kép, <code>"</code> . Ví dụ: <code>Q0.NAOK > "50"</code> là đúng nếu Q0.NAOK là câu hỏi số có giá trị là 9. Điều này là do toán tử <code>></code> sẽ cho rằng nó so sánh theo thứ tự bảng chữ cái chứ không phải số. <div class="mw-translate-fuzzy"> Để chắc chắn so sánh giá trị số nguyên, bạn có thể sử dụng <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code> , chỉ cần nhớ nếu Q0.NAOK không phải là số (trống hoặc chuỗi), thì intval(Q0. NAOK) === 0. Để so sánh giá trị chuỗi ("A" < "B"), hãy sử dụng [[Expression_Manager#Implemented_Functions|strcmp]] trực tiếp: <code>strcmp(Q0.NAOK,"B")</code> hoặc <code>strcmp(Q0.NAOK,"A5")</code> . </div> <span id="Caution_about_using_Assignment_Operator_(=)"></span> ===Chú ý khi sử dụng Toán tử gán (=)=== Lưu ý, bạn nên tránh sử dụng toán tử gán trừ khi thực sự cần thiết vì chúng có thể gây ra tác dụng phụ không mong muốn. Ví dụ: nếu bạn thay đổi giá trị của câu trả lời trước đó, mức độ liên quan xếp tầng và logic xác thực giữa câu hỏi đó và câu hỏi hiện tại sẽ không được tính lại, do đó, bạn có thể nhận được dữ liệu không nhất quán nội bộ (ví dụ: các câu hỏi vẫn được trả lời nhưng phải có bị NULL hoặc các câu hỏi bị bỏ qua nhưng lẽ ra phải được trả lời). Nói chung, nếu bạn muốn gán giá trị cho một biến, bạn nên tạo loại câu hỏi Phương trình và sử dụng biểu thức để đặt giá trị cho biến đó. Tuy nhiên, hiếm khi mọi người thực sự cần toán tử này, vì vậy chúng tôi đã cung cấp nó. Để cảnh báo bạn về toán tử này, nó được hiển thị bằng phông chữ màu đỏ trong các phương trình cú pháp (để bạn không nhầm lẫn nó với "==") ===Sử dụng Toán tử Bài tập=== Các lý do chính khiến bạn có thể muốn sử dụng bài tập là: * Bạn cần đặt giá trị mặc định cho câu hỏi không chấp nhận giá trị mặc định thông qua phương trình (chẳng hạn như radio danh sách, trong đó giao diện người dùng cho phép bạn chọn một trong các tùy chọn trả lời nhưng không cho phép bạn nhập phương trình). Tuy nhiên, hãy cẩn thận, vì LimeSurvey sẽ không thể xác thực rằng phương trình của bạn tạo ra một trong những câu trả lời được phép cho câu hỏi đó. * Bạn cần buộc phải thay đổi câu trả lời cho câu hỏi trước dựa trên câu trả lời sau * Bạn cần hạn ngạch phức tạp: sử dụng một lựa chọn ẩn duy nhất cho hạn ngạch và đặt nó bằng phép gán * v.v... Bạn có thể sử dụng tất cả hệ thống quản lý biểu thức cho mục đích này. {{Cảnh báo|Việc gán chỉ được thực hiện bằng PHP. Điều này không cập nhật bất kỳ giá trị nào trên cùng một trang mà chỉ khi người dùng điều hướng bằng tiếp theo, trước đó, lưu ….}} {{Cảnh báo|Nếu bạn không sử dụng loại [[Question_type_-_Equation|câu hỏi phương trình]] cho mục đích này: việc gán chỉ được thực hiện sau khi hoàn thành logic của trang hiện tại. Phương pháp được đề xuất là luôn sử dụng [[Question_type_-_Equation|câu hỏi phương trình]].}} Một số ví dụ: * Đặt câu trả lời cho một câu hỏi văn bản ngắn bằng chữ thường : <code>{QCODE=strtolower(QCODE.NAOK)}</code> * Đặt câu trả lời mặc định cho loại câu hỏi mảng khi bắt đầu khảo sát : <code>{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code> * Đặt câu trả lời mặc định cho loại câu hỏi văn bản mảng khi bắt đầu khảo sát: <code>{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code> * Đặt câu trả lời với điều kiện : <code>{QCODE=if(YesNo="Y","A1","")}</code> <span id="XSS_security"></span> == Bảo mật XSS == Khi bật XSS, không thể sử dụng một số hệ thống quản lý biểu thức: * bắt đầu một thẻ HTML trong biểu thức nhưng kết thúc bằng một biểu thức khác * sử dụng một biểu thức phức tạp trong URL. Ví dụ và cách giải quyết * <code>{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}</code> bị hỏng do bảo mật XSS, tại đây bạn có thể sử dụng <code>{if(1," <strong>information</strong>","information")}</code> * <code><a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a></code> , here you can use an equation question because using a complete question code is OK : <code><a href="/script.php?value={EQUATION.NAOK}">next</a></code></code> <strong>information</strong>","information")}</code> <code>{if(1," * <code><a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a></code> , here you can use an equation question because using a complete question code is OK : <code><a href="/script.php?value={EQUATION.NAOK}">next</a></code></code> <span id="Access_to_Variables"></span> ==Truy cập vào các biến== Trình quản lý biểu thức cung cấp quyền truy cập chỉ đọc vào bất kỳ biến nào chúng ta có thể cần. Để tương thích ngược, nó cung cấp quyền truy cập vào: *TOKEN:xxx - giá trị của TOKEN (ví dụ: TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Chỉ dành cho khảo sát KHÔNG ẩn danh). *[[Thêm a question#Information_from_previous_answers|INSERTANS:SGQA]] - giá trị hiển thị của câu trả lời (ví dụ: "Có"). Đối với Trình quản lý biểu thức, việc sử dụng {QCODE.shown}. *Tất cả [[The_template_editor#Keywords|{XXX} được sử dụng bởi các mẫu]] cũng tương tự như vậy. *Trong văn bản câu hỏi, bạn có thể sử dụng {QID} được thay thế bởi id câu hỏi và {SGQ} được thay thế bằng SGQA của câu hỏi Ngoài ra, Trình quản lý Biểu thức cho phép bạn tham chiếu đến các biến theo Mã Câu hỏi (cột 'tiêu đề' trong bảng câu hỏi trong cơ sở dữ liệu). Đây cũng là nhãn biến được sử dụng khi bạn xuất dữ liệu của mình sang SPSS, R hoặc SAS. Ví dụ: nếu bạn có thắc mắc về tên, tuổi và giới tính, bạn có thể gọi các biến đó là ''name'', ''age'' và ''giới tính'' thay vì ''12345X13X22'', ''12345X13X23' ' và ''12345X13X24''. Điều này giúp mọi người dễ dàng đọc và xác thực tính logic của các phương trình hơn, đồng thời giúp bạn có thể xáo trộn các câu hỏi xung quanh mà không cần phải theo dõi số nhóm hoặc số câu hỏi. <div class='simplebox'> '''Quan trọng:''' Chỉ an toàn khi đề cập đến các biến xuất hiện ở các trang hoặc câu hỏi trước đó. </div> Hơn nữa, Trình quản lý biểu thức cho phép bạn truy cập nhiều thuộc tính của Câu hỏi: {| class="wikitable" !Cú pháp!!Ý nghĩa!!Ví dụ!!Kết quả ví dụ |- |Qcode||bí danh cho Qcode.code||{implode(',',name,gender )}||'Tom','M' |- |Qcode.code||mã câu trả lời đã chọn cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu nó không phải là câu hỏi được mã hóa||{implode(',',name.code,gender.code)}||'Tom','M' |- |Qcode.NAOK||giống như Qcode - xem thảo luận về NAOK||{gender.NAOK}||'M' |- |Qcode.value||giá trị đánh giá cho câu hỏi nếu nó có liên quan (nếu không thì để trống) hoặc giá trị văn bản nếu không một câu hỏi được mã hóa||{gender.value}||'1' |- |Qcode.valueNAOK||giống như Qcode.value - xem thảo luận về NAOK||{gender.valueNAOK}||'1 ' |- |Qcode.shown||giá trị hiển thị cho câu hỏi||{implode(',',name.shown,gender.shown)}||'Tom','Male'!N !|- |Qcode.question||nội dung câu hỏi||{gender.question}||'Giới tính của bạn là gì?' |- |Qcode.mandatory||cho dù câu hỏi là gì là bắt buộc (Y/N)||{gender.mandatory}||'N' |- |Qcode.qid||số câu hỏi nội bộ (không phải số thứ tự)||{gender.qid} ||337 |- |Qcode.type||loại câu hỏi||{gender.type}||'G' |- |Qcode.jsName||tên javascript chính xác cho câu hỏi, bất kể được khai báo trên hay ngoài trang này||{gender.jsName}||'java1827X3X337' |- |Qcode.gid||số nhóm nội bộ (không phải số tuần tự)|| {gender.gid}||3 |- |Qcode.qseq||số thứ tự của câu hỏi, bắt đầu từ 0||{gender.qseq}||5 |- |Qcode.gseq||số thứ tự của nhóm, bắt đầu từ 0||{gender.gseq}||1 |- |Qcode.relevanceStatus||liệu câu hỏi hiện có liên quan hay không (0 hoặc 1 )||{gender.relevanceStatus}||1 |- |Qcode.relevance||phương trình mức độ liên quan ở cấp độ câu hỏi||{gender.relevance}||'!is_empty(name)' |- |Qcode.grelevance||phương trình mức độ liên quan ở cấp độ nhóm||{gender.grelevance}||'num_children >= 5' |- |Qcode.sgqa||giá trị SGQA cho câu hỏi này||{gender.sgqa}||'1827X3X337' |} <span id="HTML_editor_issue"></span> === Vấn đề về trình soạn thảo HTML=== {{Cảnh báo|Sự cố này đã được khắc phục sau bản dựng 2.05 140803}} Nếu bạn sử dụng trình soạn thảo HTML, một số ký tự sẽ được thay thế bằng các thực thể HTML. * & by & * < by < * > by > Nếu bạn sử dụng trình soạn thảo HTML, bạn cần sử dụng : * và cho & * lt cho < * le for <= * gt for > * dành cho >= <span id="Qcode_Variable_Naming"></span> ==Đặt tên biến Qcode== Dưới đây là chi tiết về cách tạo Qcode (và truy cập một số thuộc tính) theo loại câu hỏi. Nói chung, Qcodes được xây dựng như sau: Mã câu hỏi. '_' . ID câu hỏi phụ. '_' . Id tỷ lệ Đối với '''comment''' và '''other''', mã câu hỏi là questionCode_comment và questionCode_other {| class="wikitable" !Type!!Mô tả!!Mã!!SubQs!!Tùy chọn trả lời!!Thang đo!!Mã trả lời!!Câu trả lời được hiển thị!!Mức độ liên quan |- |5||5 Nút Radio Lựa chọn Điểm||Q1|| ||1-5|| ||{Q1}||{Q1.shown}||{Q1==3} |- |B||Mảng (Lựa chọn 10 điểm) Nút radio||Q2||L1-L6| |1-10|| ||{Q2_L2}||{Q2_L2.shown}||{Q2_L2==7} |- |A||Mảng (Lựa chọn 5 điểm) Nút radio||Q3||1-5| |1-5|| ||{Q3_1}||{Q3_1.shown}||{Q3_1>=3} |- |1||Mảng (Nhãn linh hoạt) Tỷ lệ kép||Q4||sq1-sq5||0 :a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.shown}||{Q4_sq1_1=='b2'} |- |H||Array (Linh hoạt) - Định dạng cột||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.shown}||{Q5_1=='s'} |- |F||Mảng (Linh hoạt) - Định dạng hàng||Q6||F1-F5| |1-5|| ||{Q6_F3}||{Q6_F3.shown}||{Q6_F3==4} |- |E||Mảng (Tăng/Tương/Giảm) Nút Radio||Q7||1- 7||Tôi,S,D|| ||{Q7_4}||{Q7_4.shown}||{Q7_4=='D'} |- |:||Mảng (Đa Flexi) 1 đến 10||Q8||ls1,todo ,ls2||min,max,avg|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7} |- |;||Văn bản mảng (Đa Flexi)||Q9||hp,st,sw|| Thứ 1, thứ 2, thứ 3|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'} |- |C||Mảng (Có/Không chắc chắn/Không) Nút radio||Q10|| 1-5||Y,N,U|| ||{Q10_1}||{Q10_1.shown}||{Q10_3=='Y'} |- |X||Câu hỏi soạn sẵn||Q11|| || || || ||{Q11.shown}|| |- |D||Ngày||Q12|| || || ||{Q12}||{Q12.shown}|| |- |*||Phương trình||Q13|| || || ||{Q13}||{Q13.shown}||{Q13>5} |- |~124~||Tải tệp lên (ghi lại số lượng tệp đã tải lên)||Q14|| || || ||{Q14}|| ||{Q14>0} |- |G||Danh sách thả xuống về giới tính||Q15|| ||M,F|| ||{Q15}||{Q15.shown}||{Q15=='M'} |- |U||Văn bản miễn phí khổng lồ||Q16|| || || ||{Q16}||{Q16.shown}||{strlen(Q16)>100} |- |I||Câu hỏi ngôn ngữ||Q17|| || || ||{Q17}||{Q17.shown}||{Q17=='en'} |- |!||Danh sách - Thả xuống||Q18|| ||1-5|| ||{Q18}||{Q18.shown}||{Q18==3} |- |L||Danh sách thả xuống/Danh sách nút radio||Q19|| ||AZ|| ||{Q19}||{Q19.shown}||{Q19=='X'} |- |O||Danh sách có trình đơn thả xuống nhận xét/Danh sách nút radio + vùng văn bản||Q20 || ||AF|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'} |- |T||Văn bản dài miễn phí||Q21|| || || ||{Q21}||{Q21.shown}||{strstr(Q21,'hello')>0} |- |M||Hộp kiểm tra nhiều lựa chọn||Q22||AF, other| | || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'} |- |P||Hộp kiểm trắc nghiệm có nhận xét + Văn bản||Q23||AF|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.shown}||{!is_empty(Q23)} |- |K||Câu hỏi nhiều số||Q24||self,mẹ,bố || || ||{Q24_self}||{Q24_self.shown}||{Q24_self>30} |- |Q||Nhiều văn bản ngắn||Q25||AF|| || ||{Q25_B}||{Q25_B.shown}||{substr(Q25_B,1,1)=='Q'} |- |N||Loại câu hỏi số||Q26|| || || ||{Q26}||{Q26.shown}||{Q26 > 30} |- |R||Phong cách xếp hạng||Q27||1-4|| || ||{Q27_1}||{Q27_1.shown}||{Q27_1==3} |- |S||Văn bản ngắn miễn phí||Q28|| || || ||{Q28}||{Q28.shown}||{Q28=='mine'} |- |Y||Có/Không nút radio||Q29|| || || ||{Q29}||{Q29.shown}||{Q29=='Y'} |} <span id="The_reserved_'this',_'self',_and_'that'_variables"></span> ==Các biến 'cái này', 'bản thân' và 'cái kia' dành riêng== Thông thường, bạn muốn đánh giá tất cả các phần của một câu hỏi, chẳng hạn như đếm xem có bao nhiêu câu hỏi phụ đã được trả lời hoặc tính tổng điểm. Đôi khi, bạn chỉ muốn xử lý một số hàng hoặc cột nhất định của câu hỏi (chẳng hạn như lấy tổng hàng hoặc cột và lưu trữ chúng trong cơ sở dữ liệu). Các biến dành riêng này làm cho quá trình đó tương đối dễ dàng. Biến 'this' chỉ được sử dụng trong các tùy chọn câu hỏi nâng cao "Phương trình xác thực toàn bộ câu hỏi" và "Phương trình xác thực câu hỏi phụ". Nó mở rộng đến tên biến của từng ô trong các câu hỏi đó. Vì vậy, nếu bạn muốn đảm bảo rằng mỗi mục nhập lớn hơn ba, bạn nên đặt "phương trình xác thực câu hỏi phụ" thành (this > 3). Biến 'self' và 'that' mạnh hơn và đóng vai trò là macro được mở rộng trước khi xử lý các phương trình. Các lựa chọn cú pháp là: *self *self.''suffix'' *self.''sub-selector'' *self.''sub-selector''.'' hậu tố'' ''hậu tố'' là bất kỳ hậu tố qcode thông thường nào (ví dụ: NAOK, giá trị, được hiển thị) ''bộ chọn phụ'' là một trong: *nhận xét - chỉ những câu hỏi phụ là nhận xét (ví dụ: từ nhiều lựa chọn có nhận xét và danh sách có nhận xét) *nocomments - chỉ những câu hỏi phụ không phải là nhận xét *sq_X - trong đó X là mã định danh hàng hoặc cột. Chỉ những câu hỏi phụ phù hợp với mẫu X mới được chọn. Lưu ý rằng việc tìm kiếm được thực hiện trên mã định danh mã hoàn chỉnh, sau đó khớp sq_X và bao gồm các câu hỏi phụ nX, X, Xn (ví dụ: nếu bạn sử dụng sq_1 thì các câu hỏi phụ a1, 1a, 1, 11 hoặc 001 sẽ được bao gồm). Chú ý đến loại câu hỏi thang đo kép trong đó mã câu hỏi phụ là QCODE_SQCODE_1 và QCODE_SQCODE_1 cũng như loại câu hỏi xếp hạng trong đó mã câu hỏi phụ là QCODE_1,QCODE_2 .... *nosq_X - trong đó X là mã định danh hàng hoặc cột. Chỉ những câu hỏi phụ không khớp với mẫu X mới được chọn. Lưu ý việc tìm kiếm được thực hiện trên mã định danh hoàn chỉnh, sau đó khớp nosq_X và không bao gồm các câu hỏi phụ nX, X, Xn Ví dụ: *Có phần nào của câu hỏi được trả lời không? {count(self.NAOK)>0} *Điểm đánh giá cho câu hỏi này là bao nhiêu? {tổng(self.value)} Bạn cũng có thể sử dụng những thông số này để lấy tổng số hàng và cột. Giả sử bạn có một dãy số với các hàng AE và cột 1-5. *Tổng cuối cùng là bao nhiêu? {sum(self.NAOK)} *Tổng hàng B là bao nhiêu? {sum(self.sq_B.NAOK)} *Tổng số cột 3 là bao nhiêu? {tổng(self.sq_3.NAOK)} Biến 'that' giống như biến 'self' nhưng cho phép bạn tham khảo các câu hỏi khác. Cú pháp của nó là: *that.''qname'' *that.''qname''.''suffix'' *that.''qname''.''sub-selector' ' *that.''qname''.''bộ chọn phụ''.''hậu tố'' ''qname'' là tên câu hỏi không có bất kỳ phần mở rộng câu hỏi phụ nào. Vì vậy, giả sử bạn tạo một câu hỏi 'q1', đó là ''qname'' Ví dụ: *Có phần nào của câu hỏi q1 được trả lời không? {count(that.q1.NAOK)>0} *Điểm đánh giá cho quý 2 là bao nhiêu? {sum(that.q2.NAOK)} *Tổng cộng của q3 là bao nhiêu? {sum(that.q3.NAOK)} *Tổng hàng C trong q4 là bao nhiêu? {sum(that.q4.sq_C.NAOK)} *Tổng cột 2 trong q4 là bao nhiêu? {tổng(that.q4.sq_2.NAOK)} Các biến 'self' và 'that' có thể được sử dụng theo bất kỳ mức độ liên quan, xác thực hoặc điều chỉnh nào. Một lưu ý là khi bạn sử dụng tính năng [[Hiển thị tệp logic|Hiển thị tệp logic]], nó sẽ hiển thị cho bạn giá trị mở rộng của 'self' và 'that'. Điều này cho phép bạn xem phương trình thực tế sẽ được tạo để bạn (và Trình quản lý biểu thức) có thể xác thực rằng các biến tồn tại. Điều này có vẻ khó hiểu vì bạn có thể thấy các phương trình khá dài. Tuy nhiên, nếu bạn chỉnh sửa câu hỏi, bạn sẽ thấy phương trình ban đầu sử dụng 'self' và/hoặc 'that' Cũng lưu ý rằng bạn không nên sử dụng các biến này nếu (a) bạn muốn đặt tên rõ ràng cho từng biến được sử dụng trong phương trình hoặc (b) sử dụng các biến không có câu hỏi phụ (ví dụ: câu hỏi trả lời đơn). Trong những trường hợp đó, việc thêm 'that' vào tiền tố một biến là quá mức cần thiết và bạn có nguy cơ nhận được kết quả không mong muốn. <span id="Usage_of_NAOK"></span> ==Cách sử dụng NAOK== NAOK --> "Không áp dụng" (NA) được rồi (OK) Sử dụng NAOK, có nghĩa là tất cả hoặc một số biến không liên quan (ví dụ: "Không áp dụng được" (NA) là được (OK)). Khi bạn đặt một số biến từ câu hỏi vào bất kỳ phương trình nào: nếu câu hỏi này (hoặc câu hỏi phụ) bị ẩn theo điều kiện: điều này sẽ vô hiệu hóa tất cả phương trình. Ví dụ: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) luôn cho một chuỗi trống nếu một câu hỏi con của Q1 bị lọc. Để đếm số lượng câu hỏi con được kiểm tra trong câu hỏi đó có thể được tính (Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Nếu câu hỏi phụ bị ẩn: Trình quản lý biểu thức trả về một chuỗi trống. Không có NAOK: nếu một câu hỏi hoặc một câu hỏi phụ bị ẩn: Trình quản lý biểu thức luôn trả về một chuỗi trống, tương tự để trả về sai. .shown luôn sử dụng hệ thống NAOK (chuỗi trống nếu bị ẩn) nhưng nếu bạn cần mã của câu trả lời: bạn nên thêm .NAOK sau mã câu hỏi. Ngoại trừ nếu bạn cần nó và biết bạn làm gì. Một ví dụ và thông tin khác được cung cấp tại [[#Overriding_Cascading_Conditions|Ghi đè các điều kiện xếp tầng]] <span id="Access_to_Functions"></span> ==Truy cập vào chức năng== Trình quản lý Biểu thức cung cấp quyền truy cập vào các hàm toán học, chuỗi và do người dùng xác định, như được hiển thị bên dưới. Nó có PHP và JavaScript tương đương cho các hàm này để chúng hoạt động giống hệt nhau ở phía máy chủ (PHP) và phía máy khách (JavaScript). Thật dễ dàng để thêm các chức năng mới. <span id="Implemented_Functions"></span> ===Chức năng được triển khai=== Các chức năng sau hiện có sẵn: {| class="wikitable" !Function!!Meaning!!Syntax |- |[http://www.php.net/manual/en/function.abs.php abs]||Absolute value||number abs(number) |- |[http://www.php.net/manual/en/function.acos.php acos]||Arc cosine||number acos(number) |- |[http://www.php.net/manual/en/function.addslashes.php addslashes]||Quote string with slashes||string addslashes(string) |- |[http://www.php.net/manual/en/function.asin.php asin]||Arc sine||number asin(number) |- |[http://www.php.net/manual/en/function.atan.php atan]||Arc tangent||number atan(number) |- |[http://www.php.net/manual/en/function.atan2.php atan2]||Arc tangent of two variables||number atan2(number, number) |- |[http://www.php.net/manual/en/function.ceil.php ceil]||Round fractions up||number ceil(number) |- |[http://www.php.net/manual/en/function.checkdate.php checkdate]||Returns true(1) if it is a valid date in gregorian calendar||bool checkdate(month,day,year) |- |convert_value||Convert a numerical value using a inputTable and outputTable of numerical values||number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |- |[http://www.php.net/manual/en/function.cos.php cos]||Cosine||number cos(number) |- |count||count the number of answered (non-blank) questions in the list||number count(arg1, arg12, ..., argN) |- |countif||Count the number of answered questions in the list equal to the first argument||number countif(matches, arg1, arg2, ... argN) |- |countifop||Count the number of answered questions in the list which pass the criteria (arg op value)||number countifop(op, value, arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.date.php date]||Format a local date/time||string date(format <nowiki>[</nowiki>, timestamp=time()]) |- |[http://www.php.net/manual/en/function.exp.php exp]||Calculates the exponent of e||number exp(number) |- |fixnum||Display numbers with comma as radix separator, if needed||string fixnum(number) |- |[http://www.php.net/manual/en/function.floor.php floor]||Round fractions down||number floor(number) |- |[http://www.php.net/manual/en/function.gmdate.php gmdate]||Format a GMT date/time||string gmdate(format <nowiki>[</nowiki>, timestamp=time()]) |- |[http://www.php.net/manual/en/function.html-entity-decode.php html_entity_decode]||Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8)||string html_entity_decode(string) |- |[http://www.php.net/manual/en/function.htmlentities.php htmlentities]||Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8)||string htmlentities(string) |- |[http://www.php.net/manual/en/function.htmlspecialchars.php expr_mgr_htmlspecialchars]||Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8)||string htmlspecialchars(string) |- |[http://www.php.net/manual/en/function.htmlspecialchars-decode.php expr_mgr_htmlspecialchars_decode]||Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8)||string htmlspecialchars_decode(string) |- |[http://www.php.net/manual/en/function.idate.php idate]||Format a local time/date as integer||string idate(string <nowiki>[</nowiki>, timestamp=time()]) |- |if{{UpdatedIn|3.0.2}}||Excel-style if(test,result_if_true<nowiki>[</nowiki>,result_if_false = ""<nowiki>]</nowiki>)||if(test,result_if_true<nowiki>[</nowiki>,result_if_false = ""<nowiki>]</nowiki>) |- |[http://www.php.net/manual/en/function.implode.php implode]||Join array elements with a string||string implode(glue,arg1,arg2,...,argN) |- |[http://www.php.net/manual/en/function.intval.php intval]||Get the integer value of a variable||int intval(number <nowiki>[</nowiki>, base=10]) |- |[http://www.php.net/manual/en/function.empty.php is_empty]||Determine whether a variable is considered to be empty||bool is_empty(var) |- |[http://www.php.net/manual/en/function.is-float.php is_float]||Finds whether the type of a variable is float||bool is_float(var) |- |[http://www.php.net/manual/en/function.is-int.php is_int]||Find whether the type of a variable is integer||bool is_int(var) |- |[http://www.php.net/manual/en/function.is-nan.php is_nan]||Finds whether a value is not a number||bool is_nan(var) |- |[http://www.php.net/manual/en/function.is-null.php is_null]||Finds whether a variable is NULL||bool is_null(var) |- |[http://www.php.net/manual/en/function.is-numeric.php is_numeric]||Finds whether a variable is a number or a numeric string||bool is_numeric(var) |- |[http://www.php.net/manual/en/function.is-string.php is_string]||Find whether the type of a variable is string||bool is_string(var) |- |join{{NewIn|2.0|b=130129}}||Join elements as a new string||join(arg1, arg2, ... argN) |- |list||Return comma-separated list of non-blank values||string list(arg1, arg2, ... argN) |- |listifop{{NewIn|3.16.1}}||Return a 'glue'-separated list of the specified question property (retProp) from questions in the list which pass the criteria (cmpProp op value)||string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |- |[http://www.php.net/manual/en/function.log.php log]|| The logarithm of number to base, if given, or the natural logarithm. ||number log(number,base=e) |- |[http://www.php.net/manual/en/function.ltrim.php ltrim]||Strip whitespace (or other characters) from the beginning of a string||string ltrim(string <nowiki>[</nowiki>, charlist]) |- |[http://www.php.net/manual/en/function.max.php max]||Find highest value||number max(arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.min.php min]||Find lowest value||number min(arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.mktime.php mktime]||Get UNIX timestamp for a date (each of the 6 arguments are optional)||number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |- |modulo-function||The modulo function is '''not supported''' yet. You can use the floor() function instead||floor(x/y)==(x/y) |- |[http://www.php.net/manual/en/function.nl2br.php nl2br]||Inserts HTML line breaks before all newlines in a string||string nl2br(string) |- |[http://www.php.net/manual/en/function.number-format.php number_format]||Format a number with grouped thousands||string number_format(number) |- |pi||Get value of pi||number pi() |- |[http://www.php.net/manual/en/function.pow.php pow]||Exponential expression||number pow(base, exp) |- |[http://www.php.net/manual/en/function.quoted-printable-decode.php quoted_printable_decode]||Convert a quoted-printable string to an 8 bit string||string quoted_printable_decode(string) |- |[http://www.php.net/manual/en/function.quoted-printable-encode.php quoted_printable_encode]||Convert a 8 bit string to a quoted-printable string||string quoted_printable_encode(string) |- |[http://www.php.net/manual/en/function.quotemeta.php quotemeta]||Quote meta characters||string quotemeta(string) |- |[http://www.php.net/manual/en/function.rand.php rand]||Generate a random integer, see [[Expression Manager sample surveys#Randomly Ask One Question Per Group|this example]]||int rand() OR int rand(min, max) |- |regexMatch||compare a string to a [[Using regular expressions|regular expression]]||bool regexMatch(pattern,input) |- |[http://www.php.net/manual/en/function.round.php round]||Rounds a number to an optional precision||number round(val <nowiki>[</nowiki>, precision]) |- |[http://www.php.net/manual/en/function.rtrim.php rtrim]||Strip whitespace (or other characters) from the end of a string||string rtrim(string <nowiki>[</nowiki>, charlist]) |- |[http://www.php.net/manual/en/function.sin.php sin]||Sine||number sin(arg) |- |[http://www.php.net/manual/en/function.sprintf.php sprintf]||Return a formatted string||string sprintf(format, arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.sqrt.php sqrt]||Square root||number sqrt(arg) |- |stddev||Calculate the Sample Standard Deviation for the list of numbers||number stddev(arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.str-pad.php str_pad]||Pad a string to a certain length with another string||string str_pad(input, pad_length <nowiki>[</nowiki>, pad_string]) |- |[http://www.php.net/manual/en/function.str-repeat.php str_repeat]||Repeat a string||string str_repeat(input, multiplier) |- |[http://www.php.net/manual/en/function.str-replace.php str_replace]||Replace all occurrences of the search string with the replacement string||string str_replace(search, replace, subject) |- |[http://www.php.net/manual/en/function.strcasecmp.php strcasecmp]||Binary safe case-insensitive string comparison||int strcasecmp(str1, str2) |- |[http://www.php.net/manual/en/function.strcmp.php strcmp]||Binary safe string comparison||int strcmp(str1, str2) |- |[http://www.php.net/manual/en/function.strip-tags.php strip_tags]||Strip HTML and PHP tags from a string||string strip_tags(str, allowable_tags) |- |[http://www.php.net/manual/en/function.stripos.php stripos]||Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found)|||int stripos(haystack, needle <nowiki>[</nowiki>, offset=0]) |- |[http://www.php.net/manual/en/function.stripslashes.php stripslashes]||Un-quotes a quoted string||string stripslashes(string) |- |[http://www.php.net/manual/en/function.stristr.php stristr]||Case-insensitive strstr||string stristr(haystack, needle <nowiki>[</nowiki>, before_needle=false]) |- |[http://www.php.net/manual/en/function.strlen.php strlen]||Get string length||int strlen(string) |- |[http://www.php.net/manual/en/function.strpos.php strpos]||Find position of first occurrence of an unicode string (starting by 0, return false if not found)||int strpos(haystack, needle <nowiki>[</nowiki> offset=0]) |- |[http://www.php.net/manual/en/function.strrev.php strrev]||Reverse a string||string strrev(string) |- |[http://www.php.net/manual/en/function.strstr.php strstr]||Find first occurrence of a string||string strstr(haystack, needle<nowiki>[</nowiki>, before_needle=false]) |- |[http://www.php.net/manual/en/function.strtolower.php strtolower]||Make a string lowercase||string strtolower(string) |- |[http://www.php.net/manual/en/function.strtotime.php strtotime]||Parse about any English textual datetime description into a Unix timestamp||int strtotime(string) |- |[http://www.php.net/manual/en/function.strtoupper.php strtoupper]||Make a string uppercase||string strtoupper(string) |- |[http://www.php.net/manual/en/function.substr.php substr]||Return part of an unicode string||string substr(string, start <nowiki>[</nowiki>, length]) |- |sum||Calculate the sum of values in an array||number sum(arg1, arg2, ... argN) |- |sumifop||Sum the values of answered questions in the list which pass the criteria (arg op value)||number sumifop(op, value, arg1, arg2, ... argN) |- |[http://www.php.net/manual/en/function.tan.php tan]||Tangent||number tan(arg) |- |[http://www.php.net/manual/en/function.time.php time]||Return current UNIX timestamp||number time() |- |[http://www.php.net/manual/en/function.trim.php trim]||Strip whitespace (or other characters) from the beginning and end of a string||string trim(string <nowiki>[</nowiki>, charlist]) |- |[http://www.php.net/manual/en/function.ucwords.php ucwords]||Uppercase the first character of each word in a string||string ucwords(string) |- |unique||Returns true if all non-empty responses are unique||boolean unique(arg1, ..., argN) |} <span id="Functions_that_are_Planned_or_Being_Considered"></span> ===Các chức năng đã được lên kế hoạch hoặc đang được xem xét=== Các chức năng khác đã được lên kế hoạch (hoặc đang được xem xét) nhưng chưa được triển khai bao gồm: Một số trong số này là để tương thích ngược với một công cụ khảo sát khác. {| class="wikitable" !Cú pháp!!Ý nghĩa!!Comments |- |e()||trả về giá trị của e|| |- |formatDate(X, PAT)||trả về giá trị chuỗi của ngày X được định dạng theo mẫu định dạng dữ liệu Java PAT|| |- |formatNumber(X,PAT)||trả về giá trị chuỗi của số X được định dạng theo số Java mẫu định dạng PAT|| |- |getAnsOption(X)|| [[ExpressionAnswerOptions|Core plugin ExpressionAnswerOptions ]] || |- |getAnsOption(X,Y)|| [[ExpressionAnswerOptions|Core plugin ExpressionAnswerOptions ]] || |- |getRelevance(X)||trả về phương trình liên quan cho câu hỏi X|| |- |getStartTime()||trả về ngày tương ứng với thời gian hệ thống khi cuộc phỏng vấn được bắt đầu|| |- |getType(X)||trả về tên chuỗi của kiểu dữ liệu - ví dụ *NA* if isNA()|| |- |gotoFirst()||chuyển đến nhóm câu hỏi có liên quan đầu tiên - điều này vi phạm quy trình thông thường của hệ thống|| |- |gotoNext()||chuyển sang nhóm câu hỏi tiếp theo câu hỏi có liên quan - điều này vi phạm quy trình bình thường của hệ thống|| |- |gotoPrevious()||chuyển đến nhóm câu hỏi liên quan trước đó - điều này vi phạm quy trình bình thường của hệ thống|| | - |isAsked(X)||trả về true nếu câu trả lời không phải là *NA*, *INVALID* hoặc *UNASKED*|| |- |isInvalid(X)||trả về true nếu câu trả lời thuộc loại *INVALID*|| |- |isNA(X)||trả về true nếu câu trả lời thuộc loại *NA*|| |- |isNotUnderstood(X )||trả về true nếu câu trả lời thuộc loại *HUH*|| |- |isRefused(X)||trả về true nếu câu trả lời thuộc loại *REFUSED*|| |- |is Special(X)|| trả về true nếu câu trả lời thuộc loại *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* hoặc *HUH*|| |- |isUnknown(X)||trả về true nếu câu trả lời thuộc loại *UNKNOWN*|| |- |jumpTo(X)||chuyển đến nhóm chứa câu hỏi được đặt tên -- điều này vi phạm quy tắc thông thường luồng của hệ thống|| |- |jumpToFirstUnasked()||chuyển đến câu hỏi chưa được hỏi đầu tiên <strike>, do đó bỏ qua các câu hỏi đã trả lời trước đó</strike> , điều này vi phạm quy trình bình thường của hệ thống|| |- | LastIndexOf(X,Y)||trả về chỉ mục cuối cùng (cơ sở 0) của chuỗi Y trong chuỗi X. Trả về -1 nếu Y không được chứa trong X|| |- |list(X,.. .)||một chuỗi chứa danh sách các giá trị dương được phân tách bằng dấu phẩy với "và" ngăn cách hai giá trị cuối cùng|| |- |mean(X,...)||trả về giá trị trung bình của danh sách của các giá trị|| |- |numAnsOptions(X)||trả về số phương án trả lời mà câu hỏi X có|| |- |orlist(X,...)|| một chuỗi chứa danh sách các giá trị dương được phân tách bằng dấu phẩy, với "hoặc" ngăn cách hai giá trị cuối cùng|| |- |parseDate(X,PAT)||trả về giá trị ngày của chuỗi X được phân tích cú pháp bằng ngày Java mẫu định dạng PAT|| |- |parseNumber(X,PAT)||trả về giá trị số của chuỗi X được phân tích cú pháp bằng mẫu định dạng số Java PAT|| |- |showAllResponsesExcept( questionList ,attributeList,attributeTitleList)||questionList = danh sách định danh câu hỏi được phân cách bằng dấu gạch ngang; attributeList = danh sách các thuộc tính được phân cách bằng dấu gạch ngang (như câu hỏi #, tiêu đề, văn bản, loại - để bạn có thể quyết định nội dung sẽ hiển thị); attributeTitleList = danh sách các tiêu đề bảng được phân tách bằng dấu sổ đứng, do đó có thể quốc tế hóa báo cáo.|| |- |showTheyResponses( questionList,attributeList,attributeTitleList)||questionList = danh sách các định danh câu hỏi được phân tách bằng dấu gạch ngang; attributeList = danh sách các thuộc tính được phân cách bằng dấu gạch ngang (như câu hỏi #, tiêu đề, văn bản, loại - để bạn có thể quyết định nội dung sẽ hiển thị); attributeTitleList = danh sách các tiêu đề bảng được phân cách bằng dấu gạch ngang, do đó có thể quốc tế hóa báo cáo.|| |} <span id="Expression_Manager_Knows_Which_Variables_are_Local"></span> ==Trình quản lý biểu thức biết biến nào là cục bộ== Để xây dựng JavaScript cho trang đúng cách, Trình quản lý biểu thức cần biết biến nào được đặt trên trang và ID JavaScript của chúng là gì (ví dụ: đối với document.getElementById(x)). Nó cũng phải biết những biến nào được đặt trên các trang khác (để có thể đảm bảo rằng những biến cần thiết<input type='hidden' value='x'> các trường có sẵn và có dân cư). <span id="Cascading_Conditions"></span> ==Điều kiện xếp tầng== Nếu bất kỳ biến nào không liên quan thì toàn bộ phương trình sẽ không liên quan (sai). Ví dụ: trong bảng sau, N/A có nghĩa là một trong các biến không liên quan {| class="wikitable" !Operator!!Ví dụ!!a!!b!!Kết quả |- |<nowiki> + (đơn nhất)</nowiki> ||<nowiki> +a</nowiki> ||Không áp dụng|| ||false |- |- (đơn nguyên)||-a||N/A|| ||false |- |!||!a||N/A|| ||false |- |== (hoặc eq)||a == b||N/A||5||false |- |== (hoặc eq) ||a == b||N/A||0||false |- |== (hoặc eq)||a == b||N/A||N/A|| false |- |!= (hoặc ne)||a != b||N/A||5|| false |- |!= (hoặc ne)||a != b||N/A||N/A|| false |- |!= (hoặc ne)||a != b||N/A||0||false |- |> (hoặc gt)||a > b||N/A||5|| false |- |>= (hoặc ge)||a >= b||N/A||5||false |- |< (hoặc lt)||a < b||N/A||5||false |- |<= (hoặc le)||a <= b||N/A||5||false |- |và||a và b||N/A||5||false |- |và||a và b||N/A||N/A||false! N!|- |hoặc||a hoặc b||N/A||N/A||false |- |hoặc||a hoặc b||N/A||5 ||false |- |<nowiki> +</nowiki> ||a + 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 |- |hàm||tổng(a,b,b)||N/A|| 5||false |- |hàm||max(a,b)||N/A||5||false |- |hàm||min(a,b )||N/A||5||false |- |function||implode(', ',a,b,a,b)||N/A||5||false! N!|- |hàm||if(a,a,b)||N/A||5||false |- |hàm||is_empty(a)||N/ A|| ||false |- |hàm||is_empty(a)||0 (hoặc để trống)|| ||true |- |hàm||!is_empty(a)||N/A|| ||false |} <span id="Overriding_Cascading_Conditions"></span> ===Ghi đè các điều kiện xếp tầng=== Giả sử bạn muốn hiển thị tổng số câu trả lời có liên quan. Bạn có thể thử sử dụng phương trình {sum(q1,q2,q3,...,qN)}. Tuy nhiên, điều này được dịch nội bộ sang LEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Vì vậy, nếu bất kỳ giá trị q1-qN nào không liên quan thì phương trình sẽ luôn trả về sai. Trong trường hợp này, sum() sẽ hiển thị 0 cho đến khi tất cả các câu hỏi được trả lời. Để giải quyết vấn đề này, mỗi biến có thể có hậu tố ".NAOK" (có nghĩa là Không áp dụng được) được thêm vào nó. Trong những trường hợp như vậy, hành vi sau đây xảy ra. Giả sử bạn có một biến q1.NAOK #q1 chưa được thêm vào mệnh đề LEManyNA() #LEMval('q1') sẽ tiếp tục kiểm tra xem phản hồi có phù hợp hay không và sẽ trả về<nowiki> ''</nowiki> nếu không (vì vậy các phản hồi không liên quan riêng lẻ sẽ bị bỏ qua, nhưng chúng sẽ không làm mất hiệu lực toàn bộ biểu thức). Vì vậy, giải pháp cho bài toán tổng đang chạy là sử dụng phương trình sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK). Việc sử dụng hậu tố .NAOK cũng cho phép tác giả thiết kế các khảo sát có một số đường dẫn có thể nhưng sau đó hội tụ về các đường dẫn chung. Ví dụ: giả sử các đối tượng trả lời một cuộc khảo sát theo cách nằm ngoài phạm vi phản hồi thông thường. Tác giả có thể cảnh báo đối tượng rằng họ có thể không nhận được kết quả hợp lệ và hỏi họ xem họ có thực sự muốn tiếp tục cuộc khảo sát hay không. Nếu họ nói Có thì các câu hỏi còn lại sẽ được hiển thị. Điều kiện cho "các câu hỏi còn lại" sẽ kiểm tra xem các câu trả lời ban đầu có được trả lời trong phạm vi bình thường hay không HOẶC đối tượng có nói Có với câu hỏi chỉ phù hợp nếu họ trả lời ngoài phạm vi bình thường hay không. <span id="How_does_Expression_Manager_Support_Conditional_Micro-Tailoring?"></span> ==Trình quản lý biểu thức hỗ trợ may vi mô có điều kiện như thế nào?== Đây là một ví dụ về điều chỉnh vi mô (trong đó Loại câu hỏi=='expr' có nghĩa là Phương trình): {| class="wikitable" !Mã câu hỏi!!Mức độ liên quan!!Loại câu hỏi!!Câu hỏi |- |tên||1||văn bản||Tên bạn là gì? |- |age||1||text||Bạn bao nhiêu tuổi? |- |badage||!is_empty(age)||expr||{(tuổi<16) hoặc (tuổi>80 )} |- |agestop||badage||message||Xin lỗi, {name}, bạn quá {if( (age<16),'young',if( (age>80), 'già','trung niên') ) } cho bài kiểm tra này. |- |kids||!badage||yesno||Bạn có con không? |- |parents ||1||expr||{!badage && Kids=='Y'} |- |numKids||parents||text||Bạn có bao nhiêu đứa con? |- |kid1||parents && numKids >= 1||text||Con đầu lòng của bạn bao nhiêu tuổi? |- |kid2||parents && numKids >= 2||text||Bao nhiêu tuổi đứa con thứ hai của bạn? |- |kid3||parents && numKids >= 3||text||Con thứ ba của bạn bao nhiêu tuổi? |- |kid4||parents && numKids > = 4||text||Con thứ tư của bạn bao nhiêu tuổi? |- |kid5||parents && numKids >= 5||text||Con thứ năm của bạn bao nhiêu tuổi? |- |sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |- |report||parents| |yesno||{name}, bạn đã nói rằng bạn {age} và bạn có {numKids}. Tổng số tuổi của {min(numKids,5)} đứa con đầu tiên của bạn là {sumage} |} Tất cả những câu hỏi này có thể nằm trên một trang duy nhất (ví dụ: trong cùng một nhóm) và chỉ những câu hỏi có liên quan mới được hiển thị. Hơn nữa, khi bạn nhập độ tuổi của trẻ, biểu thức sum() trong câu hỏi cuối cùng sẽ tự động cập nhật trên trang. <html>Trình quản lý biểu thức cung cấp chức năng này bằng cách bao quanh mỗi biểu thức bằng một tên được đặt tên<nowiki></nowiki> <span>yếu tố. Mỗi khi một giá trị thay đổi, nó sẽ tính toán lại biểu thức sẽ xuất hiện trong đó</span><nowiki></nowiki> <span><span>phần tử và tái tạo màn hình. Bạn có thể có hàng chục, thậm chí hàng trăm biểu thức được tùy chỉnh như vậy trên cùng một trang và trang sẽ hiển thị lại tất cả chúng trong một lần làm mới màn hình.</span></span> <span id="Mapping_of_LimeSurvey_1.91+_to_Expression_Manager_Functionality"></span> ==Ánh xạ của LimeSurvey 1.91+ tới Chức năng Trình quản lý Biểu thức== {| class="wikitable" !Tính năng cũ!!Tính năng mới!!Nhận xét |- |Điều kiện||Mức độ liên quan||Bạn có thể sử dụng các phương trình có điều kiện rất phức tạp và truy cập vào phạm vi biến rộng hơn!N !|- |Đánh giá||Phương trình||Mọi điểm đánh giá đều có thể được cấu trúc lại thành Phương trình. Điều này vừa đảm bảo rằng điểm số được ghi vào cơ sở dữ liệu, vừa cho phép bạn xem các thay đổi động đối với giá trị điểm trên trang hiện tại |- |Replacements||Trình quản lý biểu thức||Công cụ cốt lõi lấy chuỗi đầu vào và xử lý mọi thứ trong dấu ngoặc nhọn dưới dạng Biểu thức - vì vậy, nó xử lý tất cả các loại thay thế lịch sử. Để tránh làm hỏng JavaScript nhúng, Trình quản lý biểu thức chỉ xử lý nội dung giữa các dấu ngoặc nhọn miễn là (a) không có khoảng trắng ở đầu hoặc cuối trong dấu ngoặc nhọn - ví dụ: {expr} là một biểu thức, nhưng { expr}, {expr }, và { expr } không phải là biểu thức. Hơn nữa, Trình quản lý biểu thức không xử lý nội dung trong các chuỗi riêng của nó (ví dụ: {list('hi','there {dấu ngoặc}')} tạo ra "xin chào {dấu ngoặc}"). Nó cũng bỏ qua các dấu ngoặc nhọn thoát (ví dụ \{đây không phải là một biểu thức\}) |- |Validation||Trình quản lý biểu thức||Kế hoạch là lấy Thuộc tính câu hỏi tối thiểu/tối đa hiện tại và có Trình quản lý biểu thức xử lý chúng. Bằng cách đó, các giá trị tối thiểu/tối đa có thể là biểu thức |} <span id="Syntax_Highlighting"></span> =Đánh dấu cú pháp= Để giúp nhập và xác thực biểu thức, EM cung cấp tính năng tô sáng cú pháp với các tính năng sau: <span id="Types_and_Meanings_of_Syntax_Highlighting"></span> ==Các loại và ý nghĩa của việc tô sáng cú pháp== {| class="wikitable" !Color!!Sample!!Ý nghĩa!!Chú giải công cụ!!Nhận xét |- |tan nền||style='background-color: #eee8aa'|Sample||the toàn bộ phương trình||none||Bất kỳ nội dung nào trong dấu ngoặc nhọn được nhận dạng là phương trình (ví dụ: không có khoảng trắng ở đầu hoặc cuối) sẽ được mã hóa màu với nền màu nâu vàng để giúp phân biệt với văn bản xung quanh |- |văn bản màu đỏ đậm||style='color:#ff0000; nền-color:#eee8aa'|'''Sample'''||Một lỗi||Một số giải thích về lỗi||Có thể là một biến không xác định hoặc lỗi trong chức năng, .... Khảo sát có thể bị hỏng hoàn toàn, điều này không 'không hiển thị cho người dùng công cộng. |- |blue text||style='color:#0000ff; nền-color:#eee8aa'|Sample||tên hàm||ý nghĩa và cú pháp được phép||tên hàm hoặc những thứ phải là hàm vì chúng được theo sau bởi dấu ngoặc đơn mở, được trình bày bằng văn bản màu xanh đậm. Chú giải công cụ hiển thị ý nghĩa và cú pháp cho phép của hàm. |- |grey text||style='color:#808080; nền-color:#eee8aa'|Sample||chuỗi||none||các chuỗi trích dẫn đơn và kép được hiển thị bằng văn bản màu xám |- |văn bản màu lục lam||style='color:#4169e1; Background-color:#eee8aa'|Sample||biến được đặt trên cùng một trang,||<nowiki> [</nowiki> tên hoặc mã SGQA]: câu hỏi; giá trị; Câu trả lờiDanh sách hiển thị mã cho từng giá trị||Bất kỳ biến nào được đặt trên cùng một trang cho câu hỏi hiện tại đều được hiển thị bằng văn bản màu lục lam, cho thấy biến đó có thể được cập nhật bằng javascript. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |- |green text||style='color:#008000; màu nền:#eee8aa'|Mẫu||biến được đặt ở trang trước||<nowiki> [</nowiki> tên hoặc mã SGQA]: câu hỏi; giá trị; câu trả lờiDanh sách hiển thị mã cho từng giá trị||Bất kỳ biến nào được đặt trên trang trước sẽ được hiển thị bằng văn bản màu xanh đậm. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |- |văn bản màu hồng đậm||style='color:#9370db; Background-color:#eee8aa'|Sample||biến được đặt trên trang sau <sup>nói chung: trống khi bắt đầu khảo sát, nhưng có thể điền chỉ mục hoặc di chuyển || trước đó</sup><nowiki> [</nowiki> tên hoặc mã SGQA]: câu hỏi; giá trị; câu trả lờiDanh sách hiển thị mã cho từng giá trị||Bất kỳ biến nào được đặt trên trang tiếp theo sẽ được hiển thị bằng văn bản màu hồng đậm. Chú giải công cụ hiển thị tên của nó (nếu bạn đã sử dụng INSERTANS:xxx) hoặc mã SGQA (nếu bạn đã sử dụng hệ thống đặt tên mới), câu hỏi thực tế và giá trị hiện tại của nó (hoặc để trống nếu không được đặt). Nếu loại câu hỏi mong đợi phản hồi từ một tập hợp giá trị liệt kê, thì việc ánh xạ mã tới các giá trị hiển thị sẽ hiển thị. |- |bold tan text||style='color:#a0522d; Background-color:#eee8aa'|Sample||giá trị thay thế vôi||giá trị||Chuỗi thay thế vôi (như {TOKEN:xxx}, {PRIVACY_MESSAGE}) được hiển thị bằng văn bản màu nâu đậm. |- |văn bản màu đỏ||style='color:#ff4500; Background-color:#eee8aa'|Sample||toán tử gán (=) ||thông báo cảnh báo||Nếu bạn sử dụng một trong các toán tử gán (=) thì toán tử đó sẽ được hiển thị bằng văn bản màu đỏ. Điều này nhằm giúp ngăn chặn việc vô tình gán lại các giá trị khi bạn thực sự muốn kiểm tra xem a == b thay vì đặt giá trị của a = b. |- |văn bản đen bình thường||style=' màu đen; Background-color:#eee8aa'|Sample||punctuation||none||Tất cả các dấu câu khác trong biểu thức được hiển thị dưới dạng văn bản màu đen bình thường. |- |văn bản có hộp màu đỏ||một đường màu đỏ đậm bao quanh lỗi||lỗi cú pháp||mô tả lỗi||Mọi lỗi cú pháp được phát hiện đều được hiển thị bằng cách bao quanh lỗi bằng một hộp màu đỏ. Chú giải công cụ hiển thị lỗi. Các ví dụ bao gồm dấu ngoặc đơn không khớp, sử dụng các hàm không xác định, truyền sai số lượng đối số cho hàm, biểu thức có cấu trúc kém (ví dụ: thiếu toán tử giữa các biến), cố gắng gán giá trị mới cho biến chỉ đọc, cố gắng gán giá trị cho biến không- các biến hoặc sử dụng cú pháp không được hỗ trợ. Lưu ý rằng hệ thống phát hiện lỗi cú pháp chỉ có thể báo cáo một lỗi trong một biểu thức ngay cả khi có nhiều lỗi; tuy nhiên, nếu phát hiện bất kỳ lỗi nào, ít nhất một lỗi sẽ được hiển thị. |} <span id="Additional_Reading"></span> =Đọc thêm= <span id="Expression_Manager_sample_surveys"></span> ==[[Khảo sát mẫu Trình quản lý biểu thức|Khảo sát mẫu Trình quản lý biểu thức]]== <span id="Use_Cases_and_HowTos"></span> ==[[Cách thực hiện ExpressionScript|Các trường hợp sử dụng và Cách thực hiện]]== <span id="Step-by-Step_examples"></span> ==[[Ví dụ về ExpressionScript|Ví dụ từng bước]]== ==[[StatFunctions|Expression Manager statistic functions]]== <span id="Reference_for_Developers"></span> ==[[Trình quản lý biểu thức dành cho nhà phát triển|Tài liệu tham khảo dành cho nhà phát triển]]== <span id="RoadMap/Status/ToDo_List"></span> ==[[Lộ trình của Trình quản lý biểu thức|RoadMap/Trạng thái/Danh sách việc cần làm]]==