Приклади опитувань ExpressionScript
From LimeSurvey Manual
Вступ
Найкращий спосіб навчитися користуватися ExpressionScript — пограти з робочими прикладами та змінити їх відповідно до ваших потреб.
Нижче наведено набір прикладів опитувань, які демонструють (і дозволяють перевірити), як EM може покращити ваше опитування. Ці опитування можна знайти в папці /docs/demosurveys дистрибутива.
Релевантність, персоналізація та рівняння
Огляд
Наступний приклад обчислює ІМТ (індекс маси тіла) кожного респондента. Нижче наведено функції, які демонструє цей приклад.
Продемонстровані можливості EM
- Релевантність — підтримка потужної умовної логіки;
- Підстановка / Персоналізація — можливість підставляти або персоналізувати відповіді та метадані питань;
- Динамічна персоналізація — зверніть увагу, що звіти на сторінці змінюються в міру того, як ви відповідаєте на питання.
- Мікроперсоналізація — умовна персоналізація в реченнях і звітах за допомогою операторів if()
- Рівняння — новий тип питання, який дає змогу виконувати обчислення та зберігати результати в базі даних, навіть якщо обчислення приховане
- Умовна перевірка — критерії перевірки, наприклад мінімальне допустиме значення, можуть бути умовними, наприклад на основі рівнянь.
Знімки екрана
Цей приклад обчислює індекс маси тіла — розрахунок на основі вашої ваги та зросту, щоб визначити, чи є у вас недостатня вага, нормальна вага, надлишкова вага або ожиріння. Зверніть увагу, що спочатку ви бачите лише чотири обов'язкові питання:

Після введення даних (ви самі обираєте, які одиниці використовувати — метричні чи неметричні) ви бачите персоналізований звіт, який підсумовує введені дані та повідомляє ваш статус ваги:

Ось інший приклад, у якому використано неметричні одиниці, щоб показати, як динамічно змінюється результат:

На внутрішньому рівні є приховані питання типу «Рівняння», які перетворюють дані на метричні (за потреби) і зберігають у базі даних зріст, вагу, ІМТ і статус ваги в метричних одиницях без використання власного JavaScript.
У наступному наборі прикладів можна побачити, як використовувати математичні та інші функції в персоналізованих звітах. Так виглядає сторінка до введення будь-яких даних. Передбачено умовну логіку, яка показує порожні клітинки, якщо дані не введено (або введено нечислові), замість «NaN» чи «Divide by Zero».

Під час введення чисел звіт на сторінці змінюється, показуючи виконуване обчислення та його результат.

У цьому прикладі опитування є багато інших прикладів. Наприклад, на знімку екрана нижче показано один із десятків способів заповнити сторінку «Dynamic Relevance». Як зазначено в тексті довідки, спробуйте різний вік, а особливо нелогічні комбінації відповідей, щоб побачити кумедні повідомлення, які генеруються внизу. Також зверніть увагу: якщо ви вкажете, що маєте більше однієї дитини, повідомлення буде таким: «I hope you enjoy playing with your X children», а не «I hope you enjoy playing with your child». Це показує, як легко мікроперсоналізувати речення, щоб вони відповідали статі та/або кількості ваших респондентів. Ви навіть можете легко відмінювати дієслова та іменники за родом і числом.

Завантаження
Щоб отримати приклад опитування, перейдіть за таким посиланням: LS3_em_tailoring.zip.
Приклад перепису населення
Огляд
Це приклад перепису, у якому запитується, скільки осіб проживає у вашому домогосподарстві.
Він демонструє, як релевантність на рівні групи може спростити реалізацію «циклу» питань. Створивши групу для Особи 1, я експортував цю групу. Оскільки я використовував імена змінних на основі qcode, як-от p1_name, замість коду SGQA, я міг швидко відредагувати групу в текстовому редакторі та кілька разів повторно імпортувати її (наприклад, на редагування та повторний імпорт кожної повторюваної групи йшло близько 10 секунд, при цьому всі змінні мали унікальні імена, а логіка на рівні групи була правильною).
Ви також можете скористатися функцією Копіювати питання, але вона буде не такою швидкою, як запропонований вище варіант.
Це також показує, як можна запобігти появі повідомлення про завершення, доки опитування справді не буде завершено (наприклад, коли заповнено всі потрібні групи).
Продемонстровані можливості EM
- Релевантність на рівні групи - наступні групи (Особа 1-5) відображаються лише в межах указаної кількості співмешканців;
- Персоналізація - підсумковий звіт узагальнює демографічні дані про кожного співмешканця;
- Поступове відображення питань - як у режимі «група за групою», так і в режимі «все на одній сторінці», наступні питання з'являються лише після відповіді на попередні.
Знімки екрана
Опитування формує персоналізований звіт із демографічними даними про вказану кількість співмешканців:

