LimeSurvey Manual
Menu
Navigation
Main page
Recent changes
Random page
Help
Search
Special pages
Printable version
Recent changes
Help
English
Log in
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
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 - Min Dong Chinese
ce - Chechen
ceb - Cebuano
ch - Chamorro
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 - Crimean Tatar (Romania)
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
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 Chinese
gan-hans - Gan (Simplified)
gan-hant - Gan (Traditional)
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 Chinese
ht - Haitian Creole
hu - Hungarian
hu-formal - Hungarian (formal address)
hy - Armenian
hyw - Western Armenian
hz - Herero
ia - Interlingua
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
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 - Min Nan Chinese
nap - Neapolitan
nb - Norwegian Bokmål
nds - Low German
nds-nl - Low Saxon
ne - Nepali
new - Newari
ng - Ndonga
nia - Nias
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
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)
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)
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 Chinese
wuu-hans - Wu Chinese (Simplified)
wuu-hant - Wu Chinese (Traditional)
xal - Kalmyk
xh - Xhosa
xmf - Mingrelian
xsy - Saisiyat
yi - Yiddish
yo - Yoruba
yrl - Nheengatu
yue - Cantonese
yue-hans - Cantonese (Simplified)
yue-hant - Cantonese (Traditional)
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:Мениджър на изрази}}<languages /> __TOC__ <div class="simplebox">Забележка: Тази функция е налична само в LimeSurvey 1.92 или по-нова версия.</div> <span id="Quick_Start_Tutorial"></span> =Урок за бърз старт= <span id="Overview"></span> ==Общ преглед== Когато персонализирате анкетите си, обикновено се нуждаете от начин да посочите следното: #'''Навигация/Разклоняване''' - позволяване на отговорите на субекта да променят реда, в който се задават въпросите #'''Tailoring/ Piping''' - как да формулирате въпроса (като препращане към предишни отговори или свързване на изречения въз основа на броя или пола на вашите субекти) или как да генерирате персонализирани отчети (като оценки за оценка или персонализирани съвети). #''''Валидиране''' - гарантиране, че отговорите преминават определени критерии, като минимални и максимални стойности, или съвпадение на входен модел Expression Manager (EM) предоставя интуитивен начин за определяне на логиката за всяка от тези функции. Почти всичко, което можете да напишете като стандартно математическо уравнение, е валиден израз, дори ако извиквате функции. В момента EM предоставя достъп до 80 функции и може лесно да бъде разширен, за да поддържа повече. Той също така ви позволява да осъществявате достъп до вашите променливи, като използвате четими за човека имена на променливи (вместо SGQA имена). Следващите раздели показват основните места, където се използва Expression Manager <span id="Relevance_(Controlling_Navigation/Branching)"></span> ==Уместност (Контролиране на навигация/разклоняване)== Някои проучвания използват „Goto Logic“, така че ако отговорите на въпрос 1 с опция C, след това преминете към въпрос 5. Този подход е много ограничаващ, тъй като е труден за валидиране и лесно се разваля, когато трябва да пренаредите въпросите. EM използва булево уравнение за релевантност, за да определи всички условия, при които даден въпрос може да е валиден. Ако въпросът е уместен, тогава въпросът се показва, в противен случай той е неприложим и стойността NULL се съхранява в базата данни. Това е подобно на това, което може да се направи чрез редактора на условия, но EM ви позволява лесно да зададете много по-сложни и мощни критерии (и ви позволява да използвате името на променливата вместо именуване на SGQA). Това изображение показва един начин за преглед на логиката на уместност за проучване. Изчислява индекса на телесна маса. Уравнението за релевантност е показано в квадратни скоби точно след името на променливата (което е в зелено). И така, уместността на тегло, тегло_единици, височина и височина_единици са 1, което означава, че тези въпроси винаги се задават. Уместността за ИТМ обаче е {!is_empty(height) и !is_empty(weight)}, което означава, че ИТМ ще бъде изчислен само ако субектът въведе стойност както за височината, така и за теглото (по този начин се избягва рискът от деление на нула грешка). Освен това въпросът за докладване се показва само ако субектът отговори на четирите основни въпроса (височина, единици_височина, тегло, единици_тегло). [[Файл:tutorial1.jpg]] Уместността се показва и може да се редактира на следните места: <span id="Viewing_/_Editing_Question-Level_Relevance"></span> ===Преглед/Редактиране на уместност на ниво въпрос=== Това уравнение изчислява индекса на телесна маса (ИТМ). Пита се само дали лицето първо въвежда ръста и теглото си. [[Файл:tutorial2.jpg]] Това е екранът за редактиране на въпроса за BMI. [[Файл:tutorial3.jpg]] Обърнете внимание, че не използвате фигурните скоби, когато въвеждате уравнение за релевантност. <span id="Viewing_/_Editing_Group-Level_Relevance"></span> ===Преглед/редактиране на уместност на ниво група=== Това е примерно проучване от преброяването. Първата страница пита колко души живеят с вас и съхранява това в променливата "cohabs". Тази страница се показва само ако имате повече от един съжител (така че се показва за втория човек, който съжителства с вас), а също така се показва само ако сте посочили как Човек Едно е свързан с вас (p1_rel). [[Файл:tutorial4.jpg]] Както можете да видите, групата също има критерии за уместност на ниво въпрос, така че всеки въпрос се появява само след като сте отговорили на въпроса преди него (напр. {!is_empty(p1_sex)}). EM съчетава уместността на ниво група и въпрос за вас. Въпроси в група се задават само ако групата като цяло е подходяща. След това се задават само подмножеството въпроси в рамките на групата, които са подходящи. Ето екрана за редактиране на уместността на ниво група за този въпрос: [[Файл:tutorial5.jpg]] Обърнете внимание, че не използвате фигурните скоби, когато въвеждате уравнение за релевантност. <span id="Tailoring/Piping"></span> ==Шиване/Пипинг== EM ви позволява лесно да правите прости и сложни условни настройки на вашите въпроси. Понякога просто се нуждаете от проста замяна, като да кажете: „Казахте, че сте купили<nowiki> [</nowiki> продукт]. Какво ви хареса най-много в него?". Понякога имате нужда от условно заместване като "<nowiki> [</nowiki> Г-н г-жа.]<nowiki> [</nowiki> LastName], бихте ли искали да попълните нашата анкета?". В този случай искате да използвате г-н или г-жа въз основа на пола на лицето. Друг път се нуждаете от дори по-сложно заместване (като например въз основа на математическо изчисление) EM поддържа всеки от тези видове шиене/тръби. <span id="Conditional_Equations"></span> ===Условни уравнения=== Примерът за индекс на телесна маса показва способността да се изчисли ИТМ на човек, дори когато му позволявате да въведе своята височина и тегло в метрични или неметрични единици. [[Файл:tailoring7.jpg]] Тук weight_kg е {if(weight_units == 'kg', тегло, тегло * .453592)}. Тази функция if() означава, че ако субектът е въвел теглото в килограми, използвайте тази стойност, в противен случай умножете въведената стойност (която беше в паундове) по .453592, за да я преобразувате в килограми. Променливата height_m използва подобен подход за изчисляване на височината на човека в метри, дори ако той е въвел височината си в инчове. ИТМ изчислява формулата за тегло като {weight_kg / (height_m * height_m)}. И накрая, докладът условно приспособява съобщението за субекта, като му казва какво е въвел. („Казахте, че сте висок 2 метра и тежите 70 кг.“) Въпреки че не е добре показано в горното изображение, weight_status използва вложени оператори if(), за да категоризира лицето като с поднормено тегло до тежко затлъстяване. Можете да видите уравнението му в изгледа Show Logic [[Файл:tailoring8.jpg]] От прозореца за редактиране на този въпрос можете да видите две неща: #Tailoring трябва да огражда изразите с фигурни скоби #Изразите могат да обхващат няколко реда, ако, както в този случай, искате да улесните четенето на вложена условна логика. [[Файл:tailoring9.jpg]] <span id="Tailored_Questions,_Answers,_and_Reports"></span> ===Персонализирани въпроси, отговори и отчети=== <div class="simplebox">Забележка: Динамичното приспособяване може да не работи, ако опциите за отговор са налични в полетата за избор на същата страница с въпроси. Това се дължи на факта, че шивашките вложки a<nowiki></nowiki> <span>таг, който не е валиден в опциите за избор.</span> Този пример показва отчета за ИТМ. [[Файл:tailoring10.jpg]] Ето прозореца за редактиране на същия въпрос. [[Файл:tailoring11.jpg]] Както можете да видите, всичко във фигурни скоби се третира като израз, така че синтаксисът е маркиран (цветно кодиран) в предишното изображение. Ако сте имали правописни грешки (като грешно изписани или недефинирани имена на променливи или функции), EM ще покаже грешка, като тази, показваща, че height_unit е недефинирано име на променлива (всъщност е height_units), а rnd() е недефинирана функция (правилното име на функцията е round()). И в двата случая грешките са оградени с червена кутия, за да се улеснят забелязването и коригирането им. [[Файл:tailoring12.jpg]] Можете също така да видите, че можете бързо да създавате сложни отчети, като например таблица с въведени стойности или персонализирани съвети. Моля, не забравяйте, че всяко приспособяване трябва да обгражда изрази с фигурни скоби, така че LimeSurvey да знае кои части от въпроса са свободен текст и кои трябва да бъдат анализирани чрез Expression Manager. <span id="Validation"></span> ==Потвърждение== EM контролира как работят повечето от разширените опции за въпроси. Тези контролни аспекти като минимален/максимален брой отговори; мин./макс. индивидуални стойности; минимални/максимални сумарни стойности; и проверка дали въведените стойности съответстват на определени модели на низове. Продължавате да въвеждате тези разширени опции за въпроси, както обикновено. Сега обаче всяка стойност в едно от тези полета се счита за израз, така че можете да имате минимални/максимални критерии със сложни условни връзки с други въпроси. Във всички тези случаи, тъй като опцията за разширен въпрос винаги се счита за израз, вие не използвате фигурни скоби, когато я посочвате. Страниците [[Примерни анкети на Expression Manager|Примерни анкети]] показват много работещи примери за използване на изрази за валидации. <span id="Introduction"></span> =Въведение= LimeSurvey използва новия модул Expression Manager (EM), който ще позволи на LimeSurvey да поддържа по-сложни разклонения, оценки, валидиране и приспособяване. Той ще замени начина, по който LimeSurvey управлява Замени, Условия и Оценки в задната част. Освен това значително ще ускори обработката, тъй като елиминира повечето четения на база данни по време на изпълнение. EM е разработен от д-р Томас Уайт (TMSWhite). Тази уики страница е окончателната справка за синтаксиса и функционалността на Expression Manager. ==Ключови дефиниции== #''Израз''': Всичко оградено с къдрави скоби #*Стига да няма празно пространство непосредствено след отварящата скоба или преди затварящата къдрава скоба #*Съдържанието на изразите се оценява от EM, така че те могат да съдържат математически формули, функции и сложна обработка на низове и дати. #'''Tailoring''': Понякога наричан "тръбопровод", това е процесът на условно модифициран текст #*Имате достъп до всички „полета за заместване“, данни за участници и данни за отговори. #*Имате и по-лесен достъп до въпроси, отговори и техните свойства. #'' Уравнение „Уместност“: Нов атрибут на въпроса, контролиращ видимостта на въпроса #*Ако има уравнение на уместност, тогава въпросът се показва само ако уместността се оценява като true. #*Вътрешно всички array_filter и array_filter_exclude командите стават уместни на ниво подвъпрос #'''Equation''' Тип въпрос: Нов тип въпрос, който записва изчисления или отчети в базата данни #*Това е като Boilerplate въпрос, но съдържанието му се записва в базата данни, дори ако зададете „Винаги скрий този въпрос“ #'''Код на въпроса''': Това е предпочитаното име на променлива за EM #*Това може да бъде описателно име, указващо целта на въпроса , което улеснява четенето на сложна логика #*Валидните кодове на въпроси НЕ трябва да започват с число, така че когато използвате кода на въпроса, за да номерирате вашите въпроси, просто използвайте "q1", или "q1a" или "g1q2".! N!#*Това в момента става името на променливата, ако експортирате данни към SPSS или R, така че ако правите статистически анализ, вероятно вече сте направили това уникално. <span id="Do_I_have_to_use_EM?"></span> ==Трябва ли да използвам EM?== Краткият отговор е Не (но и да). EM е напълно обратно съвместим със съществуващите проучвания. Така че, ако желаете да използвате Условия и Оценки в стила, който LimeSurvey използва във версии <= 1.91+, можете да продължите да го правите. Въпреки това, EM напълно замества начина, по който LimeSurvey вътрешно се справя с Условията. Въпреки че все още можете да използвате редактора на условия, за да създавате и управлявате условия, LimeSurvey 1.92 ще ги преобразува в еквивалентни уравнения на релевантност. Като част от надграждането, LimeSurvey 1.92 ще конвертира автоматично всички съществуващи условия в уравнения за релевантност. Това би трябвало да ви даде най-доброто от двата свята - можете да продължите да използвате LimeSurvey, както сте свикнали, но ще видите еквивалента на Relevance Equation, така че можете постепенно да мигрирате към Relevance Equations директно, когато сметнете за добре. <span id="Can_I_mix_use_of_Conditions_and_Relevance?"></span> ==Мога ли да комбинирам използването на Условия и Уместност?== да Можете да използвате редактора на условията за някои въпроси и редактора на съответствие за други. Условията се преобразуват автоматично в Уместност, когато запазите въпроса. Имайте предвид, че предполагаме, че ако използвате редактора на условия, искате тези условия да презапишат всяко ръчно въведено уравнение за релевантност. Така че, ако имате съществуващи условия и искате ръчно да редактирате уместността, моля, първо изтрийте условията за този въпрос. По-конкретно, копирайте генерираното уравнение за уместност в текстов редактор, използвайте менюто Условия, за да изтриете всички условия за този въпрос (което също ще изтрие уместността), след това редактирайте въпроса и поставете генерираното уравнение за уместност от текстовия редактор обратно в полето за уместност за този въпрос (и запазете въпроса). Ако има достатъчно търсене за изтриване на условия, без да изтриваме генерираното уравнение за релевантност, можем да добавим процес на групово преобразуване. <span id="How_should_I_choose_between_Conditions_and_Relevance?"></span> ==Как да избирам между Условия и Уместност?== Ето списък с плюсовете и минусите на всеки стил: {| class="wikitable" !Стил!!Плюсове!!Минуси |- |Условия||1. Добър GUI за създаване на прости условия<br/> 2. GUI, добре документиран и разбран от екипа за поддръжка||1. Поддържа само прости сравнения и не прави И/ИЛИ условия добре<br/> 2. Каскадните условия работят хаотично<br/> 3. Бавно - интензивна база данни, така че може да забави дългите проучвания<br/> 4. Някои съобщават за проблеми с условията за повторно зареждане<br/> 5. GUI не се мащабира добре, когато има десетки, стотици или хиляди въпроси<br/> 6. Може да е бавно за преобразуване на хартиени проучвания, тъй като трябва да се използват имена на SGQA<br/> 7. Често има нужда от програмист, който да персонализира логиката, необходима за сложно разклоняване |- |Уместност||1. Поддържа много сложна логика, включително над 80 функции и математически/низови оператори<br/> 2. Перфектна поддръжка за каскадна логика<br/> 3. Бързо - без допълнителни извиквания към база данни, така че поддържа 1000+ анкети с въпроси<br/> 4. Няма проблеми с логиката за презареждане, тъй като не изисква SGQA кодове<br/> 5. Осветяването на синтаксиса се мащабира до 1000+ анкети с въпроси<br/> 6. Лесен и бърз за използване за групи, които искат да компютъризират съществуващите проучвания на хартиен носител.<br/> 7. Поддържа лесно полуструктурирани интервюта и епидемиологични проучвания без нужда от програмисти||1. Няма GUI за прости условия - вместо това използвайте осветяване на синтаксиса<br/> 2. Ново, така че екипите за поддръжка все още не са усвоили EM. |} Основното е, че ако сте доволни от това как работи LimeSurvey 1.91+, няма причина да променяте това, което правите. <span id="What_are_some_other_benefits_of_using_EM?"></span> ==Какви са някои други предимства от използването на EM?== Ето някои от другите причини, поради които може да искате да използвате EM. #Изчисления - можете да създадете всяко изчисление, за което се сетите: #*Имате достъп до всички общи математически оператори и функции #* Имате достъп до над 70 математически функции, функции за обработка на дати и низове #*Сравнително лесно е за разработчиците да добавят нови функции, ако потребителите имат нужда от тях #Съхраняване на изчисления в база данни #*Вече можете да изчислявате прости и сложни изчисления и/или скални резултати И ги съхранявайте в базата данни, без да се нуждаете от JavaScript. #*Използвате типа въпрос Equation, за да постигнете това. #Оценки #*Вече можете да създавате оценки или мащабирайте резултатите от всеки тип въпрос, а не само подмножеството, което се поддържаше преди #*Можете да използвате Tailoring, за да показвате текущи или общи резултати за оценка навсякъде, където е необходимо - дори на същата страница #*Имате повече контрол върху отчетите, генерирани въз основа на тези оценки #*Можете да съхранявате оценки за оценка в базата данни, без да ви е необходим JavaScript #*Можете да скриете оценките за оценка, без да имате нужда от JavaScript или CSS #Полета за заместване # *Вместо да използвате {INSERTANS:SGQA}, можете просто да използвате кода на въпроса - това го прави по-лесен за четене и валидиране. #*Това също така избягва обичайната необходимост от редактиране на въпроси за промяна на кода на SGQA, за да може всичко да работи . #Tailoring - можете условно да показвате текст въз основа на други стойности #*Използвайте подходящото заглавие за тема, като (напр. „Здравей<nowiki> [</nowiki> Г-н/г-жа] Смит") #*Изведете граматически правилни изречения въз основа на значението на единствено/множествено число: (напр. "Имате 1 дете" срещу "Имате 2 деца") #*Подходящо спрегнати глаголи и отклонявайте съществителни въз основа на пола и множественото число на субекта. #Нови променливи атрибути - можете да получите достъп до следното, за да направите своето приспособяване: #* (без суфикс) - псевдоним за qcode.code #*. код - избраният код на отговор за въпроса, ако е уместен (в противен случай празен), или текстовата стойност, ако не е кодиран въпрос #*.NAOK - същото като .code, но може да бъде част от изчисления или списъци дори ако е неуместен #*.value - стойността на оценката за въпроса, ако е уместен (в противен случай празно), или текстовата стойност, ако не е кодиран въпрос -- налице е, ако оценките са активирани за проучването, в противен случай винаги zero #*.valueNAOK - същото като .value, но може да бъде част от изчисления или списъци, дори ако е неуместно #*.shown - отговорът, както се показва на потребителя (това прави {INSERTANS:xxx} ) #*.qid - ID на въпроса #*.gid - ID на групата #*.sgqa - SGQA стойността за въпроса #*.jsName - правилното име на променливата в javascript за въпроса, независимо дали е дефиниран на тази страница или друга #*.qseq - поредицата от въпроси (започваща от 0) #*.gseq - поредицата от групи (започваща от 0) #*. задължителен - дали въпросът е задължителен (Y/N) #*.question - текстът на въпроса #*.relevance - уравнението за уместност за въпроса #*.grelevance - уравнението за уместност за групата #*.relevanceStatus - дали въпросът е релевантен в момента (булев (може да е различен в PHP и JS)) #*.type - типът на въпроса (кодът от един знак)!N !#Динамични промени на страницата #*Цялото съответствие, изчисление и приспособяване работи динамично на страница - така че промените в стойностите незабавно актуализират страницата #*И така, имате въпроси, които се появяват/изчезват динамично въз основа на това дали те са уместни #*Въпросите също са динамично персонализирани въз основа на отговорите на страницата, така че можете да видите текущи суми, персонализирани изречения и персонализирани отчети. #Нов екран за въвеждане на данни #*В допълнение към използването текущата система за въвеждане на данни, можете просто да използвате Survey-All-In-One. #*Това поддържа уместността и приспособяването на страницата, така че служителите по въвеждане на данни могат бързо да преминават с раздели и ще трябва само да въведат подходящи отговори #*Това може да бъде критично, ако вашият човек за въвеждане на данни трябва да види приспособяването, което също е динамично. #Елиминира нуждата от повечето персонализирани JavaScript #*EM лесно поддържа сложни изчисления, точкуване , приспособяване и условна логика. #*Някои неща все още ще се нуждаят от JavaScript (като персонализирани оформления и условно скриване на поделементи на въпроси), но вашият JavaScript може да използва EM функциите, така че да имате достъп до въпроси чрез техния Qcode вместо SGQA и достъп до някое от свойствата на въпроса, изброени по-горе. <span id="What_are_some_other_helpful_new_features_enabled_by_EM?"></span> ==Кои са някои други полезни нови функции, активирани от EM?== Независимо дали продължавате да използвате редактора на условия или ръчно съставяте уравнения за релевантност, вие получавате тези допълнителни предимства: #Можете да създавате по-сложни критерии за валидиране #*Всички атрибути на разширени въпроси (като max_answers, min_num_value_n, max_num_value) може да използва изрази. Така че вашите минимални/максимални критерии могат лесно да бъдат коригирани въз основа на предишни отговори, дори ако те са на една и съща страница. #*EM също обработва всички базирани на регулярни изрази валидации, така че можете стабилно да комбинирате preg и equation- основани на атрибути на въпроси. #Лесно пренареждане (или изтриване) на въпроси и групи #*Преди версия 1.92 не можехте да пренареждате въпроси или групи, ако LimeSurvey смяташе, че подобно пренареждане може да се повреди условията, при които са били използвани. По същия начин не можете да изтриете въпроси, ако други въпроси зависят от тях. #*С подчертаването на синтаксиса на EM е лесно да видите и потвърдите дали се опитвате да използвате въпроси, преди да бъдат декларирани. И така, сега ви позволяваме да пренареждате или изтривате въпроси и групи, когато пожелаете. EM ще актуализира цялото осветяване на синтаксиса, за да ви покаже потенциални грешки. #*Изгледът на въпросите за пренареждане е подобрен, за да помогне с такъв преглед. Сега показва уравнението за релевантност на въпроса и приспособяването, така че можете незабавно да видите дали някои променливи стават розови (което означава, че се използват, преди да бъдат декларирани). #Индексът за навигация на въпроси/групи е винаги наличен и точен #* Преди версия 1.92 тези индекси не бяха налични, ако имаше сложни условия #*С EM можем да гарантираме, че са точни. #*Субектите дори могат да се върнат назад, към предишен въпрос, да променят отговора , след това прескочете напред (или изпратете) #**Когато прескочите напред, EM ще потвърди повторно всички намесени въпроси/групи. #**Ако някои въпроси станат неуместни, те ще бъдат NULL в базата данни така че вашите данни да са вътрешно съгласувани #**Ако някакви въпроси станат уместни или наскоро не отговарят на задължителните или правилата за валидиране, EM ще спре на тази страница и ще принуди потребителя да отговори на тези въпроси, преди да скочи до крайната им дестинация. #Автоматично преобразуване на условията в релевантност #*Когато надстроите вашата база данни, всички съществуващи проучвания, които имат условия, ще имат генерирани уравнения за релевантност #*Когато импортирате анкета, уравненията за релевантност ще бъдат създадени според нуждите #*Когато добавяте, изтривате или модифицирате условия, EM ще генерира подходящото уравнение за релевантност. #Удобно осветяване на синтаксиса #*Когато EM показва уравнението за релевантност, той ще показва Qcode, дори ако сте въвели SGQA код, тъй като предполагаме, че това ще бъде по-лесно за четене. #*Всички променливи са цветно кодирани, за да покажат дали са декларирани преди или след текущия въпрос (или преди или след текущата група). Това ви позволява бързо да откривате и коригирате случаи, в които се опитвате да използвате променливи за релевантност (включително array_filter), приспособяване или уравнения за валидиране, преди да ги декларирате. #*Освен това, ако задържите курсора на мишката върху цветно кодираната променлива , ще видите най-важните метаданни за този въпрос. Това включва последователността на групата #, последователността на въпроса #, Qcode, текста на въпроса и всички налични възможности за избор на отговор (ако е тип въпрос с изброени варианти за отговор). #**Списъкът с възможности за избор на отговор използва този синтаксис : 'answers':{key:val, ... }. #**''key'' има синтаксис ''''scale~code'''', където ''scale'' е скалата на отговора (напр. за двойна скала) и ''код'' е кодът на отговора. #**''val'' има синтаксис ''''стойност~показана'''', където ''стойност'' е стойността на оценката (ако се използват оценки, в противен случай ''code'') (напр. Qcode.value), а ''shown'' е показваната стойност, както се вижда от субекта (напр. Qcode.shown) #**Това означава, че много проучвания могат да използват изчисления, без да е необходим режим на оценка. Ако сте изброили опции за отговор, които са уникални, недесетични и неотрицателни, можете просто да направите изчисления на стойностите на Qcode.code. #Лесен преглед на цялата логика и съдържание на проучването #*Има нова функция Show Survey Logic, която ви позволява да видите всичко за проучването (или групата или въпроса) на една страница. #*Тя показва подробности на ниво група, въпрос, подвъпрос и отговор за избрания обхват (анкета срещу група срещу въпрос) #*Той също така показва уместността, уместността на ниво подвъпрос (за array_filter и array_filter_exclude) и генерираното уравнение за валидиране (за preg и всякакви правила за валидиране като мин./макс. сума/брой на стойности) и всички непразни атрибути на въпроси. #*Всичко е синтаксисно маркирано, така че можете да видите потенциални синтактични грешки (като небалансирани скоби или използване на променливи, преди да са били декларирани) #*Синтаксисът- highligting поддържа бърза навигация и редактиране на анкетата. #**Ако щракнете върху име на променлива, се отваря прозорец (или раздел) на браузъра, който ви показва този въпрос и ви позволява да го редактирате. #** Ако щракнете върху име на група, се отваря прозорец (или раздел) на браузъра, показващ изгледа за пренареждане на групата, така че можете лесно да местите въпроси. #**Всички атрибути на въпроса също са синтаксисно подчертани. Това ви позволява да задавате и виждате изрази в разширените опции за въпроси (като базиране на максимално/минимално число/сума от стойности на израз) #*Авторът на EM използва подобен изглед (малко по-изчистен), за да позволи на сътрудничещите си епидемиолози и институции Съветът за преглед валидира и разрешава проучвания с хиляди въпроси в силно разклонени и персонализирани структурирани интервюта <span id="Getting_Started"></span> =Първи стъпки= Най-добрият начин да започнете с EM е да: *Инсталирате най-новата стабилна версия от http://www.limesurvey.org/en/download *Импортирате и изследвате [[ExpressionScript примерни анкети|примерни анкети ]]. *Разгледайте [[ExpressionScript How-tos|случаи на употреба и HowTos]] и [[ExpressionScript examples|примери стъпка по стъпка]]. *Разгледайте EM документацията (тази страница) *Разгледайте вградения набор от тестове за EM **От всяко проучване, под инструменти изберете опцията EM **Наличните функции изброяват 70+ функции и синтаксис **Единични тестове на изолирани Изрази ***показва примери за използване на всички EM функции и оператори, както и резултатите от PHP и JavaScript ***обърнете внимание, че има няколко функции, които генерират различни резултати във версиите на PHP и JavaScript, така че тази страница ви позволява планирайте съответно вашата EM логика. <span id="What_Functionality_does_Expression_Manager_Extend/Replace?_(LimeSurvey_<=_1.91+)"></span> =Каква функционалност разширява/заменя Expression Manager? (LimeSurvey <= 1.91+)= <span id="Conditions_=>_Relevance"></span> ==Условия => Уместност== Условията контролират кои въпроси се виждат. Общият синтаксис беше ''SGQA оператор Value'', като ''111X2X3 == "Y"''. Условията можеха да бъдат И или ИЛИ заедно, но смесването на И и ИЛИ беше трудно. Самите условия бяха съхранени в отделна таблица и голяма част от кода на LimeSurvey беше посветен на управлението на Условията. Поради обширния достъп до базата данни, обработката на голям брой условия може да причини забележими проблеми с производителността. Освен това, след като сте имали условия, присвоени на въпроси или групи, често не ви е било позволено да ги пренаредите или изтриете. <span id="Assessments_=>_Equations_and_Micro-Tailoring"></span> ==Оценки => Уравнения и микро-приспособяване== Оценките позволяват на потребителите да създават резултати от скала от колекция от въпроси. Те обаче не можеха да се променят динамично на текущата страница и техните стойности не бяха съхранени в базата данни. <span id="Replacements_=>_Micro-Tailoring"></span> ==Замени => Микро шиене== Потребителите могат да персонализират някои съобщения и въпроси въз основа на предишни отговори. Например, въпросът може да бъде „{TOKEN:FIRSTNAME}, казахте, че {INSERTANS:111X3X4} е любимият ви спорт“. Въпреки това не беше възможно да се направи условно приспособяване (като да се каже „г-н“ или „г-жа“ в зависимост от пола на лицето), или да се спрегнат глаголи или да се отклонят съществителни без фантастичен JavaScript. Авторите можеха да прилагат анкети, които изглеждаха като персонализирани въпроси, но изискваха отделни въпроси за всяка пермутация и сложни условия, за да се реши кои въпроси да се покажат. <span id="Validation"></span> ==Потвърждение== Въпросът може да бъде валидиран с регулярни изрази или минимални/максимални стойности, или да оставите отговор на SGQA да служи като минимална или максимална стойност. Валидациите обаче не могат да се основават на изчисления на други променливи без фантастичен JavaScript. <span id="Equations"></span> ==Уравнения== Уравненията не се поддържаха без фантастичен JavaScript. <span id="Equation_Question_Type"></span> ==Уравнение Тип въпрос== Уравненията не могат да бъдат записани в базата данни (напр. крайната оценка за оценка) без фантастичен JavaScript. <span id="How_Will_Expression_Manager_Replace/Extend_That_Functionality?"></span> =Как Expression Manager ще замени/разшири тази функционалност?= Expression Manager е нов основен модул в рамките на LimeSurvey, който прави много по-лесно поддържането на типа сложна функционалност, която изискваше персонализиран JavaScript. Той също така заменя начина, по който LimeSurvey в момента управлява условията и оценките. <span id="New_Terminology_When_Referring_to_Expression_Manager_(EM)"></span> ==Нова терминология при препратка към Expression Manager (EM)== EM "мисли" за своята функционалност по следния начин: *'''Relevance-based Branching''' - ако даден въпрос е уместен, тогава го задайте, в противен случай не (напр. направете го невидим и го маркирайте като NULL в базата данни). Има ново поле за релевантност за всички типове въпроси, а също и за всяка група (така че можете да приложите набор от условия към цяла група, без да се налага да копирате едно и също условие за всеки въпрос и/или да комбинирате група и условно ниво на въпрос logic). *'''Tailoring''' - След като знаете кои въпроси трябва да бъдат зададени, приспособяването (понякога наричано ''piping'') определя как трябва да бъде зададен въпросът. Това ви позволява да поддържате не само просто заместване (като {TOKEN:FIRSTNAME}), но и спрежение на глаголи и склонение на съществителни въз основа на пола или числото на вашите теми. Също така ви позволява да промените съобщението, което доставяте на субект въз основа на това дали е отговорил (или как е отговорил) на други въпроси. *''Equations'''' - EM добавя нов тип въпрос, наречен Equation, който съхранява резултата на израз. Резултатите от тези уравнения се изчисляват и записват в базата данни, дори ако ги скриете на страницата. По този начин те са полезни за скрити изчисления на точкуване, навигация въз основа на сложни уравнения, оценки и отчети, които трябва да бъдат генерирани и лесно достъпни в базата данни. <span id="Relevance_and_Cascading_Relevance"></span> ===Уместност и каскадна уместност=== Всеки тип въпрос вече има опция за релевантност, която контролира дали въпросът да се показва. EM обработва всяко от уравненията за релевантност в реда, в който трябва да се появи в проучването. Ако изразът е верен (или липсва - за поддръжка на наследени проучвания), въпросът ще бъде показан. Ако не е уместно, тогава въпросът ще бъде скрит и стойността ще бъде NULL в базата данни. Ако в дадена група няма подходящи въпроси, цялата група ще бъде пропусната. Освен това, ако някоя от променливите в рамките на израз е неуместна, тогава изразът винаги се оценява като false. Това позволява каскадна релевантност, така че да не се налага да пишете много дълги уравнения за релевантност за всеки въпрос. Да кажем, че имате 5 въпроса Q1-Q5 и искате да покажете само Q2, ако е отговорено на Q1, и Q3, ако е отговорено на Q2 и т.н. Уравненията за релевантност могат да бъдат: {| class="wikitable" !Код на въпрос!!Уместност!!Въпрос |- |Q1||1||Как се казвате? |- |Q2||Q1 ||{Q1}, на колко години си? |- |Q3||Q2||И така, ти си на {Q2} години. Женен ли си? |- |Q4||Q3 == "Y"||{Q1}, колко време си женен? |- |Q5||Q4|| Колко деца имаш, {Q1}? |} Изчисленията за уместност също работят в JavaScript - така че можете да поставите всички горепосочени въпроси на една страница и тя пак ще работи според очакванията. Всъщност EM напълно замества начина, по който EM обработва Анкета срещу Групови срещу Въпрос-по-време формати на анкета. Сега всички те използват точно една и съща навигационна машина, така че работят идентично, независимо от стила на проучването. Докато сте на същата страница, всички въведени от вас данни ще бъдат там, просто скрити. Така че, ако въведете някаква информация, след това изберете опция, която ги прави неуместни, след това ги направете отново уместни, вашите отговори ще продължат да бъдат налични. Въпреки това, веднага щом преминете към друга страница, всички неподходящи отговори ще бъдат загубени за целостта на набора от данни. <span id="Group-Level_Relevance"></span> ===Уместност на ниво група=== Expression Manager също поддържа уместност на ниво група. Това улеснява прилагането на цикъл. Да кажем, че искате да съберете информация за до 10 обекта (като продукти или хора в домакинство), като първо определяте колко обекта се нуждаят от проследяване (като например като попитате колко души живеят в домакинство или като накарате хората да проверят кои продукти харесват от дълъг списък). След като разберете колко обекта се нуждаят от последващи действия, можете да използвате уместност на ниво група като {count >= 1}, {count >=2}, ... {count >= 10} за всяка от 10-те групи последващи действия въпроси. Във всяка група можете да имате условна логика на ниво въпрос (напр. допълнителни въпроси, свързани с пола или възрастта за всеки предмет). Въпросът и уравненията за релевантност на ниво група се добавят заедно, за да се определи кое трябва да се покаже. <span id="Tailoring_/_Piping"></span> ===Шивашки / Тръби=== Всичко във фигурни скоби вече се третира като израз (с едно изключение, описано по-долу). Изразите имат достъп до всички LimeReplacementFields, всички променливи (чрез няколко псевдонима), всички типични оператори на уравнения (математически, логически и сравнение) и десетки функции (които дори работят динамично от страна на клиента). Използвайки тези уравнения, можете да правите неща като: #Условно показване на персонализирани съобщения на респондентите въз основа на предишни отговори #Създаване на оценки и показване на резултатите от оценката (или условно разклоняване или показване на съобщения) въз основа на тези резултати, всички без да използвате самия модул за оценка #Спрягайте глаголи и отклонявайте съществителни във въпроси, отговори и доклади. #Показвайте обобщения на отговорите преди страницата „Покажете вашите отговори“ в края на анкетата <span id="Equations"></span> ===Уравнения=== Има нов тип въпрос, наречен Уравнение. Това е като Boilerplate въпроси, с изключение на това, че съхранява стойността на това, което се показва в базата данни. Така че, ако текстът на въпроса за уравнението съдържа изчисление за оценка, тази стойност ще бъде съхранена в базата данни в променлива, която може да се показва в рамките на публична или частна статистика. Това разрешава често срещана заявка за съхраняване на оценки за оценка в базата данни <span id="Syntax"></span> ==Синтаксис== Всичко, което се съдържа във фигурни скоби, сега се счита за израз (с едно изключение: не трябва да има празно пространство в началото или в края - това е необходимо, за да се гарантира, че диспечерът на изрази не се опитва да обработи вграден JavaScript). Имайте предвид, че е добре изразите да обхващат няколко реда, стига да няма интервал след отварящата къдрава скоба или преди затварящата къдрава скоба. Това е особено полезно за вложени оператори if() като този: <syntaxhighlight lang="java">{if(is_empty(PFTotals), '', if(PFTotals >= -5 && PFTotals <= -4, 'Много меко', if(PFTotals >= -3 && PFTotals <= -2, 'Меко', if(PFTotals == -1, 'Донякъде меко', if(PFTotals == 0, 'Умерено',! N! if(PFTotals == 1, 'Донякъде трудно', if(PFTotals >= 2 && PFTotals <= 3, 'Hard', if(PFTotals >= 4 && PFTotals <= 5, 'Много трудно', '' ) ) ) ) ) ) ) )} !Н!</syntaxhighlight> <div id="EMsyntax">Expression Manager поддържа следния синтаксис:</div> *Всички стандартни математически оператори (напр. +,-,*,/,!) *Всички стандартни оператори за сравнение (напр. <,<=,==,!=,>,>= плюс тези еквиваленти: lt,le,eq,ne,gt,ge) *Скоби (за да можете да групирате подизрази) *Условни оператори (напр. &&,| | и тези еквиваленти: и,или) * Единични и двойни кавички (които могат да вграждат низове с другия тип кавички) *Оператор запетая (така че може да има списък с изрази и просто да върне крайния резултат) *Оператор за присвояване (=)!N !*Предварително дефинирани променливи (за препращане към въпроси, атрибути на въпроси и отговори) - напр. всички SGQA кодове *Предварително дефинирани функции (вече има 70+ и е лесно да добавите още) <span id="Operators"></span> === Оператори === Синтаксисът на EM следва нормалния приоритет на оператора: {| class="wikitable" !Ниво!!Оператор(и)!!Описание |- |1||()||скоби за групиране или извикване на функции |- | 2||! - +||унарни оператори: не, отрицание, унарно-плюс |- |3||* /||пъти, разделяне |- |4||+ -||плюс , минус |- |5||< <= > >= lt le gt ge||относителни сравнения |- |6||== != eq ne||сравнения на равенство |- |7||и||логическо И |- |8||или||логическо ИЛИ |- |9||=||присвояване оператор |- |10||,||оператор със запетая |} <span id="Warning_with_plus_operator_(+)"></span> ==== Предупреждение с оператор плюс (+) ==== За съгласуваност между JavaScript и PHP операторът плюс (+) прави събиране, ако и двата операнда са числови, но прави конкатенация, ако и двете части са нечислови низове. Въпреки това '''препоръчваме да използвате функцията join() за конкатенация и функцията sum() за събиране''', тъй като това прави намерението ви по-ясно и избягва неочаквани резултати, ако очаквате низове, но вместо това сте получили числа (или обратното обратно). <span id="Warning_with_mismatch_between_number_and_string_and_alphabetic_comparison"></span> ==== Предупреждение за несъответствие между число и низ и сравнение по азбучен ред ==== Когато искате да сравните стойност с относителни сравнения или сравнения на равенство, обърнете внимание на несъответствието на типа. Стойността, въведена от потребителя, или избраният код на отговор може да се използва като число, ако е очевидно число. Ако оградите една от стойностите с <code>"</code> , това ще принуди сравнението като текст (азбучно сравнение). Ако искате да сравните числено, никога не поставяйте числото в кавички, <code>"</code> . Например <code>Q0.NAOK > "50"</code> е вярно, ако Q0.NAOK е цифров въпрос със стойност 9. Това е така, защото операторът <code>></code> ще приеме, че е азбучно сравнение, а не числово. <div class="mw-translate-fuzzy"> За да сте сигурни, че сравнявате целочислена стойност, можете да използвате <code>[[Expression_Manager#Implemented_Functions|intval]](Q0.NAOK) > 50</code> , просто запомнете, ако Q0.NAOK не е число (празен или низ), тогава intval(Q0. NAOK) === 0. За да сравните стойност на низ ("A" < "B"), използвайте [[Expression_Manager#Implemented_Functions|strcmp]] директно: <code>strcmp(Q0.NAOK,"B")</code> или <code>strcmp(Q0.NAOK,"A5")</code> . </div> <span id="Caution_about_using_Assignment_Operator_(=)"></span> ===Внимание при използване на оператор за присвояване (=)=== Имайте предвид, че трябва да избягвате използването на операторите за присвояване, освен ако не е абсолютно необходимо, тъй като те могат да причинят неочаквани странични ефекти. Например, ако промените стойността на предишен отговор, каскадната уместност и логиката на валидиране между този въпрос и текущия въпрос не се изчисляват отново, така че може да се окажете с вътрешно несъвместими данни (напр. въпроси, които остават отговорени, но трябва да имат е NULLed или въпроси, които са пропуснати, но е трябвало да получат отговор). По принцип, ако искате да присвоите стойност на променлива, трябва да създадете тип въпрос с уравнение и да използвате израз, за да зададете стойността му. Има обаче редки случаи, в които хората наистина се нуждаят от този оператор, затова го направихме достъпен. За да ви предупредим за този оператор, той е показан с червен шрифт в синтактичните уравнения (за да не го объркате с "==") ===Използване на оператор за присвояване=== Основните причини, поради които може да искате да използвате присвояване са: * Трябва да зададете стойността по подразбиране за въпрос, който не приема стойности по подразбиране чрез уравнение (като списъчно радио, където потребителският интерфейс ви позволява да изберете една от опциите за отговор, но не ви позволява да въведете уравнение). Бъдете внимателни обаче, тъй като LimeSurvey няма да може да потвърди, че вашето уравнение генерира един от допустимите отговори за този въпрос. * Трябва принудително да промените отговора на предишен въпрос въз основа на по-късен отговор * Имате нужда от сложна квота: използване на един скрит единствен избор за квота и задаване чрез присвояване * и т.н... Можете да използвате цялата система за управление на изрази за тази цел. {{Alert|Присвояването се извършва само в PHP. Това не актуализира никакви стойности на същата страница, а само когато потребителят навигира със следващ, предишен, запазване ....}} {{Предупреждение|Ако не използвате тип [[Question_type_-_Equation|въпрос с уравнение]] за тази цел: присвояването се извършва само след като логиката на текущата страница е изпълнена. Препоръчителният метод е винаги да използвате [[Question_type_-_Equation|въпрос с уравнение]].}} Някои примери: * Задаване на отговор на кратък текстов въпрос с малки букви: <code>{QCODE=strtolower(QCODE.NAOK)}</code> * Задаване на отговор по подразбиране на тип въпрос от масив в началото на анкета: <code>{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}</code> * Задайте отговор по подразбиране на тип въпрос с текстов масив в началото на анкета: <code>{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}</code> * Задаване на отговор с условие: <code>{QCODE=if(YesNo="Y","A1","")}</code> <span id="XSS_security"></span> == XSS сигурност == С активиране на XSS някои системи за управление на изрази не могат да се използват: * започвайки HTML таг в израз, но завършвайки в друг израз * използвайте сложен израз в URL. Пример и заобиколно решение * <code>{if( 1 ,"<strong>","")}information{if( 1 ,"</strong>","")}</code> е повредена с XSS защита, тук можете да използвате <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> ==Достъп до променливи== Expression Manager предоставя достъп само за четене до променливите, от които може да имаме нужда. За обратна съвместимост, той осигурява достъп до следното: *TOKEN:xxx - стойността на TOKEN (напр. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Само за НЕанонимно проучване). *[[Добавяне на question#Information_from_previous_answers|INSERTANS:SGQA]] - показваната стойност на отговор (напр. "Да"). За Expression Manager е същото като използването на {QCODE.shown}. *Всички [[The_template_editor#Keywords|{XXX} стойности, използвани от шаблони]]. *В текста на въпроса можете да използвате {QID} заменено от идентификатора на въпроса и {SGQ}, заменен от SGQA на въпроса В допълнение, Expression Manager ви позволява да се обръщате към променливите чрез кода на въпроса (колоната „заглавие“ в таблицата с въпроси в базата данни). Това също е етикетът на променливата, използван, когато експортирате вашите данни към SPSS, R или SAS. Например, ако имате въпроси относно име, възраст и пол, можете да наречете тези променливи „име“, „възраст“ и „пол“ вместо „12345X13X22“, „12345X13X23“. “ и „12345X13X24”. Това прави уравненията по-лесни за четене и потвърждаване на логиката от всички, плюс дава възможност за разбъркване на въпроси, без да се налага да следите номерата на групи или въпроси. <div class='simplebox'> '''Важно:''' Безопасно е да се отнасят само към променливи, които се срещат в предходните страници или въпроси. </div> Освен това, Expression Manager ви позволява достъп до много свойства на въпроса: {| class="wikitable" !Синтаксис!!Значение!!Пример!!Примерен резултат |- |Qcode||псевдоним за Qcode.code||{implode(',',name,gender )}||'Tom','M' |- |Qcode.code||избраният код на отговор за въпроса, ако е подходящ (в противен случай празен), или текстовата стойност, ако не е кодиран въпрос||{implode(',',name.code,gender.code)}||'Tom','M' |- |Qcode.NAOK||същото като Qcode - вижте обсъждането на NAOK||{gender.NAOK}||'M' |- |Qcode.value||оценъчната стойност за въпроса, ако е уместна (в противен случай празна), или текстовата стойност, ако не е кодиран въпрос||{gender.value}||'1' |- |Qcode.valueNAOK||същият като Qcode.value - вижте дискусията за NAOK||{gender.valueNAOK}||'1 ' |- |Qcode.shown||извежданата стойност за въпроса||{implode(',',name.shown,gender.shown)}||'Tom','Male'!N !|- |Qcode.question||текста на въпроса||{gender.question}||'Какъв е вашият пол?' |- |Qcode.mandatory||дали въпросът е задължително (Y/N)||{gender.mandatory}||'N' |- |Qcode.qid||номерът на вътрешния въпрос (не поредният номер)||{gender.qid} ||337 |- |Qcode.type||типа на въпроса||{gender.type}||'G' |- |Qcode.jsName||правилното име на javascript за въпроса, независимо дали е деклариран на или извън тази страница||{gender.jsName}||'java1827X3X337' |- |Qcode.gid||номера на вътрешната група (не поредния номер)|| {gender.gid}||3 |- |Qcode.qseq||поредният номер на въпроса, започващ от 0||{gender.qseq}||5 |- |Qcode.gseq||поредния номер на групата, започващ от 0||{gender.gseq}||1 |- |Qcode.relevanceStatus||дали въпросът е уместен в момента (0 или 1 )||{gender.relevanceStatus}||1 |- |Qcode.relevance||уравнението за уместност на ниво въпрос||{gender.relevance}||'!is_empty(name)' |- |Qcode.grelevance||уравнението за уместност на ниво група||{gender.grelevance}||'num_children >= 5' |- |Qcode.sgqa||стойността на SGQA за този въпрос||{gender.sgqa}||'1827X3X337' |} <span id="HTML_editor_issue"></span> === Проблем с HTML редактора=== {{Предупреждение|Този проблем е коригиран след 2.05 компилация 140803}} Ако използвате HTML редактор, някои знаци се заменят с HTML обекти. * & от & * < от < * > от > Ако използвате HTML редактор, трябва да използвате : * и за & * lt for < * le for <= * gt for > * ge за >= <span id="Qcode_Variable_Naming"></span> ==Именуване на променливи в Qcode== Ето подробностите за това как да конструирате Qcode (и да получите достъп до някои свойства) по тип въпрос. Като цяло Qкодовете се конструират като: QuestionCode . „_“. ID на подвъпроса. „_“. ScaleId За '''comment''' и '''other''' кодът на въпроса е QuestionCode_comment и QuestionCode_other {| class="wikitable" !Тип!!Описание!!Код!!SubQs!!Опции за отговор!!Везни!!Код на отговора!!Отговорът е показан!!Уместност |- |5||5 Радио бутони за избор на точка||Q1|| ||1-5|| ||{Q1}||{Q1.shown}||{Q1==3} |- |B||Масив (Избор от 10 точки) Радио-бутони||Q2||L1-L6| |1-10|| ||{Q2_L2}||{Q2_L2.shown}||{Q2_L2==7} |- |A||Масив (избор от 5 точки) Радио-бутони||Q3||1-5| |1-5|| ||{Q3_1}||{Q3_1.shown}||{Q3_1>=3} |- |1||Масив (Гъвкави етикети) Двоен мащаб||Q4||sq1-sq5||0 :a1-a3||1:b1-b3||{Q4_sq1_0}||{Q4_sq1_1.shown}||{Q4_sq1_1=='b2'} |- |H||Масив (Гъвкав) - Формат на колона||Q5||1-5||s,m,t|| ||{Q5_1}||{Q5_1.shown}||{Q5_1=='s'} |- |F||Масив (Гъвкав) - Формат на ред||Q6||F1-F5| |1-5|| ||{Q6_F3}||{Q6_F3.shown}||{Q6_F3==4} |- |E||Радио бутони за масив (увеличаване/също/намаляване)||Q7||1- 7||I,S,D|| ||{Q7_4}||{Q7_4.shown}||{Q7_4=='D'} |- |:||Масив (Multi Flexi) 1 до 10||Q8||ls1,todo ,ls2||мин.,макс.,ср.|| ||{Q8_ls1_max}||{Q8_ls2_avg.shown}||{Q8_ls2_min==7} |- |;||Масив (Multi Flexi) Текст||Q9||hp,st,sw|| 1-во, 2-ро, 3-то|| ||{Q9_hp_3rd}||{Q9_hp_3rd.shown}||{Q9_hp_3rd=='Peter'} |- |C||Масив (Да/Несигурно/Не) Радио-бутони||Q10|| 1-5||Y,N,U|| ||{Q10_1}||{Q10_1.shown}||{Q10_3=='Y'} |- |X||Шаблонен въпрос||Q11|| || || || ||{Q11.shown}|| |- |D||Дата||Q12|| || || ||{Q12}||{Q12.shown}|| |- |*||Уравнение||Q13|| || || ||{Q13}||{Q13.shown}||{Q13>5} |- |~124~||Качване на файл (записва броя на качените файлове)||Q14|| || || ||{Q14}|| ||{Q14>0} |- |G||Падащ списък за пол||Q15|| ||М,Ж|| ||{Q15}||{Q15.shown}||{Q15=='M'} |- |U||Огромен свободен текст||Q16|| || || ||{Q16}||{Q16.shown}||{strlen(Q16)>100} |- |I||Езиков въпрос||Q17|| || || ||{Q17}||{Q17.shown}||{Q17=='en'} |- |!||Списък – падащо меню||Q18|| ||1-5|| ||{Q18}||{Q18.shown}||{Q18==3} |- |L||Списък с падащ списък/списък с радио бутони||Q19|| ||AZ|| ||{Q19}||{Q19.shown}||{Q19=='X'} |- |O||Списък с падащо меню за коментар/списък с бутони за избор + текстово поле||Q20 || ||AF|| ||{Q20},{Q20comment}||{Q20.shown}||{Q20=='B'} |- |T||Дълъг безплатен текст||Q21|| || || ||{Q21}||{Q21.shown}||{strstr(Q21,'hello')>0} |- |M||Квадратче за отметка с множество възможности за избор||Q22||AF, other| | || ||{Q22_E}, {Q22_other}||{Q22_E.shown}, {Q22_other.shown}||{Q22_E=='Y'} |- |P||Множествен избор с коментари Кутия за отметка + Текст||Q23||AF|| || ||{Q23_D}, {Q23_Dcomment}||{Q23_D.shown}||{!is_empty(Q23)} |- |K||Въпрос с множество числа||Q24||self,mom,dad || || ||{Q24_self}||{Q24_self.shown}||{Q24_self>30} |- |Q||Множество кратки текст||Q25||AF|| || ||{Q25_B}||{Q25_B.shown}||{substr(Q25_B,1,1)=='Q'} |- |N||Числен тип въпрос||Q26|| || || ||{Q26}||{Q26.shown}||{Q26 > 30} |- |R||Стил на класиране||Q27||1-4|| || ||{Q27_1}||{Q27_1.shown}||{Q27_1==3} |- |S||Кратък безплатен текст||Q28|| || || ||{Q28}||{Q28.shown}||{Q28=='moe'} |- |Y||Да/Не радио-бутони||Q29|| || || ||{Q29}||{Q29.shown}||{Q29=='Y'} |} <span id="The_reserved_'this',_'self',_and_'that'_variables"></span> ==Запазените променливи 'this', 'self' и 'that'== Доста често искате да оцените всички части на въпрос, като например преброяване на колко подвъпроса е отговорено или сумиране на точките. Друг път искате да обработите само определени редове или колони от въпрос (като например получаване на сумите на редове или колони и съхраняването им в базата данни). Тези запазени променливи правят този процес относително безболезнен. Променливата „this“ се използва изключително в разширените опции за въпрос „Уравнение за валидиране на целия въпрос“ и „Уравнение за валидиране на подвъпрос“. Разширява се до имената на променливите на всяка от клетките в тези въпроси. Така че, ако искате да сте сигурни, че всеки запис е по-голям от три, бихте задали „Уравнение за валидиране на подвъпрос“ на (това > 3). Променливите „self“ и „that“ са по-мощни и служат като макроси, които се разширяват преди обработката на уравненията. Изборът на синтаксис е: *self *self.''suffix'' *self.''sub-selector'' *self.''sub-selector''.'' наставка'' ''суфикс'' е всеки от нормалните суфикси на qcode (напр. NAOK, стойност, показано) ''подселектор'' е един от: *коментари - само подвъпроси, които са коментари (напр. от множествен избор с коментар и списък с коментар) *без коментари - само подвъпроси, които не са коментари *sq_X - където X е идентификатор на ред или колона. Избрани са само подвъпроси, съответстващи на модел X. Обърнете внимание, че търсенето се извършва по пълен кодов идентификатор, след което sq_X съвпада и включва подвъпроси nX, X, Xn (напр. ако използвате sq_1, подвъпросите a1, 1a, 1, 11 или 001 са включени). Обърнете внимание на типа въпрос с двоен мащаб, където кодът на подвъпросите е QCODE_SQCODE_1 и QCODE_SQCODE_1, и на типа въпрос за класиране, където кодът на подвъпроса е QCODE_1,QCODE_2 .... *nosq_X - където X е идентификатор на ред или колона. Избират се само подвъпроси, които не съответстват на модел X. Обърнете внимание, че търсенето се извършва по пълен кодов идентификатор, след това nosq_X съответства и не включва подвъпроси nX, X, Xn Примери: *Отговорено ли е на част от въпрос? {count(self.NAOK)>0} *Каква е оценката за този въпрос? {sum(self.value)} Можете също да ги използвате, за да получите общи суми по редове и колони. Да кажем, че имате масив от числа с редове AE и колони 1-5. *Каква е общата сума? {sum(self.NAOK)} *Каква е общата сума на ред B? {sum(self.sq_B.NAOK)} *Каква е общата сума в колона 3? {sum(self.sq_3.NAOK)} Променливата 'that' е като променливата 'self', но ви позволява да се обърнете към други въпроси. Синтаксисът му е: *that.''qname'' *that.''qname''.''suffix'' *that.''qname''.''под-селектор' ' *that.''qname''.''под-селектор''.''суфикс'' ''qname'' е името на въпроса без никакви разширения на подвъпроса. И така, кажете, че създавате въпрос 'q1', това е неговото 'qname' Примери: *Отговорено ли е на част от въпрос q1? {count(that.q1.NAOK)>0} *Каква е оценката за q2? {sum(that.q2.NAOK)} *Каква е общата сума на q3? {sum(that.q3.NAOK)} *Каква е общата сума на ред C в q4? {sum(that.q4.sq_C.NAOK)} *Каква е общата сума от колона 2 в q4? {sum(that.q4.sq_2.NAOK)} Променливите „self“ и „that“ могат да се използват във всякаква уместност, валидиране или приспособяване. Единственото предупреждение е, че когато използвате функцията [[Покажи логически файл|Покажи логически файл]], тя ще ви покаже разширената стойност на 'self' и 'that'. Това ви позволява да видите действителното уравнение, което ще бъде генерирано, така че вие (и Expression Manager) да можете да потвърдите, че променливите съществуват. Това може да изглежда объркващо, тъй като може да видите доста дълги уравнения. Ако обаче редактирате въпроса, ще видите оригиналното уравнение, използващо „self“ и/или „that“ Също така имайте предвид, че не трябва да използвате тези променливи, ако (a) искате изрично да наименувате всяка променлива, използвана в уравнение, или (b) използвате променливи, които нямат подвъпроси (напр. въпроси с единичен отговор). В тези случаи добавянето на префикс към променлива с „това“ е пресилено и рискувате да получите неочаквани резултати. <span id="Usage_of_NAOK"></span> ==Използване на NAOK== NAOK --> „Неприложимо“ (NA) е наред (OK) Използването на NAOK означава, че всички или някои от променливите са неуместни (напр. „Неприложимо“ (NA) е наред (OK)). Когато поставите някаква променлива от въпрос във всяко уравнение: ако този въпрос (или подвъпрос) е скрит от условие: това деактивира всички уравнения. Например: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) дава винаги празен низ, ако един подвъпрос от Q1 е филтриран. За да преброите броя на проверените подвъпроси в такъв въпрос може да бъде count(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Ако подвъпросът е скрит: Мениджърът на изрази връща празен низ. Без NAOK : ако един въпрос или един подвъпрос е скрит : Expression Manager винаги връща празен низ, същото за връщане false. Показаните .shown винаги използват системата NAOK (празен низ, ако е скрит), но ако имате нужда от кода на отговора: винаги е добра идея да добавите .NAOK след кода на въпроса. Освен ако имате нужда и знаете какво правите. Друг пример и информация са предоставени на [[#Overriding_Cascading_Conditions|Overriding Cascading Conditions]] <span id="Access_to_Functions"></span> ==Достъп до функции== Expression Manager предоставя достъп до математически, низови и дефинирани от потребителя функции, както е показано по-долу. Има еквиваленти на PHP и JavaScript за тези функции, така че да работят еднакво от страната на сървъра (PHP) и от страната на клиента (JavaScript). Лесно е да добавяте нови функции. <span id="Implemented_Functions"></span> ===Въведени функции=== В момента са налични следните функции: {| 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> ===Функции, които са планирани или се обмислят=== Други функции, които са планирани (или се обмислят), но които все още не са изпълнени, включват следното. Някои от тях са за обратна съвместимост с друг инструмент за проучване. {| class="wikitable" !Синтаксис!!Значение!!Коментари |- |e()||връща стойността на e|| |- |formatDate(X, PAT)||връща стойността на низа на дата X, форматиран според модела на формат на данни на Java PAT|| |- |formatNumber(X,PAT)||връща стойността на низа на числото X, форматиран според номера на Java модел на формат PAT|| |- |getAnsOption(X)|| [[ExpressionAnswerOptions|Основна добавка ExpressionAnswerOptions ]] || |- |getAnsOption(X,Y)|| [[ExpressionAnswerOptions|Основен плъгин ExpressionAnswerOptions ]] || |- |getRelevance(X)||връща уравнението за релевантност за въпрос X|| |- |getStartTime()||връща датата, съответстваща на системния час, когато е започнало интервюто|| |- |getType(X)||връща името на низа на типа данни - например *NA* ако еNA()|| |- |gotoFirst()||скача към първия съответен набор от въпроси - това нарушава нормалния поток на системата|| |- |gotoNext()||скача към следващия набор от подходящи въпроси - това нарушава нормалния поток на системата|| |- |gotoPrevious()||скача към предишния набор от подходящи въпроси - това нарушава нормалния поток на системата|| | - |isAsked(X)||връща true, ако отговорът не е нито *NA*, *INVALID*, нито *UNASKED*|| |- |isInvalid(X)||връща true, ако отговорът е от тип *INVALID*|| |- |isNA(X)||връща true, ако отговорът е от тип *NA*|| |- |isNotUnderstood(X)||връща true, ако отговорът if от тип *HUH*|| |- |isRefused(X)||връща true, ако отговорът е от тип *REFUSED*|| |-! N!|isSpecial(X)||връща true, ако отговорът е от тип *UNASKED*, *NA*, *REFUSED*, *INVALID*, *UNKNOWN* или *HUH*|| |-!N !|isUnknown(X)||връща true, ако отговорът е от тип *UNKNOWN*|| |- |jumpTo(X)||прескачане до групата, съдържаща посочения въпрос -- това нарушава нормалното поток на системата|| |- |jumpToFirstUnasked()||прескачане към първия незададен въпрос <strike>, като по този начин заобикаля предишните въпроси с отговор,</strike> това нарушава нормалния поток на системата|| |- | lastIndexOf(X,Y)||връща последния индекс (база 0) на низ Y в низ X. Връща -1, ако Y не се съдържа в X|| |- |list(X,.. .)||низ, съдържащ разделен със запетаи списък на положителните стойности с "и", разделящи последните две|| |- |mean(X,...)||връща средната стойност на списък от стойности|| |- |numAnsOptions(X)||връща броя опции за отговор, които въпросът X има|| |- |orlist(X,...)|| низ, съдържащ разделен със запетая списък на положителните стойности, с "или", разделящи последните две|| |- |parseDate(X,PAT)||връща стойността на датата на низ X, анализирана с Java date шаблон на формат PAT|| |- |parseNumber(X,PAT)||връща числовата стойност на низ X, анализиран с шаблон на формат на число на Java PAT|| |- |showAllResponsesExcept( questionList ,attributeList,attributeTitleList)||questionList = разделен с вертикална черта списък с идентификатори на въпроси; attributeList = разделен с вертикална черта списък с атрибути (като въпрос #, заглавие, текст, тип - така че можете да решите какво да покажете); attributeTitleList = разделен с вертикална черта списък на заглавки на таблици, така че може да се интернационализира отчетът.|| |- |showTheseResponses( questionList,attributeList,attributeTitleList)||questionList = разделен с вертикална черта списък с идентификатори на въпроси; attributeList = разделен с вертикална черта списък с атрибути (като въпрос #, заглавие, текст, тип - така че можете да решите какво да покажете); attributeTitleList = разделен с вертикална черта списък на заглавки на таблици, така че може да се интернационализира отчетът.|| |} <span id="Expression_Manager_Knows_Which_Variables_are_Local"></span> ==Мениджърът на изрази знае кои променливи са локални== За да изгради правилно JavaScript за страницата, Expression Manager трябва да знае кои променливи са зададени на страницата и какъв е техният JavaScript ID (напр. за document.getElementById(x)). Той също така трябва да знае кои променливи са зададени на други страници (за да може да гарантира, че необходимите<input type='hidden' value='x'> полетата са налични и попълнени). <span id="Cascading_Conditions"></span> ==Каскадни условия== Ако някоя от променливите е неуместна, цялото уравнение ще бъде неуместно (фалшиво). Например в следващата таблица N/A означава, че една от променливите не е уместна {| class="wikitable" !Оператор!!Пример!!a!!b!!Резултат |- |<nowiki> + (единичен)</nowiki> ||<nowiki> +a</nowiki> ||N/A|| ||false |- |- (унарно)||-a||N/A|| ||false |- |!||!a||N/A|| ||false |- |== (или eq)||a == b||N/A||5||false |- |== (или eq)||a == b||N/A||0||false |- |== (или eq)||a == b||N/A||N/A|| false |- |!= (или ne)||a != b||N/A||5|| false |- |!= (или ne)||a != b||N/A||N/A|| false |- |!= (или ne)||a != b||N/A||0||false |- |> (или gt)||a > b||N/A||5|| false |- |>= (или ge)||a >= b||N/A||5||false |- |< (или lt)||a < b||N/A||5||false |- |<= (или le)||a <= b||N/A||5||false |- |и||a и b||N/A||5||false |- |и||a и b||N/A||N/A||false |- |или||a или b||N/A||N/A||false |- |или||a или 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 |- |функция||sum(a,b,b)||N/A|| 5||false |- |функция||max(a,b)||N/A||5||false |- |функция||min(a,b)||N/A||5||false |- |function||implode(', ',a,b,a,b)||N/A||5||false! N!|- |функция||if(a,a,b)||N/A||5||false |- |функция||is_empty(a)||N/ A|| ||false |- |функция||is_empty(a)||0 (или празно)|| ||true |- |функция||!is_empty(a)||N/A|| ||false |} <span id="Overriding_Cascading_Conditions"></span> ===Отменящи каскадни условия=== Да кажем, че искате да покажете текущ сбор от всички подходящи отговори. Може да опитате да използвате уравнението {sum(q1,q2,q3,...,qN)}. Това обаче се превежда вътрешно на LEMif(LEManyNA('q1','q2','q3',...,'qN'),'',sum(LEMval('q1'),LEMval('q2') ,LEMval('q3'),...,LEMval('qN'))). Така че, ако някоя от стойностите q1-qN е неуместна, уравнението винаги ще връща false. В този случай sum() ще показва 0, докато не се отговори на всички въпроси. За да се избегне това, към всяка променлива може да се добави суфикс ".NAOK" (което означава, че Not Applicable е OK). В такива случаи възниква следното поведение. Да кажем, че имате променлива q1.NAOK #q1 не се добавя към клаузата LEManyNA() #LEMval('q1') ще продължи да проверява дали отговорът е уместен и ще върне<nowiki> ''</nowiki> ако не е (така че отделните неуместни отговори ще бъдат игнорирани, но те няма да анулират целия израз). И така, решението на текущия общ проблем е да се използва уравнението sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK). Използването на суфикса .NAOK също позволява на авторите да проектират анкети, които имат няколко възможни пътя, но след това се събират в общи пътища по-късно. Например, кажете, че субектите отговарят на анкета по начин, който е извън нормалния диапазон от отговори. Авторът може да предупреди субектите, че може да не получат валидни резултати и да ги попита дали наистина искат да продължат с проучването. Ако кажат „Да“, тогава ще се покажат останалите въпроси. Условието за „останалите въпроси“ ще провери дали на първоначалните отговори е отговорено в рамките на нормалния диапазон ИЛИ дали субектът е казал „Да“ на въпроса, който е уместен само ако е отговорил извън нормалния диапазон. <span id="How_does_Expression_Manager_Support_Conditional_Micro-Tailoring?"></span> ==Как Expression Manager поддържа условно микро-приспособяване?== Ето пример за микро-приспособяване (където Question Type=='expr' означава уравнение): {| class="wikitable" !Код на въпрос!!Уместност!!Тип въпрос!!Въпрос |- |име||1||текст||Как се казваш? |- |age||1||text||На колко години сте? |- |badage||!is_empty(age)||expr||{(age<16) or (age>80)} |- |agestop||badage||message||Съжалявам, {name}, ти си твърде {if( (възраст<16),'млад',if( (възраст>80), 'old','middle-aged') ) } за този тест. |- |kids||!badage||yesno||Имате ли деца? |- |родители ||1||expr||{!badage && kids=='Y'} |- |numKids||parents||text||Колко деца имате? |-! N!|kid1||parents && numKids >= 1||text||На колко години е първото ви дете? |- |kid2||parents && numKids >= 2||text||На колко години е второто ви дете? |- |kid3||родители && numKids >= 3||текст||На колко години е третото ви дете? |- |kid4||родители && numKids > = 4||text||На колко години е четвъртото ви дете? |- |kid5||roditeljи && numKids >= 5||text||На колко години е петото ви дете? |-! N!|sumage||1||expr||{sum(kid1.NAOK,kid2.NAOK,kid3.NAOK,kid4.NAOK,kid5.NAOK)} |- |отчет||родители| |дано||{име}, ти каза, че си на {възраст} и че имаш {numKids}. Сборът на възрастта на вашите първи {min(numKids,5)} деца е {sumage} |} Всички тези въпроси могат да бъдат на една страница (напр. в една и съща група) и ще се показват само съответните въпроси. Освен това, докато въвеждате възрастта на децата, изразът sum() в последния въпрос ще се актуализира динамично на страницата. <html>Expression Manager предоставя тази функционалност, като обгражда всеки израз с име<nowiki></nowiki> <span>елемент. Всеки път, когато дадена стойност се промени, тя преизчислява израза, който трябва да се появи в нея</span><nowiki></nowiki> <span><span>елемент и регенерира дисплея. Можете да имате десетки или дори стотици такива персонализирани изрази на една и съща страница и страницата ще ги покаже отново всички с едно опресняване на екрана.</span></span> <span id="Mapping_of_LimeSurvey_1.91+_to_Expression_Manager_Functionality"></span> ==Съпоставяне на LimeSurvey 1.91+ към функционалността на Expression Manager== {| class="wikitable" !Стара функция!!Нова функция!!Коментари |- |Условия||Уместност||Можете да използвате много сложни условни уравнения и да имате достъп до по-широк набор от променливи |- |Оценки||Уравнение||Всички оценки могат да бъдат преструктурирани в уравнение. Това едновременно гарантира, че резултатът се записва в базата данни, и също така ви позволява да видите динамични промени в стойността на резултата на текущата страница |- |Замени||Expression Manager||Основният двигател приема входния низ и третира всичко във фигурни скоби като израз - така че обработва всички исторически типове замествания. За да избегне объркване на вградения JavaScript, Expression Manager обработва само съдържание между фигурни скоби, стига (a) да няма начално или завършващо празно пространство във фигурните скоби - например {expr} е израз, но {expr}, {expr }, и {expr} не са изрази. Освен това, Expression Manager не обработва съдържание в собствените си низове (напр. {list('hi','there {braces}')} генерира "hi there {braces}"). Той също така игнорира скритите фигурни скоби (напр. \{this is not an expression\}) |- |Validation||Expression Manager||Планът е да се вземат текущите min/max Question Attributes и да има Expression Manager обработете ги. По този начин минималните/максималните стойности могат да бъдат самите изрази |} <span id="Syntax_Highlighting"></span> =Осветяване на синтаксиса= За да помогне при въвеждането и валидирането на изрази, EM предоставя подчертаване на синтаксиса със следните функции: <span id="Types_and_Meanings_of_Syntax_Highlighting"></span> ==Видове и значения на осветяването на синтаксиса== {| class="wikitable" !Color!!Sample!!Meaning!!Tooltip!!Comments |- |тен фон||style='background-color: #eee8aa'|Sample||the цялото уравнение||няма||Всичко във къдрави скоби, което се разпознава като уравнение (напр. няма начален или завършващ бял интервал), ще бъде цветно кодирано с кафяв фон, за да се разграничи от околния текст |-!N !|удебелен червен текст||style='color:#ff0000; background-color:#eee8aa'|''''Пример'''||Грешка||Някои обяснения за грешка||Може да е непозната променлива или грешка във функция, .... Проучването може да бъде напълно развалено, това не не се показва на публичен потребител. |- |син текст||style='color:#0000ff; background-color:#eee8aa'|Пример||име на функция||значение и допустим синтаксис||имена на функции или неща, които трябва да бъдат функции, тъй като са последвани от отваряща скоба, са представени в удебелен син текст. Подсказките показват значението и допустимия синтаксис за функцията. |- |сив текст||style='color:#808080; background-color:#eee8aa'|Пример||низ||няма||низовете с единични и двойни кавички са показани в сив текст |- |циан текст||style='color:#4169e1; background-color:#eee8aa'|Примерна||набор на променлива на същата страница,||<nowiki> [</nowiki> име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност||Всяка променлива, която е зададена на същата страница като текущия въпрос, се показва в циан текст, което показва, че може да се актуализира в javascript. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |- |зелен текст||style='color:#008000; background-color:#eee8aa'|Примерна||променлива, зададена на предишна страница||<nowiki> [</nowiki> име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност||Всяка променлива, която е зададена на предишна страница, се показва с удебелен зелен текст. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |- |удебелен розов текст||style='color:#9370db; background-color:#eee8aa'|Sample||променлива, зададена на по-късна страница <sup>като цяло: празна в началото на анкетата, но може да бъде запълнена с индекс или да премести предишната</sup> ||<nowiki> [</nowiki> име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност||Всяка променлива, която е зададена на следващата страница, се показва с удебелен розов текст. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |- |bold tan text||style='color:#a0522d; background-color:#eee8aa'|Пример||стойност за замяна на lime||стойността||Низовете за замяна на lime (като {TOKEN:xxx}, {PRIVACY_MESSAGE}) са показани с получер текст. |- |червен текст||style='color:#ff4500; background-color:#eee8aa'|Пример||оператор за присвояване (=) ||предупредително съобщение||Ако използвате един от операторите за присвояване (=), този оператор ще се покаже в червен текст. Това има за цел да помогне за предотвратяване на случайно повторно присвояване на стойности, когато наистина искате да проверите дали a == b вместо да зададете стойността на a = b. |- |нормален черен текст||style=' цвят черен; background-color:#eee8aa'|Пример||пунктуация||няма||Всички останали препинателни знаци в рамките на израза се показват като нормален черен текст. |- |текст в червено поле||удебелена червена линия обгражда грешката||синтаксична грешка||описание на грешката||Всички открити синтактични грешки се показват, като обграждат грешката с червена кутия. Подсказката показва грешката. Примерите включват несъответстващи скоби, използване на недефинирани функции, подаване на грешен брой аргументи на функции, лошо структурирани изрази (напр. липсващи оператори между променливи), опит за присвояване на нова стойност на променлива само за четене, опит за присвояване на стойности на не- променливи или използване на неподдържан синтаксис. Имайте предвид, че системата за откриване на синтактични грешки може да докладва само една грешка в израз, дори ако има множество грешки; обаче, ако бъдат открити грешки, ще се покаже поне една грешка. |} <span id="Additional_Reading"></span> =Допълнителна литература= <span id="Expression_Manager_sample_surveys"></span> ==[[Примерни проучвания на Expression Manager|Примерни проучвания на Expression Manager]]== <span id="Use_Cases_and_HowTos"></span> ==[[ExpressionScript How-tos|Случаи на употреба и HowTos]]== <span id="Step-by-Step_examples"></span> ==[[ExpressionScript examples|Примери стъпка по стъпка]]== ==[[StatFunctions|Expression Manager statistic functions]]== <span id="Reference_for_Developers"></span> ==[[Мениджър на изрази за разработчици|Справочник за разработчици]]== <span id="RoadMap/Status/ToDo_List"></span> ==[[Пътна карта на Expression Manager|Пътна карта/Състояние/Списък със задачи]]==