Мениджър на изрази
From LimeSurvey Manual
Урок за бърз старт
Общ преглед
Когато персонализирате анкетите си, обикновено се нуждаете от начин да посочите следното:
- Навигация/Разклоняване - позволяване на отговорите на субекта да променят реда, в който се задават въпросите
- Tailoring/ Piping - как да формулирате въпроса (като препращане към предишни отговори или свързване на изречения въз основа на броя или пола на вашите субекти) или как да генерирате персонализирани отчети (като оценки за оценка или персонализирани съвети).
#'Валидиране - гарантиране, че отговорите преминават определени критерии, като минимални и максимални стойности, или съвпадение на входен модел
Expression Manager (EM) предоставя интуитивен начин за определяне на логиката за всяка от тези функции. Почти всичко, което можете да напишете като стандартно математическо уравнение, е валиден израз, дори ако извиквате функции. В момента EM предоставя достъп до 80 функции и може лесно да бъде разширен, за да поддържа повече. Той също така ви позволява да осъществявате достъп до вашите променливи, като използвате четими за човека имена на променливи (вместо SGQA имена).
Следващите раздели показват основните места, където се използва Expression Manager
Уместност (Контролиране на навигация/разклоняване)
Някои проучвания използват „Goto Logic“, така че ако отговорите на въпрос 1 с опция C, след това преминете към въпрос 5. Този подход е много ограничаващ, тъй като е труден за валидиране и лесно се разваля, когато трябва да пренаредите въпросите. EM използва булево уравнение за релевантност, за да определи всички условия, при които даден въпрос може да е валиден. Ако въпросът е уместен, тогава въпросът се показва, в противен случай той е неприложим и стойността NULL се съхранява в базата данни. Това е подобно на това, което може да се направи чрез редактора на условия, но EM ви позволява лесно да зададете много по-сложни и мощни критерии (и ви позволява да използвате името на променливата вместо именуване на SGQA).
Това изображение показва един начин за преглед на логиката на уместност за проучване. Изчислява индекса на телесна маса. Уравнението за релевантност е показано в квадратни скоби точно след името на променливата (което е в зелено). И така, уместността на тегло, тегло_единици, височина и височина_единици са 1, което означава, че тези въпроси винаги се задават. Уместността за ИТМ обаче е {!is_empty(height) и !is_empty(weight)}, което означава, че ИТМ ще бъде изчислен само ако субектът въведе стойност както за височината, така и за теглото (по този начин се избягва рискът от деление на нула грешка). Освен това въпросът за докладване се показва само ако субектът отговори на четирите основни въпроса (височина, единици_височина, тегло, единици_тегло).
Уместността се показва и може да се редактира на следните места:
Преглед/Редактиране на уместност на ниво въпрос
Това уравнение изчислява индекса на телесна маса (ИТМ). Пита се само дали лицето първо въвежда ръста и теглото си.
Това е екранът за редактиране на въпроса за BMI.
Обърнете внимание, че не използвате фигурните скоби, когато въвеждате уравнение за релевантност.
Преглед/редактиране на уместност на ниво група
Това е примерно проучване от преброяването. Първата страница пита колко души живеят с вас и съхранява това в променливата "cohabs". Тази страница се показва само ако имате повече от един съжител (така че се показва за втория човек, който съжителства с вас), а също така се показва само ако сте посочили как Човек Едно е свързан с вас (p1_rel).
Както можете да видите, групата също има критерии за уместност на ниво въпрос, така че всеки въпрос се появява само след като сте отговорили на въпроса преди него (напр. {!is_empty(p1_sex)}). EM съчетава уместността на ниво група и въпрос за вас. Въпроси в група се задават само ако групата като цяло е подходяща. След това се задават само подмножеството въпроси в рамките на групата, които са подходящи.
Ето екрана за редактиране на уместността на ниво група за този въпрос:
Обърнете внимание, че не използвате фигурните скоби, когато въвеждате уравнение за релевантност.
Шиване/Пипинг
EM ви позволява лесно да правите прости и сложни условни настройки на вашите въпроси. Понякога просто се нуждаете от проста замяна, като да кажете: „Казахте, че сте купили [ продукт]. Какво ви хареса най-много в него?". Понякога имате нужда от условно заместване като " [ Г-н г-жа.] [ LastName], бихте ли искали да попълните нашата анкета?". В този случай искате да използвате г-н или г-жа въз основа на пола на лицето. Друг път се нуждаете от дори по-сложно заместване (като например въз основа на математическо изчисление) EM поддържа всеки от тези видове шиене/тръби.
Условни уравнения
Примерът за индекс на телесна маса показва способността да се изчисли ИТМ на човек, дори когато му позволявате да въведе своята височина и тегло в метрични или неметрични единици.
Тук weight_kg е {if(weight_units == 'kg', тегло, тегло * .453592)}. Тази функция if() означава, че ако субектът е въвел теглото в килограми, използвайте тази стойност, в противен случай умножете въведената стойност (която беше в паундове) по .453592, за да я преобразувате в килограми. Променливата height_m използва подобен подход за изчисляване на височината на човека в метри, дори ако той е въвел височината си в инчове.
ИТМ изчислява формулата за тегло като {weight_kg / (height_m * height_m)}.
И накрая, докладът условно приспособява съобщението за субекта, като му казва какво е въвел. („Казахте, че сте висок 2 метра и тежите 70 кг.“)
Въпреки че не е добре показано в горното изображение, weight_status използва вложени оператори if(), за да категоризира лицето като с поднормено тегло до тежко затлъстяване. Можете да видите уравнението му в изгледа Show Logic
От прозореца за редактиране на този въпрос можете да видите две неща:
- Tailoring трябва да огражда изразите с фигурни скоби
- Изразите могат да обхващат няколко реда, ако, както в този случай, искате да улесните четенето на вложена условна логика.
Персонализирани въпроси, отговори и отчети
Този пример показва отчета за ИТМ.
Ето прозореца за редактиране на същия въпрос.
Както можете да видите, всичко във фигурни скоби се третира като израз, така че синтаксисът е маркиран (цветно кодиран) в предишното изображение. Ако сте имали правописни грешки (като грешно изписани или недефинирани имена на променливи или функции), EM ще покаже грешка, като тази, показваща, че height_unit е недефинирано име на променлива (всъщност е height_units), а rnd() е недефинирана функция (правилното име на функцията е round()). И в двата случая грешките са оградени с червена кутия, за да се улеснят забелязването и коригирането им.
Можете също така да видите, че можете бързо да създавате сложни отчети, като например таблица с въведени стойности или персонализирани съвети.
Моля, не забравяйте, че всяко приспособяване трябва да обгражда изрази с фигурни скоби, така че LimeSurvey да знае кои части от въпроса са свободен текст и кои трябва да бъдат анализирани чрез Expression Manager.
Потвърждение
EM контролира как работят повечето от разширените опции за въпроси. Тези контролни аспекти като минимален/максимален брой отговори; мин./макс. индивидуални стойности; минимални/максимални сумарни стойности; и проверка дали въведените стойности съответстват на определени модели на низове. Продължавате да въвеждате тези разширени опции за въпроси, както обикновено. Сега обаче всяка стойност в едно от тези полета се счита за израз, така че можете да имате минимални/максимални критерии със сложни условни връзки с други въпроси.
Във всички тези случаи, тъй като опцията за разширен въпрос винаги се счита за израз, вие не използвате фигурни скоби, когато я посочвате.
Страниците Примерни анкети показват много работещи примери за използване на изрази за валидации.
Въведение
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, така че ако правите статистически анализ, вероятно вече сте направили това уникално.
Трябва ли да използвам EM?
Краткият отговор е Не (но и да).
EM е напълно обратно съвместим със съществуващите проучвания. Така че, ако желаете да използвате Условия и Оценки в стила, който LimeSurvey използва във версии <= 1.91+, можете да продължите да го правите.
Въпреки това, EM напълно замества начина, по който LimeSurvey вътрешно се справя с Условията. Въпреки че все още можете да използвате редактора на условия, за да създавате и управлявате условия, LimeSurvey 1.92 ще ги преобразува в еквивалентни уравнения на релевантност. Като част от надграждането, LimeSurvey 1.92 ще конвертира автоматично всички съществуващи условия в уравнения за релевантност.
Това би трябвало да ви даде най-доброто от двата свята - можете да продължите да използвате LimeSurvey, както сте свикнали, но ще видите еквивалента на Relevance Equation, така че можете постепенно да мигрирате към Relevance Equations директно, когато сметнете за добре.
Мога ли да комбинирам използването на Условия и Уместност?
да Можете да използвате редактора на условията за някои въпроси и редактора на съответствие за други. Условията се преобразуват автоматично в Уместност, когато запазите въпроса.
Имайте предвид, че предполагаме, че ако използвате редактора на условия, искате тези условия да презапишат всяко ръчно въведено уравнение за релевантност. Така че, ако имате съществуващи условия и искате ръчно да редактирате уместността, моля, първо изтрийте условията за този въпрос. По-конкретно, копирайте генерираното уравнение за уместност в текстов редактор, използвайте менюто Условия, за да изтриете всички условия за този въпрос (което също ще изтрие уместността), след това редактирайте въпроса и поставете генерираното уравнение за уместност от текстовия редактор обратно в полето за уместност за този въпрос (и запазете въпроса). Ако има достатъчно търсене за изтриване на условия, без да изтриваме генерираното уравнение за релевантност, можем да добавим процес на групово преобразуване.
Как да избирам между Условия и Уместност?
Ето списък с плюсовете и минусите на всеки стил:
Стил | Плюсове | Минуси |
---|---|---|
Условия | 1. Добър GUI за създаване на прости условия 2. GUI, добре документиран и разбран от екипа за поддръжка |
1. Поддържа само прости сравнения и не прави И/ИЛИ условия добре 2. Каскадните условия работят хаотично 3. Бавно - интензивна база данни, така че може да забави дългите проучвания 4. Някои съобщават за проблеми с условията за повторно зареждане 5. GUI не се мащабира добре, когато има десетки, стотици или хиляди въпроси 6. Може да е бавно за преобразуване на хартиени проучвания, тъй като трябва да се използват имена на SGQA 7. Често има нужда от програмист, който да персонализира логиката, необходима за сложно разклоняване |
Уместност | 1. Поддържа много сложна логика, включително над 80 функции и математически/низови оператори 2. Перфектна поддръжка за каскадна логика 3. Бързо - без допълнителни извиквания към база данни, така че поддържа 1000+ анкети с въпроси 4. Няма проблеми с логиката за презареждане, тъй като не изисква SGQA кодове 5. Осветяването на синтаксиса се мащабира до 1000+ анкети с въпроси 6. Лесен и бърз за използване за групи, които искат да компютъризират съществуващите проучвания на хартиен носител. 7. Поддържа лесно полуструктурирани интервюта и епидемиологични проучвания без нужда от програмисти |
1. Няма GUI за прости условия - вместо това използвайте осветяване на синтаксиса 2. Ново, така че екипите за поддръжка все още не са усвоили EM. |
Основното е, че ако сте доволни от това как работи LimeSurvey 1.91+, няма причина да променяте това, което правите.
Какви са някои други предимства от използването на EM?
Ето някои от другите причини, поради които може да искате да използвате EM.
- Изчисления - можете да създадете всяко изчисление, за което се сетите:
- Имате достъп до всички общи математически оператори и функции
- Имате достъп до над 70 математически функции, функции за обработка на дати и низове
- Сравнително лесно е за разработчиците да добавят нови функции, ако потребителите имат нужда от тях
- Съхраняване на изчисления в база данни
- Вече можете да изчислявате прости и сложни изчисления и/или скални резултати И ги съхранявайте в базата данни, без да се нуждаете от JavaScript.
- Използвате типа въпрос Equation, за да постигнете това.
- Оценки
- Вече можете да създавате оценки или мащабирайте резултатите от всеки тип въпрос, а не само подмножеството, което се поддържаше преди
- Можете да използвате Tailoring, за да показвате текущи или общи резултати за оценка навсякъде, където е необходимо - дори на същата страница
- Имате повече контрол върху отчетите, генерирани въз основа на тези оценки
- Можете да съхранявате оценки за оценка в базата данни, без да ви е необходим JavaScript
- Можете да скриете оценките за оценка, без да имате нужда от JavaScript или CSS
- Полета за заместване
- *Вместо да използвате {INSERTANS:SGQA}, можете просто да използвате кода на въпроса - това го прави по-лесен за четене и валидиране.
- Това също така избягва обичайната необходимост от редактиране на въпроси за промяна на кода на SGQA, за да може всичко да работи .
- Tailoring - можете условно да показвате текст въз основа на други стойности
- Използвайте подходящото заглавие за тема, като (напр. „Здравей [ Г-н/г-жа] Смит")
- Изведете граматически правилни изречения въз основа на значението на единствено/множествено число: (напр. "Имате 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 и достъп до някое от свойствата на въпроса, изброени по-горе.
Кои са някои други полезни нови функции, активирани от 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 използва подобен изглед (малко по-изчистен), за да позволи на сътрудничещите си епидемиолози и институции Съветът за преглед валидира и разрешава проучвания с хиляди въпроси в силно разклонени и персонализирани структурирани интервюта
Първи стъпки
Най-добрият начин да започнете с EM е да:
- Инсталирате най-новата стабилна версия от http://www.limesurvey.org/en/download
- Импортирате и изследвате примерни анкети .
- Разгледайте случаи на употреба и HowTos и примери стъпка по стъпка.
- Разгледайте EM документацията (тази страница)
- Разгледайте вградения набор от тестове за EM
- От всяко проучване, под инструменти изберете опцията EM
- Наличните функции изброяват 70+ функции и синтаксис
- Единични тестове на изолирани Изрази
- показва примери за използване на всички EM функции и оператори, както и резултатите от PHP и JavaScript
- обърнете внимание, че има няколко функции, които генерират различни резултати във версиите на PHP и JavaScript, така че тази страница ви позволява планирайте съответно вашата EM логика.
Каква функционалност разширява/заменя Expression Manager? (LimeSurvey <= 1.91+)
Условия => Уместност
Условията контролират кои въпроси се виждат. Общият синтаксис беше SGQA оператор Value, като 111X2X3 == "Y". Условията можеха да бъдат И или ИЛИ заедно, но смесването на И и ИЛИ беше трудно. Самите условия бяха съхранени в отделна таблица и голяма част от кода на LimeSurvey беше посветен на управлението на Условията. Поради обширния достъп до базата данни, обработката на голям брой условия може да причини забележими проблеми с производителността. Освен това, след като сте имали условия, присвоени на въпроси или групи, често не ви е било позволено да ги пренаредите или изтриете.
Оценки => Уравнения и микро-приспособяване
Оценките позволяват на потребителите да създават резултати от скала от колекция от въпроси. Те обаче не можеха да се променят динамично на текущата страница и техните стойности не бяха съхранени в базата данни.
Замени => Микро шиене
Потребителите могат да персонализират някои съобщения и въпроси въз основа на предишни отговори. Например, въпросът може да бъде „{TOKEN:FIRSTNAME}, казахте, че {INSERTANS:111X3X4} е любимият ви спорт“. Въпреки това не беше възможно да се направи условно приспособяване (като да се каже „г-н“ или „г-жа“ в зависимост от пола на лицето), или да се спрегнат глаголи или да се отклонят съществителни без фантастичен JavaScript. Авторите можеха да прилагат анкети, които изглеждаха като персонализирани въпроси, но изискваха отделни въпроси за всяка пермутация и сложни условия, за да се реши кои въпроси да се покажат.
Потвърждение
Въпросът може да бъде валидиран с регулярни изрази или минимални/максимални стойности, или да оставите отговор на SGQA да служи като минимална или максимална стойност. Валидациите обаче не могат да се основават на изчисления на други променливи без фантастичен JavaScript.
Уравнения
Уравненията не се поддържаха без фантастичен JavaScript.
Уравнение Тип въпрос
Уравненията не могат да бъдат записани в базата данни (напр. крайната оценка за оценка) без фантастичен JavaScript.
Как Expression Manager ще замени/разшири тази функционалност?
Expression Manager е нов основен модул в рамките на LimeSurvey, който прави много по-лесно поддържането на типа сложна функционалност, която изискваше персонализиран JavaScript. Той също така заменя начина, по който LimeSurvey в момента управлява условията и оценките.
Нова терминология при препратка към Expression Manager (EM)
EM "мисли" за своята функционалност по следния начин:
- Relevance-based Branching - ако даден въпрос е уместен, тогава го задайте, в противен случай не (напр. направете го невидим и го маркирайте като NULL в базата данни). Има ново поле за релевантност за всички типове въпроси, а също и за всяка група (така че можете да приложите набор от условия към цяла група, без да се налага да копирате едно и също условие за всеки въпрос и/или да комбинирате група и условно ниво на въпрос logic).
- Tailoring - След като знаете кои въпроси трябва да бъдат зададени, приспособяването (понякога наричано piping) определя как трябва да бъде зададен въпросът. Това ви позволява да поддържате не само просто заместване (като {TOKEN:FIRSTNAME}), но и спрежение на глаголи и склонение на съществителни въз основа на пола или числото на вашите теми. Също така ви позволява да промените съобщението, което доставяте на субект въз основа на това дали е отговорил (или как е отговорил) на други въпроси.
- Equations'' - EM добавя нов тип въпрос, наречен Equation, който съхранява резултата на израз. Резултатите от тези уравнения се изчисляват и записват в базата данни, дори ако ги скриете на страницата. По този начин те са полезни за скрити изчисления на точкуване, навигация въз основа на сложни уравнения, оценки и отчети, които трябва да бъдат генерирани и лесно достъпни в базата данни.
Уместност и каскадна уместност
Всеки тип въпрос вече има опция за релевантност, която контролира дали въпросът да се показва. EM обработва всяко от уравненията за релевантност в реда, в който трябва да се появи в проучването. Ако изразът е верен (или липсва - за поддръжка на наследени проучвания), въпросът ще бъде показан. Ако не е уместно, тогава въпросът ще бъде скрит и стойността ще бъде NULL в базата данни. Ако в дадена група няма подходящи въпроси, цялата група ще бъде пропусната.
Освен това, ако някоя от променливите в рамките на израз е неуместна, тогава изразът винаги се оценява като false. Това позволява каскадна релевантност, така че да не се налага да пишете много дълги уравнения за релевантност за всеки въпрос.
Да кажем, че имате 5 въпроса Q1-Q5 и искате да покажете само Q2, ако е отговорено на Q1, и Q3, ако е отговорено на Q2 и т.н. Уравненията за релевантност могат да бъдат:
Код на въпрос | Уместност | Въпрос |
---|---|---|
Q1 | 1 | Как се казвате? |
Q2 | Q1 | {Q1}, на колко години си? |
Q3 | Q2 | И така, ти си на {Q2} години. Женен ли си? |
Q4 | Q3 == "Y" | {Q1}, колко време си женен? |
Q5 | Q4 | Колко деца имаш, {Q1}? |
Изчисленията за уместност също работят в JavaScript - така че можете да поставите всички горепосочени въпроси на една страница и тя пак ще работи според очакванията. Всъщност EM напълно замества начина, по който EM обработва Анкета срещу Групови срещу Въпрос-по-време формати на анкета. Сега всички те използват точно една и съща навигационна машина, така че работят идентично, независимо от стила на проучването.
Докато сте на същата страница, всички въведени от вас данни ще бъдат там, просто скрити. Така че, ако въведете някаква информация, след това изберете опция, която ги прави неуместни, след това ги направете отново уместни, вашите отговори ще продължат да бъдат налични. Въпреки това, веднага щом преминете към друга страница, всички неподходящи отговори ще бъдат загубени за целостта на набора от данни.
Уместност на ниво група
Expression Manager също поддържа уместност на ниво група. Това улеснява прилагането на цикъл. Да кажем, че искате да съберете информация за до 10 обекта (като продукти или хора в домакинство), като първо определяте колко обекта се нуждаят от проследяване (като например като попитате колко души живеят в домакинство или като накарате хората да проверят кои продукти харесват от дълъг списък). След като разберете колко обекта се нуждаят от последващи действия, можете да използвате уместност на ниво група като {count >= 1}, {count >=2}, ... {count >= 10} за всяка от 10-те групи последващи действия въпроси. Във всяка група можете да имате условна логика на ниво въпрос (напр. допълнителни въпроси, свързани с пола или възрастта за всеки предмет). Въпросът и уравненията за релевантност на ниво група се добавят заедно, за да се определи кое трябва да се покаже.
Шивашки / Тръби
Всичко във фигурни скоби вече се третира като израз (с едно изключение, описано по-долу). Изразите имат достъп до всички LimeReplacementFields, всички променливи (чрез няколко псевдонима), всички типични оператори на уравнения (математически, логически и сравнение) и десетки функции (които дори работят динамично от страна на клиента).
Използвайки тези уравнения, можете да правите неща като:
- Условно показване на персонализирани съобщения на респондентите въз основа на предишни отговори
- Създаване на оценки и показване на резултатите от оценката (или условно разклоняване или показване на съобщения) въз основа на тези резултати, всички без да използвате самия модул за оценка
- Спрягайте глаголи и отклонявайте съществителни във въпроси, отговори и доклади.
- Показвайте обобщения на отговорите преди страницата „Покажете вашите отговори“ в края на анкетата
Уравнения
Има нов тип въпрос, наречен Уравнение. Това е като Boilerplate въпроси, с изключение на това, че съхранява стойността на това, което се показва в базата данни. Така че, ако текстът на въпроса за уравнението съдържа изчисление за оценка, тази стойност ще бъде съхранена в базата данни в променлива, която може да се показва в рамките на публична или частна статистика.
Това разрешава често срещана заявка за съхраняване на оценки за оценка в базата данни
Синтаксис
Всичко, което се съдържа във фигурни скоби, сега се счита за израз (с едно изключение: не трябва да има празно пространство в началото или в края - това е необходимо, за да се гарантира, че диспечерът на изрази не се опитва да обработи вграден JavaScript).
Имайте предвид, че е добре изразите да обхващат няколко реда, стига да няма интервал след отварящата къдрава скоба или преди затварящата къдрава скоба. Това е особено полезно за вложени оператори if() като този:
{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,
'Много трудно',
''
)
)
)
)
)
)
)
)} !Н!
- Всички стандартни математически оператори (напр. +,-,*,/,!)
- Всички стандартни оператори за сравнение (напр. <,<=,==,!=,>,>= плюс тези еквиваленти: lt,le,eq,ne,gt,ge)
- Скоби (за да можете да групирате подизрази)
- Условни оператори (напр. &&,| | и тези еквиваленти: и,или)
- Единични и двойни кавички (които могат да вграждат низове с другия тип кавички)
- Оператор запетая (така че може да има списък с изрази и просто да върне крайния резултат)
- Оператор за присвояване (=)!N !*Предварително дефинирани променливи (за препращане към въпроси, атрибути на въпроси и отговори) - напр. всички SGQA кодове
- Предварително дефинирани функции (вече има 70+ и е лесно да добавите още)
Оператори
Синтаксисът на EM следва нормалния приоритет на оператора:
Ниво | Оператор(и) | Описание |
---|---|---|
1 | () | скоби за групиране или извикване на функции |
2 | ! - + | унарни оператори: не, отрицание, унарно-плюс |
3 | * / | пъти, разделяне |
4 | + - | плюс , минус |
5 | < <= > >= lt le gt ge | относителни сравнения |
6 | == != eq ne | сравнения на равенство |
7 | и | логическо И |
8 | или | логическо ИЛИ |
9 | = | присвояване оператор |
10 | , | оператор със запетая |
Предупреждение с оператор плюс (+)
За съгласуваност между JavaScript и PHP операторът плюс (+) прави събиране, ако и двата операнда са числови, но прави конкатенация, ако и двете части са нечислови низове. Въпреки това препоръчваме да използвате функцията join() за конкатенация и функцията sum() за събиране, тъй като това прави намерението ви по-ясно и избягва неочаквани резултати, ако очаквате низове, но вместо това сте получили числа (или обратното обратно).
Предупреждение за несъответствие между число и низ и сравнение по азбучен ред
Когато искате да сравните стойност с относителни сравнения или сравнения на равенство, обърнете внимание на несъответствието на типа. Стойността, въведена от потребителя, или избраният код на отговор може да се използва като число, ако е очевидно число.
Ако оградите една от стойностите с "
, това ще принуди сравнението като текст (азбучно сравнение). Ако искате да сравните числено, никога не поставяйте числото в кавички, "
.
Например Q0.NAOK > "50"
е вярно, ако Q0.NAOK е цифров въпрос със стойност 9. Това е така, защото операторът >
ще приеме, че е азбучно сравнение, а не числово.
За да сте сигурни, че сравнявате целочислена стойност, можете да използвате intval(Q0.NAOK) > 50
, просто запомнете, ако Q0.NAOK не е число (празен или низ), тогава intval(Q0. NAOK) === 0. За да сравните стойност на низ ("A" < "B"), използвайте strcmp директно: strcmp(Q0.NAOK,"B")
или strcmp(Q0.NAOK,"A5")
.
Внимание при използване на оператор за присвояване (=)
Имайте предвид, че трябва да избягвате използването на операторите за присвояване, освен ако не е абсолютно необходимо, тъй като те могат да причинят неочаквани странични ефекти. Например, ако промените стойността на предишен отговор, каскадната уместност и логиката на валидиране между този въпрос и текущия въпрос не се изчисляват отново, така че може да се окажете с вътрешно несъвместими данни (напр. въпроси, които остават отговорени, но трябва да имат е NULLed или въпроси, които са пропуснати, но е трябвало да получат отговор). По принцип, ако искате да присвоите стойност на променлива, трябва да създадете тип въпрос с уравнение и да използвате израз, за да зададете стойността му. Има обаче редки случаи, в които хората наистина се нуждаят от този оператор, затова го направихме достъпен.
За да ви предупредим за този оператор, той е показан с червен шрифт в синтактичните уравнения (за да не го объркате с "==")
Използване на оператор за присвояване
Основните причини, поради които може да искате да използвате присвояване са:
- Трябва да зададете стойността по подразбиране за въпрос, който не приема стойности по подразбиране чрез уравнение (като списъчно радио, където потребителският интерфейс ви позволява да изберете една от опциите за отговор, но не ви позволява да въведете уравнение). Бъдете внимателни обаче, тъй като LimeSurvey няма да може да потвърди, че вашето уравнение генерира един от допустимите отговори за този въпрос.
- Трябва принудително да промените отговора на предишен въпрос въз основа на по-късен отговор
- Имате нужда от сложна квота: използване на един скрит единствен избор за квота и задаване чрез присвояване
- и т.н...
Можете да използвате цялата система за управление на изрази за тази цел.
Някои примери:
- Задаване на отговор на кратък текстов въпрос с малки букви:
{QCODE=strtolower(QCODE.NAOK)}
- Задаване на отговор по подразбиране на тип въпрос от масив в началото на анкета:
{Q1_SQ1=((is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
- Задайте отговор по подразбиране на тип въпрос с текстов масив в началото на анкета:
{Q1_SQY1_SQX1 = ((is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
- Задаване на отговор с условие:
{QCODE=if(YesNo="Y","A1","")}
XSS сигурност
С активиране на XSS някои системи за управление на изрази не могат да се използват:
- започвайки HTML таг в израз, но завършвайки в друг израз
- използвайте сложен израз в URL.
Пример и заобиколно решение
{if( 1 ,"","")}information{if( 1 ,"","")}
е повредена с XSS защита, тук можете да използвате{if(1," <strong>information</strong>","information")}
<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
information","information")}{if(1,"
<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
Достъп до променливи
Expression Manager предоставя достъп само за четене до променливите, от които може да имаме нужда. За обратна съвместимост, той осигурява достъп до следното:
- TOKEN:xxx - стойността на TOKEN (напр. TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (Само за НЕанонимно проучване).
- INSERTANS:SGQA - показваната стойност на отговор (напр. "Да"). За Expression Manager е същото като използването на {QCODE.shown}.
- Всички {XXX} стойности, използвани от шаблони.
- В текста на въпроса можете да използвате {QID} заменено от идентификатора на въпроса и {SGQ}, заменен от SGQA на въпроса
В допълнение, Expression Manager ви позволява да се обръщате към променливите чрез кода на въпроса (колоната „заглавие“ в таблицата с въпроси в базата данни). Това също е етикетът на променливата, използван, когато експортирате вашите данни към SPSS, R или SAS. Например, ако имате въпроси относно име, възраст и пол, можете да наречете тези променливи „име“, „възраст“ и „пол“ вместо „12345X13X22“, „12345X13X23“. “ и „12345X13X24”. Това прави уравненията по-лесни за четене и потвърждаване на логиката от всички, плюс дава възможност за разбъркване на въпроси, без да се налага да следите номерата на групи или въпроси.
Важно: Безопасно е да се отнасят само към променливи, които се срещат в предходните страници или въпроси.
Освен това, Expression Manager ви позволява достъп до много свойства на въпроса:
Синтаксис | Значение | Пример | Примерен резултат | ||||
---|---|---|---|---|---|---|---|
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)} | - | 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' |
Проблем с HTML редактора
Ако използвате HTML редактор, някои знаци се заменят с HTML обекти.
- & от &
- < от <
- > от >
Ако използвате HTML редактор, трябва да използвате :
- и за &
- lt for <
- le for <=
- gt for >
- ge за >=
Именуване на променливи в Qcode
Ето подробностите за това как да конструирате Qcode (и да получите достъп до някои свойства) по тип въпрос. Като цяло Qкодовете се конструират като:
QuestionCode . „_“. ID на подвъпроса. „_“. ScaleId
За comment и other кодът на въпроса е QuestionCode_comment и QuestionCode_other
Тип | Описание | Код | SubQs | Опции за отговор | Везни | Код на отговора | Отговорът е показан | Уместност |
---|---|---|---|---|---|---|---|---|
5 | 5 Радио бутони за избор на точка | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
B | Масив (Избор от 10 точки) Радио-бутони | Q2 | |1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | ||
A | Масив (избор от 5 точки) Радио-бутони | Q3 | |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 | |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 | | | {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'} |
Запазените променливи '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) използвате променливи, които нямат подвъпроси (напр. въпроси с единичен отговор). В тези случаи добавянето на префикс към променлива с „това“ е пресилено и рискувате да получите неочаквани резултати.
Използване на 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
Достъп до функции
Expression Manager предоставя достъп до математически, низови и дефинирани от потребителя функции, както е показано по-долу. Има еквиваленти на PHP и JavaScript за тези функции, така че да работят еднакво от страната на сървъра (PHP) и от страната на клиента (JavaScript). Лесно е да добавяте нови функции.
Въведени функции
В момента са налични следните функции:
Function | Meaning | Syntax |
---|---|---|
abs | Absolute value | number abs(number) |
acos | Arc cosine | number acos(number) |
addslashes | Quote string with slashes | string addslashes(string) |
asin | Arc sine | number asin(number) |
atan | Arc tangent | number atan(number) |
atan2 | Arc tangent of two variables | number atan2(number, number) |
ceil | Round fractions up | number ceil(number) |
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) |
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) |
date | Format a local date/time | string date(format [, timestamp=time()]) |
exp | Calculates the exponent of e | number exp(number) |
fixnum | Display numbers with comma as radix separator, if needed | string fixnum(number) |
floor | Round fractions down | number floor(number) |
gmdate | Format a GMT date/time | string gmdate(format [, timestamp=time()]) |
html_entity_decode | Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8) | string html_entity_decode(string) |
htmlentities | Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlentities(string) |
expr_mgr_htmlspecialchars | Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars(string) |
expr_mgr_htmlspecialchars_decode | Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars_decode(string) |
idate | Format a local time/date as integer | string idate(string [, timestamp=time()]) |
if (Updated in 3.0.2 ) | Excel-style if(test,result_if_true[,result_if_false = ""]) | if(test,result_if_true[,result_if_false = ""]) |
implode | Join array elements with a string | string implode(glue,arg1,arg2,...,argN) |
intval | Get the integer value of a variable | int intval(number [, base=10]) |
is_empty | Determine whether a variable is considered to be empty | bool is_empty(var) |
is_float | Finds whether the type of a variable is float | bool is_float(var) |
is_int | Find whether the type of a variable is integer | bool is_int(var) |
is_nan | Finds whether a value is not a number | bool is_nan(var) |
is_null | Finds whether a variable is NULL | bool is_null(var) |
is_numeric | Finds whether a variable is a number or a numeric string | bool is_numeric(var) |
is_string | Find whether the type of a variable is string | bool is_string(var) |
join (New in 2.0 build 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 (New in 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) |
log | The logarithm of number to base, if given, or the natural logarithm. | number log(number,base=e) |
ltrim | Strip whitespace (or other characters) from the beginning of a string | string ltrim(string [, charlist]) |
max | Find highest value | number max(arg1, arg2, ... argN) |
min | Find lowest value | number min(arg1, arg2, ... argN) |
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) |
nl2br | Inserts HTML line breaks before all newlines in a string | string nl2br(string) |
number_format | Format a number with grouped thousands | string number_format(number) |
pi | Get value of pi | number pi() |
pow | Exponential expression | number pow(base, exp) |
quoted_printable_decode | Convert a quoted-printable string to an 8 bit string | string quoted_printable_decode(string) |
quoted_printable_encode | Convert a 8 bit string to a quoted-printable string | string quoted_printable_encode(string) |
quotemeta | Quote meta characters | string quotemeta(string) |
rand | Generate a random integer, see this example | int rand() OR int rand(min, max) |
regexMatch | compare a string to a regular expression | bool regexMatch(pattern,input) |
round | Rounds a number to an optional precision | number round(val [, precision]) |
rtrim | Strip whitespace (or other characters) from the end of a string | string rtrim(string [, charlist]) |
sin | Sine | number sin(arg) |
sprintf | Return a formatted string | string sprintf(format, arg1, arg2, ... argN) |
sqrt | Square root | number sqrt(arg) |
stddev | Calculate the Sample Standard Deviation for the list of numbers | number stddev(arg1, arg2, ... argN) |
str_pad | Pad a string to a certain length with another string | string str_pad(input, pad_length [, pad_string]) |
str_repeat | Repeat a string | string str_repeat(input, multiplier) |
str_replace | Replace all occurrences of the search string with the replacement string | string str_replace(search, replace, subject) |
strcasecmp | Binary safe case-insensitive string comparison | int strcasecmp(str1, str2) |
strcmp | Binary safe string comparison | int strcmp(str1, str2) |
strip_tags | Strip HTML and PHP tags from a string | string strip_tags(str, allowable_tags) |
stripos | Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found) | int stripos(haystack, needle [, offset=0]) |
stripslashes | Un-quotes a quoted string | string stripslashes(string) |
stristr | Case-insensitive strstr | string stristr(haystack, needle [, before_needle=false]) |
strlen | Get string length | int strlen(string) |
strpos | Find position of first occurrence of an unicode string (starting by 0, return false if not found) | int strpos(haystack, needle [ offset=0]) |
strrev | Reverse a string | string strrev(string) |
strstr | Find first occurrence of a string | string strstr(haystack, needle[, before_needle=false]) |
strtolower | Make a string lowercase | string strtolower(string) |
strtotime | Parse about any English textual datetime description into a Unix timestamp | int strtotime(string) |
strtoupper | Make a string uppercase | string strtoupper(string) |
substr | Return part of an unicode string | string substr(string, start [, 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) |
tan | Tangent | number tan(arg) |
time | Return current UNIX timestamp | number time() |
trim | Strip whitespace (or other characters) from the beginning and end of a string | string trim(string [, charlist]) |
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) |
Функции, които са планирани или се обмислят
Други функции, които са планирани (или се обмислят), но които все още не са изпълнени, включват следното. Някои от тях са за обратна съвместимост с друг инструмент за проучване.
Синтаксис | Значение | Коментари | ||||
---|---|---|---|---|---|---|
e() | връща стойността на e | |||||
formatDate(X, PAT) | връща стойността на низа на дата X, форматиран според модела на формат на данни на Java PAT | |||||
formatNumber(X,PAT) | връща стойността на низа на числото X, форматиран според номера на Java модел на формат PAT | |||||
getAnsOption(X) | Основна добавка ExpressionAnswerOptions | |||||
getAnsOption(X,Y) | Основен плъгин 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* | |||||
jumpTo(X) | прескачане до групата, съдържаща посочения въпрос -- това нарушава нормалното поток на системата | |||||
jumpToFirstUnasked() | прескачане към първия незададен въпрос |
|||||
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 = разделен с вертикална черта списък на заглавки на таблици, така че може да се интернационализира отчетът. |
Мениджърът на изрази знае кои променливи са локални
За да изгради правилно JavaScript за страницата, Expression Manager трябва да знае кои променливи са зададени на страницата и какъв е техният JavaScript ID (напр. за document.getElementById(x)). Той също така трябва да знае кои променливи са зададени на други страници (за да може да гарантира, че необходимите<input type='hidden' value='x'> полетата са налични и попълнени).
Каскадни условия
Ако някоя от променливите е неуместна, цялото уравнение ще бъде неуместно (фалшиво). Например в следващата таблица N/A означава, че една от променливите не е уместна
Оператор | Пример | a | b | Резултат | |||||
---|---|---|---|---|---|---|---|---|---|
+ (единичен) | +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 | |||||
+ | 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 | |||||
|(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 | - | функция | 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 |
Отменящи каскадни условия
Да кажем, че искате да покажете текущ сбор от всички подходящи отговори. Може да опитате да използвате уравнението {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') ще продължи да проверява дали отговорът е уместен и ще върне '' ако не е (така че отделните неуместни отговори ще бъдат игнорирани, но те няма да анулират целия израз).
И така, решението на текущия общ проблем е да се използва уравнението sum(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
Използването на суфикса .NAOK също позволява на авторите да проектират анкети, които имат няколко възможни пътя, но след това се събират в общи пътища по-късно. Например, кажете, че субектите отговарят на анкета по начин, който е извън нормалния диапазон от отговори. Авторът може да предупреди субектите, че може да не получат валидни резултати и да ги попита дали наистина искат да продължат с проучването. Ако кажат „Да“, тогава ще се покажат останалите въпроси. Условието за „останалите въпроси“ ще провери дали на първоначалните отговори е отговорено в рамките на нормалния диапазон ИЛИ дали субектът е казал „Да“ на въпроса, който е уместен само ако е отговорил извън нормалния диапазон.
Как Expression Manager поддържа условно микро-приспособяване?
Ето пример за микро-приспособяване (където Question Type=='expr' означава уравнение):
Код на въпрос | Уместност | Тип въпрос | Въпрос |
---|---|---|---|
име | 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 | Колко деца имате? |
kid2 | parents && numKids >= 2 | text | На колко години е второто ви дете? |
kid3 | родители && numKids >= 3 | текст | На колко години е третото ви дете? |
kid4 | родители && numKids > = 4 | text | На колко години е четвъртото ви дете? |
kid5 | roditeljи && numKids >= 5 | text | На колко години е петото ви дете? |
отчет | |дано | {име}, ти каза, че си на {възраст} и че имаш {numKids}. Сборът на възрастта на вашите първи {min(numKids,5)} деца е {sumage} |
Всички тези въпроси могат да бъдат на една страница (напр. в една и съща група) и ще се показват само съответните въпроси. Освен това, докато въвеждате възрастта на децата, изразът sum() в последния въпрос ще се актуализира динамично на страницата.
<html>Expression Manager предоставя тази функционалност, като обгражда всеки израз с име елемент. Всеки път, когато дадена стойност се промени, тя преизчислява израза, който трябва да се появи в нея елемент и регенерира дисплея. Можете да имате десетки или дори стотици такива персонализирани изрази на една и съща страница и страницата ще ги покаже отново всички с едно опресняване на екрана.
Съпоставяне на LimeSurvey 1.91+ към функционалността на Expression Manager
Стара функция | Нова функция | Коментари |
---|---|---|
Условия | Уместност | Можете да използвате много сложни условни уравнения и да имате достъп до по-широк набор от променливи |
Оценки | Уравнение | Всички оценки могат да бъдат преструктурирани в уравнение. Това едновременно гарантира, че резултатът се записва в базата данни, и също така ви позволява да видите динамични промени в стойността на резултата на текущата страница |
Замени | 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 обработете ги. По този начин минималните/максималните стойности могат да бъдат самите изрази |
Осветяване на синтаксиса
За да помогне при въвеждането и валидирането на изрази, EM предоставя подчертаване на синтаксиса със следните функции:
Видове и значения на осветяването на синтаксиса
Color | Sample | Meaning | Tooltip | Comments |
---|---|---|---|---|
тен фон | Sample | the цялото уравнение | няма | Всичко във къдрави скоби, което се разпознава като уравнение (напр. няма начален или завършващ бял интервал), ще бъде цветно кодирано с кафяв фон, за да се разграничи от околния текст |
син текст | Пример | име на функция | значение и допустим синтаксис | имена на функции или неща, които трябва да бъдат функции, тъй като са последвани от отваряща скоба, са представени в удебелен син текст. Подсказките показват значението и допустимия синтаксис за функцията. |
сив текст | Пример | низ | няма | низовете с единични и двойни кавички са показани в сив текст |
циан текст | Примерна | набор на променлива на същата страница, | [ име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност | Всяка променлива, която е зададена на същата страница като текущия въпрос, се показва в циан текст, което показва, че може да се актуализира в javascript. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |
зелен текст | Примерна | променлива, зададена на предишна страница | [ име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност | Всяка променлива, която е зададена на предишна страница, се показва с удебелен зелен текст. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |
удебелен розов текст | Sample | променлива, зададена на по-късна страница като цяло: празна в началото на анкетата, но може да бъде запълнена с индекс или да премести предишната | [ име или SGQA код]: въпрос; стойност; answerList, показващ кодове за всяка стойност | Всяка променлива, която е зададена на следващата страница, се показва с удебелен розов текст. Подсказката показва неговото име (ако сте използвали INSERTANS:xxx) или SGQA код (ако сте използвали новата система за именуване), действителния въпрос и текущата му стойност (или празно, ако не е зададено). Ако типът въпрос очаква отговори от набор от изброени стойности, съпоставянето на кодовете към стойностите за показване е show. |
bold tan text | Пример | стойност за замяна на lime | стойността | Низовете за замяна на lime (като {TOKEN:xxx}, {PRIVACY_MESSAGE}) са показани с получер текст. |
червен текст | Пример | оператор за присвояване (=) | предупредително съобщение | Ако използвате един от операторите за присвояване (=), този оператор ще се покаже в червен текст. Това има за цел да помогне за предотвратяване на случайно повторно присвояване на стойности, когато наистина искате да проверите дали a == b вместо да зададете стойността на a = b. |
нормален черен текст | Пример | пунктуация | няма | Всички останали препинателни знаци в рамките на израза се показват като нормален черен текст. |
текст в червено поле | удебелена червена линия обгражда грешката | синтаксична грешка | описание на грешката | Всички открити синтактични грешки се показват, като обграждат грешката с червена кутия. Подсказката показва грешката. Примерите включват несъответстващи скоби, използване на недефинирани функции, подаване на грешен брой аргументи на функции, лошо структурирани изрази (напр. липсващи оператори между променливи), опит за присвояване на нова стойност на променлива само за четене, опит за присвояване на стойности на не- променливи или използване на неподдържан синтаксис. Имайте предвид, че системата за откриване на синтактични грешки може да докладва само една грешка в израз, дори ако има множество грешки; обаче, ако бъдат открити грешки, ще се покаже поне една грешка. |