Якщо перейти в режим «питання за питанням», ви побачите, що індекс персоналізує питання. Оскільки користувач вказав, що ця особа — жінка, запитується «Як її звати». А оскільки ми відповіли «Мері», наступне питання звучить: «Скільки років Мері?»

Завантаження
Щоб завантажити зразок опитування, натисніть тут: LS3_group_relevance.zip.
Каскадні фільтри масиву
Огляд
Це опитування базується на дизайні опитування, наданого компанією Joy Lane Research, LLC.
Знімки екрана
Зверніть увагу на таке:
- Q02 показує лише набір продуктів, позначених у Q01 (за допомогою array_filter)
- Q02 також показує «Another product» — текст, введений у поле «Other electronic» у Q01
- Q04 показує лише ті продукти з Q02, які були позначені (отже, фільтр масиву працює каскадно)
- Q05 показує лише ті продукти з Q02, які не були позначені в Q02 (за допомогою каскадного array_filter_exclude)


Завантаження
Натисніть на таке посилання, щоб завантажити наведений вище приклад: приклад опитування LS2_cascading_array_filter.
Передавання даних і персоналізація з усіма типами питань та атрибутами
Огляд
Якщо ви не певні, як називати змінні (SGQA чи Qcode), ви не самотні. Хоча в основній документації описано, як складати імена змінних Qcode, ніщо не зрівняється з робочою демонстрацією. Це опитування показує, як отримати доступ до атрибутів питань і відповідей за допомогою ExpressionScript.
Вміст
- Приклади кожного типу питань
- Включено всі типи питань, які можуть використовувати «Інше», щоб ви могли побачити, як це впливає на іменування змінних
- Значення за замовчуванням для всіх типів питань, що їх підтримують
- Персоналізація — звіти на сторінці та поза нею, що показують усі 16 доступних суфіксів крапкової нотації EM.
- Ці звіти показують усі введені на цей момент дані (тож ви побачите, як створювати власні звіти для користувачів, які можна друкувати, замість екрана друку відповідей)
- Правильне іменування всіх змінних за Qcode та SGQA
Знімки екрана
Це величезне опитування, тому ми вирішили не додавати знімки екрана. Натомість завантажте його та поекспериментуйте.
Завантаження
Натисніть на таке посилання, щоб завантажити опитування: LS3_EM_question_attributes.lss
Традиційна перевірка в новому баченні
Огляд
Цей приклад демонструє всі типи перевірки, що використовують вирази, і те, як вони впливають на кожен із типів питань, які підтримують перевірку. У багатьох випадках підказки щодо перевірки спочатку приховані й з’являються лише тоді, коли питання не відповідає критеріям перевірки (і так само зникають, щойно питання їх задовольняє).
Продемонстровані типи перевірки
- min_num_value_n - мінімальне значення відповіді
- max_num_value_n - максимальне значення відповіді
- min_answers - мінімальна кількість потрібних відповідей
- max_answers - максимальна кількість дозволених відповідей
- multiflexible_min - мінімальне дозволене значення відповіді (для типу питання «багатогнучкі числа»)
- multiflexible_max - максимальне дозволене значення відповіді (для типу питання «багатогнучкі числа»)
- min_num_value - мінімальна дозволена сума всіх відповідей на питання
- max_num_value - максимальна дозволена сума всіх відповідей на питання
- equals_num_value - сума всіх відповідей на питання має дорівнювати цьому значенню
- validation - це перевірка питання за регулярним виразом, яка може застосовуватися до окремих комірок
Знімки екрана
Завдяки новим стилям CSS кожен тип перевірки відображає окрему підказку. Якщо підказки показано, їх можна приховати за допомогою опції hide_tip. За замовчуванням підказки відображаються червоним шрифтом, якщо питання не відповідає критеріям перевірки, і зеленим, якщо відповідає:

Користувач не може надіслати сторінку з помилками перевірки. Якщо він введе неправильні дані, його одразу попередять:

Перевірку можна застосовувати до окремих комірок масиву. Наприклад, у цьому прикладі перевірки за регулярним виразом гарантують, що кожен запис є правильно відформатованим телефонним номером США, зокрема з кодом регіону.

Завантаження
Щоб завантажити наведений вище приклад, натисніть на це посилання: LS3_Validation_tests.zip.
Рівняння перевірки
Огляд
Іноді потрібна нестандартна перевірка, якої неможливо досягти за допомогою традиційних критеріїв мінімуму/максимуму. Для цього використовуйте опції em_validation_q та em_validation_sq, які дають змогу створювати складні рівняння перевірки на рівні питання та підпитання відповідно.
Продемонстровані можливості EM
- em_validation_q - це рівняння, яке визначає, чи є все питання коректним
- em_validation_q_tip - це повідомлення, яке показується, якщо питання не відповідає критеріям em_validation_q
- em_validation_sq - це рівняння, яке визначає, чи є кожне підпитання (комірка масиву) коректним
- em_validation_sq_tip - це повідомлення, яке показується, якщо будь-яке з підпитань є некоректним.
Зазвичай, коли використовується em_validation_sq, якщо будь-яка комірка некоректна, колір фону цієї комірки стає червоним, що вказує на помилку.
Знімки екрана

Це питання гарантує, що ви вводите вік своїх дітей у порядку спадання, застосовуючи таке рівняння перевірки:
q1_sq1 >= q1_sq2 && q1_sq2 >= q1_sq3 && q1_sq3 >= q1_sq4

У наведеному нижче прикладі перевірка гарантує, що в жодному рядку не надано відповіді більш ніж на 3 питання, застосовуючи таке рівняння перевірки:
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= 3) && (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= 3) && (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= 3)
Це можна також записати так, і LimeSurvey автоматично перетворить це під час виконання на наведений вище вираз.
(sum(self.sq_A) <= 3) && (sum(self.sq_B) <= 3) && (sum(self.sq_C) <= 3)

Завантаження
Щоб завантажити зразок опитування, використаний у наведених вище прикладах, натисніть на таке посилання: ls2_test_em_sq_validation.lss.
Релевантність підпитань
Огляд
Цей приклад показує, як можуть взаємодіяти array_filter та критерії перевірки. Для перевірок, що застосовуються до сум, враховуються лише релевантні (видимі) значення.
Продемонстровані можливості EM
Він також показує динамічне відображення кількості питань, на які надано відповіді, в основних питаннях.
Знімки екрана
Зміна кількості видимих рядків динамічно змінює суму. Позначення підпитання як нерелевантного не очищає його значення. Натомість, якщо підпитання нерелевантне, його значення не враховуються в жодному рівнянні.


Зверніть увагу, що відбувається, коли ми відзначаємо «П'яте підпитання» для першого питання «Які рядки мають з'явитися нижче». Сума для другого питання «Введіть кілька чисел» тепер дорівнює 5. Хоча п'яте підпитання цього питання все ще має значення 14 (наприклад, якщо зняти позначку з п'ятого підпитання, ви знову побачите значення 14), це значення не враховується в сумі, оскільки зараз воно нерелевантне. Усі нерелевантні дані очищаються (в базі даних встановлюється NULL) під час надсилання, але на сторінці вони залишаються доступними на випадок, якщо respondentи захочуть або їм доведеться змінити свою думку щодо відповідей.

Завантаження
Щоб завантажити наш приклад, натисніть тут: ls2_subquestion_relevance.lss.
Використання коми як роздільника цілої та дробової частин (десяткова кома)
Огляд
ExpressionScript гарантує, що в числові поля можна вводити лише допустиме число. Якщо ви введете недопустиме число, вас попередять, що щось не так (наприклад, у темі fruity усе питання буде виділено червоним).
Зверніть увагу, що в базі даних числові значення завжди перетворюються так, щоб роздільником цілої та дробової частин була крапка. Завдяки цьому статистичний аналіз працюватиме правильно.
Щоб змінити роздільник цілої та дробової частин, відкрийте параметри Текстові елементи, розташовані на вкладці Налаштування, і знайдіть функцію Десяткова відмітка.
Типи питань, що використовують роздільник цілої та дробової частин
- Числове введення [N]
- Багаторазове числове введення [K]
- Масив (числа) [:]
- Масив (тексти) [;], за використання атрибута numbers_only
- Список (одна відповідь) [L], за використання атрибута other_numbers_only
- Короткий довільний текст [S], за використання атрибута numbers_only
- Кілька коротких текстів [Q], за використання атрибута numbers_only
- Множинний вибір [M], за використання атрибута other_numbers_only
- Множинний вибір з коментарями [P], за використання атрибута other_numbers_only
Знімки екрана
На наведених нижче знімках екрана видно, що кому можна використовувати як роздільник цілої та дробової частин.

Завантаження
Щоб завантажити наведений вище приклад, натисніть на таке посилання: ls2_comma_as_radix_separator.lss.
Групи рандомізації
Огляд
Це опитування демонструє, як використовувати атрибут random_group.
Якщо використовується цей атрибут, то під час кожного запуску опитування порядок питань рандомізується. Однак після початку опитування порядок рандомізації залишається незмінним, навіть якщо ви змінюєте мову.
Знімки екрана
Розгляньмо разом наведений нижче приклад. Першим випадковим питанням на сторінці буде Q1, Q4 або Q7. Другим рандомізованим питанням на сторінці буде Q2, Q5 або Q8.

Ось рандомізація, згенерована під час першого тестування цього опитування.

Під час другого тестування опитування було згенеровано іншу рандомізацію.

Але коли я переключився на французьку мову (не перезапускаючи опитування), порядок рандомізації залишився незмінним.

Завантаження
Щоб завантажити наведений вище приклад, натисніть на таке посилання: Randomization_Group_Test.lss
Випадково ставити одне питання на групу
Огляд
Це опитування показує, як налаштувати опитування так, щоб випадковим чином відображати одне питання з кожної групи. У ньому є 5 груп по 6 питань. На початку, у групі 0, заповнюються п’ять прихованих питань типу «Рівняння» з назвами ask1–ask5. Кожне з них має значення {floor(rand(1,6.9999))} у полі тексту питання, що означає, що змінні ask1–ask5 матимуть значення від 1 до 6. Далі кожне питання в групі має рівняння релевантності на кшталт «ask1==N», де N — номер питання в групі (тобто третє питання в групі 1 має рівняння релевантності «ask1==3»).
Це опитування однаково добре працює в режимах «усе опитування одразу», «група за групою» та «питання за питанням». Оскільки рандомізація задається в першій групі, а ця група фактично прихована (адже всі питання ask1–ask5 приховані), рандомізація для респондента залишається незмінною, але кожен інший респондент матиме власну рандомізацію.
Продемонстровані можливості
- Тип питання «Рівняння»
- Функції рандомізації
- Умовна функція (if)
Знімки екрана
Це Group0, яка використовує тип питання «Рівняння» для вибору випадкових значень від 1 до 6 для кожної групи (крім останньої групи, яка містить лише 4 питання). Зверніть увагу, що функція «if()» спочатку перевіряє, чи вже задано значення ask1, і якщо так, використовує його. Якщо значення не задано, функція використовує випадкове значення для встановлення ask1.

Ця група показує, як змінна (ask4) з Group0 використовується для керування тим, яке питання відображається в четвертій групі.

Завантаження
Щоб завантажити наведений вище приклад опитування, натисніть тут: Приклад опитування з випадковими питаннями в групі.
Випадково ставити певну кількість питань у групі (підмножина питань)
Огляд
Це опитування показує, як поставити випадкову підмножину питань у групі. Наприклад, показати 5 випадкових питань із 10, розташованих у групі.
Опитування має одну групу з 10 питаннями. Усім питанням призначено однакову назву групи рандомізації. Тому під час завантаження сторінки вони відображатимуться у випадковому порядку. Для кожного питання задано рівняння релевантності: сума значень "relevanceStatus" усіх інших питань групи має бути меншою за кількість питань, які ви хочете показати. Оскільки relevanceStatus призначається під час відображення питань, ця сума фактично дорівнює кількості попередніх питань.
Отже, у нашому прикладі «5 із 10» рівняння для Q1 буде таким:
sum(Q2.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
Для Q2 воно буде таким:
sum(Q1.relevanceStatus, Q3.relevanceStatus, Q4.relevanceStatus, Q5.relevanceStatus, Q6.relevanceStatus, Q7.relevanceStatus, Q8.relevanceStatus, Q9.relevanceStatus, Q10.relevanceStatus) LT 5
І так далі...
Продемонстровані можливості
Завантаження
Щоб завантажити наведений вище приклад, перейдіть за таким посиланням: Приклад опитування «5 випадкових із 10».
Оцінювання списку продуктів, введеного користувачем
Огляд
Наведений нижче приклад показує, як попросити користувачів перелічити продукти, що їх цікавлять, а потім оцінити ці продукти.
Продемонстровані можливості ES
- Адаптація відповідей - під час оцінювання продуктів підписи беруться з поля коментаря попереднього питання з множинним вибором
- Адаптація шкал - багато розширених параметрів питань, як-от заголовки шкал, також можна адаптувати.
Знімки екрана
На цьому зображенні видно, що, оскільки вибрано лише продукти 1, 3 і 5, відображаються тільки ці три (за допомогою атрибута array_filter). Крім того, підписи рядків у другому питанні — це або номери продуктів (якщо в поле коментаря нічого не введено), або вміст полів коментарів.

Це зображення показує, як задаються адаптовані відповіді:

Ось файл логіки для цього питання, який дає змогу перевірити, чи умовна логіка працює належним чином (наприклад, чи немає синтаксичних помилок):

Наступне зображення показує групу, у якій ви задаєте 5-бальну шкалу оцінювання (варіанти 1-5), назву шкали та продукти, які хочете оцінити. Останнє питання демонструє, що кожну з частин табличного питання можна адаптувати:

Наступне зображення показує перегляд файлу логіки останнього питання. Як видно, підпитання, відповіді та заголовки шкал можна адаптувати.

Завантаження
Щоб завантажити наведений вище приклад опитування, перейдіть за таким посиланням: Приклад опитування з оцінюванням списку продуктів, введеного користувачем.