x

Основні розділи

  1. LimeSurvey Cloud проти LimeSurvey CE
  2. Короткий посібник із початку роботи - LimeSurvey 3.0+
  3. Встановлення - LimeSurvey CE
  4. Як створити хороше опитування (посібник)
  5. Початок роботи
  6. Адміністрування LimeSurvey
  7. Опитування - вступ
  8. Налаштування опитування
  9. Меню опитування
  10. Структура опитування
  11. Питання - вступ
  12. Групи питань - вступ
  13. Опитування - керування
  14. Параметри панелі інструментів опитування
  15. Багатомовне опитування
  16. ExpressionScript Engine - Короткий посібник
  17. Некатегоризовані та розширені функції
  18. Загальні поширені запитання
  19. Усунення несправностей
  20. Обхідні рішення
  21. Ліцензія
  22. Журнал змін версій
  23. Плагіни
 Actions

Приклади ExpressionScript

From LimeSurvey Manual

Ця сторінка, можливо, перекладена машинним способом і може містити помилки. Показати англійський оригінал · Покращити цей переклад
This page is a translated version of the page ExpressionScript examples and the translation is 100% complete.
Будь ласка, допоможіть розширити цю статтю, додавши власні приклади. Це допоможе іншим розпочати роботу зі скриптом виразів.


Структура

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


Категорії виразів

LimeSurvey використовує вирази для таких цілей:


Актуальність

Призначення: приховування груп питань/питань

Актуальність визначає, чи буде група питань або питання показано чи приховано. Якщо результат виразу — «true» (тобто 1), елемент буде показано. В іншому випадку (якщо результат виразу — «false», тобто 0) елемент буде приховано.

Тип Показує/приховує Де знайти Знімок екрана
Актуальність групи питань група питань Створити/Редагувати групу питань -> "Рівняння релевантності:"
Актуальність питання питання Створити/Редагувати питання -> "Рівняння релевантності:"
Актуальність підпитання підпитання Змінити підпитання -> "Рівняння релевантності:"


Перевірка

Призначення: перевірка введених даних/дій для питань/підпитань/відповідей

Перевірка визначає, чи є введені респондентом дані або дія допустимими. Якщо результат виразу — «true» (тобто 1), до елемента та повідомлення про перевірку буде застосовано клас «good». В іншому випадку, якщо результат виразу — «false» (тобто 0), до елемента та повідомлення про перевірку буде застосовано клас «error». Стиль для цих класів можна визначити у файлі template.css.

Тип Перевіряє Де знайти Знімок екрана
Перевірка питання питання Створити/Редагувати питання -> "Вкладка Логіка" -> "Рівняння перевірки питання"
Перевірка підпитання підпитання Створити/Редагувати питання -> "Вкладка Логіка" -> "Рівняння для перевірки додаткового запитання" ‎

Виведення тексту

Призначення: (виконати певну дію) і вивести текст

Вираз можна використовувати для виведення тексту. Наприклад, ви можете щось перевірити або обчислити та визначити вивід залежно від результату перевірки чи обчислення. Також його можна використовувати для вставки тексту питання, відповідей, типів питань тощо з питання, яке було використане раніше за вираз. Виведення тексту можна використовувати всюди, де відображається текст, і воно може повертати будь-які результати.

Випадок використання Опис
Мікро-налаштування Змінити текст, наприклад, написати «пан» або «пані» залежно від відповіді на попереднє питання про стать
Обчислення Обчислити значення та вивести його, наприклад, «Дохід вашої родини становить xxx»
Посилання Вставити текст з елемента, наприклад, «Вас звати xxx. Скільки вам років?»


Збереження відповідей

Призначення: (виконати певну дію,) (вивести текст) і зберегти щось у базі даних

Тип питання «Рівняння» можна використовувати для збереження чогось у базі даних. Ви можете виконати певну дію за допомогою виразу, показати питання типу «Рівняння» (схоже на відображення тексту) і зберегти результат виразу в базі даних. Відповідь зберігається в таблиці відповідей. Потім результат можна використовувати у функції статистики або імпортувати в один із форматів, які надає функція експорту LimeSurvey.

Приклади виразів

Вставка відповіді з попереднього питання

Призначення Вставити відповідь з попереднього питання
Тип Посилання
Приклад Питання перше (код питання «Q00»): У якому місті ви живете?
Питання друге (код питання «Q01»): Як довго ви живете в місті CITY?
Завдання: відповідь на перше питання потрібно використати замість «CITY» у другому питанні.
Вираз {QOO}
Опис Відповідь, надана в Q00, замінює поле Q00 у другому питанні
Кроки Створити/Редагувати друге питання
Вставте «Як довго ви живете в {QOO} (років)?» у поле тексту питання

Використання прихованого питання типу «Рівняння» для автоматичного заповнення відповіді

Проблема: Уявіть, що у вас є два питання: Q1 і Q2. Q1 запитує респондентів про їхній вік. Q2 ділить респондентів на три групи: вік менший за 20 років, вік дорівнює 20, вік більший за 20. Тож Q2 має використовувати значення «1», «2», «3», що відповідають наведеним умовам. Також не забудьте зробити Q2 невидимим (питання не відображатиметься в опитуванні, але значення буде збережено у таблиці відповідей у «фоновому процесі»).

Щоб заповнити базу даних за допомогою типу питання «Рівняння»:

  • Спочатку створіть питання з кодом Q1 як питання з числовим введенням.
  • Потім створіть інше питання з кодом Q2 як питання типу «Рівняння».
  • На вкладці «Налаштування відображення» для Q2:
    • встановіть для поля «Завжди ховати це запитання» значення «Увімкнено»
    • у поле «Рівняння» введіть вираз:
{if(Q1.NAOK < 20, "1", if(Q1.NAOK > 20, "3", "2"))}

Створення сторінки підсумку за допомогою заповнювачів

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

Наш приклад можна завантажити тут: Приклад опитування із заповнювачами.


Типи питань, що використовуються тут:

1. Питання з однією відповідю / одиничні текстові/числові питання

  • Список
  • Список (одна відповідь) [L]
  • Так/Ні [Y]
  • Довгий довільний текст [T]
  • Короткий довільний текст [S]
  • Числове введення [N]
  • Рівняння [*]


2. Питання з підпитаннями

  • Кілька коротких текстів [Q]
  • Множинний вибір [M]
  • Масив [F]
  • Табличне запитання (Так/Ні/Важко відповісти) [C]
  • Масив (вибір із 10 пунктів) [B]


3. Питання з 2 шкалами

  • Табличне запитання з подвійною шкалою [1]


4. Питання зі шкалами X та Y

  • Масив (числа) [:]


5. Стандартизовані питання

  • Відображення тексту [X]


У цьому простому прикладі наш огляд буде звичайним списком такого вигляду:

- Текст питання: відповідь користувача


Питання з однією відповідю / одиничні текстові/числові питання

Для всіх цих типів питань LimeSurvey зберігає одну відповідь:

  • Список
  • Список (одна відповідь)
  • Список з коментарями
  • Вибір із 5 варіантів
  • Так/Ні
  • Короткий довільний текст
  • Довгий довільний текст
  • Величезний довільний текст
  • Числове введення
  • Рівняння
  • Дата
  • Стать

Припустімо, що код питання — q1. Тоді на текст питання та відповідь можна послатися так:

- {q1.question}: {q1.shown}

Приклад:

- Скільки вам років?: 25


Якщо ви хочете перевірити, чи було надано відповідь на це питання, можна обгорнути вивід в оператор IF:

{if(!is_empty(q1),join("- ",q1.question,": ",q1.shown),"")}

Це «перекладається» так: ЯКЩО питання з кодом q1 не порожнє, вивести "- " І текст питання І ": " І текст відповіді (функція join() об’єднує елементи в новий рядок); ІНАКШЕ: нічого не виводити ("" означає порожній рядок).

Питання з підпитаннями

Для всіх цих типів питань LimeSurvey використовує підпитання:

  • Кілька коротких текстів
  • Множинний вибір
  • Множинний вибір з коментарями
  • Масив
  • Масив (вибір із 5 пунктів)
  • Масив (вибір із 10 пунктів)
  • Табличне запитання (Так/Ні/Важко відповісти)
  • Табличне запитання (Підвищення/Той самий рівень/Зниження)
  • Масив по стовпчику

Припустімо, що код питання — q2, а підпитання пронумеровані SQ001, SQ002 (автоматична нумерація виконується LimeSurvey). Тоді на текст питання та відповідь можна послатися так:

- {q2_SQ001.question}: {q2_SQ001.shown}

- {q2_SQ002.question}: {q2_SQ002.shown}

Для питань з множинним вибором доцільно показувати не текст позначеного підпитання, а літеру Y для кожного вибраного варіанта:

- {q2_SQ001.question}: {q2_SQ001}

- {q2_SQ002.question}: {q2_SQ002}

...

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


Приклад 1 (за умови, що тип питання — множинний вибір)

- Чи знаєте ви ці марки автомобілів?

-- Mercedes: Y

-- Audi: N

-- Volvo: Y


Якщо ви хочете вивести лише позначені елементи, можна обгорнути вивід в оператор IF і перевірити значення прапорця:

{ if( q2_SQ001=="Y", join( "- ", q2_SQ001.question, ": ", q2_SQ001.shown ), "" ) }


Використовуйте функцію listifop, якщо хочете вивести список лише вибраних елементів, наприклад: Mercedes, Volvo

{ listifop( 'value', '==', 'Y', 'question', ', ', that.q2.sgqa ) }


Де  that.q2  розгортається до всіх підпитань q2. Докладніше див. self, this і that.


Приклад 2 (за умови, що тип питання — Масив (вибір із 10 пунктів))

- Будь ласка, оцініть якість наведених нижче марок автомобілів за шкалою від 1 = дуже погано до 10 = дуже добре.

-- Mercedes: 7

-- Audi: 9

-- Volvo: 9


Якщо ви хочете вивести лише оцінені елементи, можна обгорнути вивід в оператор IF і перевірити, чи було надано відповідь на поточне підпитання, за допомогою:

{ if( ! is_empty( q3_SQ001 ), join( "- ", q3_SQ001.question, ": ", q3_SQ001.shown ), "" ) }


Використовуйте функцію listifop, якщо, наприклад, хочете вивести список лише тих вибраних елементів, значення яких більше восьми, наприклад: Audi / Volvo

{ listifop( 'value', '>', 8, 'question', ' / ', that.q3.sgqa ) }


Питання з двома шкалами

Це стосується лише типу питання з подвійною шкалою.


Припустімо, що використовуються такі коди:

  • Код питання: q4
  • Коди підпитань: SQ001, SQ002, ...
  • Коди відповідей шкали 1: A1, A2, ...
  • Коди відповідей шкали 2: B1, B2, ...


Щоб послатися на результат певного підпитання на певній шкалі, потрібно використати QuestionCode . '_' . SubQuestionCode . '_' . ScaleID. Зверніть увагу: "ScaleID" дорівнює 0 для першої шкали та 1 для другої!
Приклад посилання на відповідь на третє підпитання за другою шкалою: q4_SQ003_1 — питання 4, підпитання 3, друга шкала.


Виведімо результати для обох шкал і перших двох підпитань:

- {q4_SQ001_0.question}: {q4_SQ001_0.shown} / {q4_SQ001_1.shown}

- {q4_SQ002_0.question}: {q4_SQ002_0.shown} / {q4_SQ002_1.shown}

Щоб вивести текст підпитання, потрібно додати ідентифікатор шкали до заповнювача (хоча тексти для обох шкал однакові). Тому замість {q4_SQ001.question} потрібно використовувати {q4_SQ001_0.question} або {q4_SQ001_1.question}.

Якщо ви хочете експортувати/відобразити результати лише тих підпитань, які мають принаймні одну відповідь, використовуйте такий синтаксис для кожного підпитання:

{if(count(q4_SQ001_0,q4_SQ001_1)>0,join("- ",q4_SQ001_0.question,": ",q4_SQ001_0.shown," / ",q4_SQ001_1.shown),"")}

Питання зі шкалами X та Y

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

  • Масив (тексти)
  • Масив (числа)


Припустімо, використовуються такі коди:

  • Код питання: q5
  • Коди підпитань: SQ001, SQ002, ...
  • Коди відповідей: A1, A2, ...

Щоб послатися на результат певного підпитання з певного стовпця, потрібно використати QuestionCode . '_' . SubQuestionCode . '_' . AnswerCode. Приклад посилання на відповідь третього підпитання та другого стовпця: q5_SQ003_A2.

Виведімо результати для стовпців 1–3 перших двох підпитань:

- {q5_SQ001_A1.question}: {q5_SQ001_A1.shown} | {q5_SQ001_A2.shown} | {q5_SQ001_A3.shown}

- {q5_SQ002_A1.question}: {q5_SQ002_A1.shown} | {q5_SQ002_A2.shown} | {q5_SQ002_A3.shown}


Оскільки для цих типів питань кожна клітинка (комбінація осей X та Y) відповідає одному варіанту відповіді, перевірку наявності даних потрібно виконувати для кожної клітинки. Приклад:

{if(!is_empty(q5_SQ001_A1),join("- ",q5_SQ001_A1.question,": ",q5_SQ001_A1.shown),"")}


Щоб вивести текст підпитання, потрібно додати код відповіді до плейсхолдера (хоча тексти однакові для всіх варіантів відповіді). Тож замість {q5_SQ001.question} слід використовувати {q5_SQ001_A1.question} або {q5_SQ001_A2.question}.

Приховати питання, якщо відповідь на попереднє питання порожня

Мета Приховати питання, якщо відповідь на попереднє питання порожня
Тип Релевантність питання
Приклад Питання перше: код питання "name", текст питання "Як вас звати?"
Питання друге: текст питання "{name}, скільки вам років?"
Завдання: приховати друге питання, якщо текстове поле першого питання порожнє
Вираз !is_empty(name)
Опис is_empty() визначає, чи вважається змінна порожньою. Символ "!" заперечує результат. Тож якщо змінна не порожня, вираз буде істинним, і питання буде показано
Кроки Створіть/змініть друге питання
Вставте "!is_empty(name)" у поле "Рівняння релевантності:"
Приклад файлу Hide_question_if_empty_question_group.zip


Приховати групу питань, якщо відповідь на попереднє питання — «Так» або «Ні»

Мета Приховати групу питань, якщо відповідь на попереднє питання — «Так» або «Ні»
Тип Релевантність групи питань
Приклад Сторінка перша, група питань перша, питання перше: код питання "PET", текст питання "Чи є у вас домашня тварина?" -Так -Ні
Сторінка друга, група питань друга: назва "Про ваших домашніх тварин"
Завдання: показати/приховати другу групу питань залежно від того, чи відповідь на перше питання «Так»/«Ні»
Вираз PET == "Y"
Опис PET — це код питання, відповідь на яке потрібно перевірити. Якщо ви не використовуєте суфікс, EM використає "Qcode.code". Отже, ви порівнюєте код відповіді на питання PET зі значенням "Y". Якщо учасник відповідає «Так», вираз є істинним, і групу питань "Про ваших домашніх тварин" буде показано.
Кроки Створіть/змініть другу групу питань
Вставте "PET == "Y"" у поле "Рівняння релевантності:"
Приклад файлу Hide_question group_if_answer_from_previous_question_is_Yes_or_No.zip


Показати значення поля питання з кількома відповідями

Мета Показати значення поля питання з кількома відповідями
Тип Посилання
Приклад Питання перше: код питання "AskChildAge", текст питання "Скільки років вашим дітям?". Коди підпитань -Child1 -Child2 -Child3 - ChildXXX
Питання друге: код питання "ReportChildAge", текст питання "Про вашу першу дитину: - CHILD1 має AGE1 років."
Вираз {AskChildAge_Child1.question}, {AskChildAge_Child1.value}
Опис Ви хочете використати значення підпитання в наступному питанні. Отримати значення підпитання можна за допомогою такого виразу: QcodeQuestion_QcodeSubquestion.value
Кроки Створіть/змініть друге питання
Вставте цей текст в опис: "Про вашу першу дитину: - {AskChildAge_Child1.question} має {AskChildAge_Child1.value} років."
Приклад файлу Display_value_of_a_multiple_answer_input_question_field.zip

Перевірка кількості позначених прапорців у кожному рядку для питання «Масив (числа) з прапорцями»

Мета Перевірити кількість позначених прапорців у кожному рядку
Тип Перевірка
Приклад Питання типу "Масив (числа)" зі схемою "Прапорець (Checkbox layout)"
Вираз sum(...)
Опис (sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X) визначає, чи позначено щонайменше X прапорців у рядку A.
Якщо потрібно перевірити всі три рядки (A, B, C), можна з’єднати вирази за допомогою "&&":
(sum(Test_A_1, Test_A_2, Test_A_3, Test_A_4, Test_A_5) <= X)
&& (sum(Test_B_1, Test_B_2, Test_B_3, Test_B_4, Test_B_5) <= X)
&& (sum(Test_C_1, Test_C_2, Test_C_3, Test_C_4, Test_C_5) <= X)
Кроки Створіть/змініть питання типу "Масив (числа)" зі схемою "Прапорець (Checkbox layout)".
Вставте наведений вище вираз у поле "Рівняння перевірки питання" в розширених налаштуваннях питання (можливо, доведеться змінити назви змінних!).
Приклад файлу Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss

Обчислення різниці між двома датами

Мета Обчислити різницю між двома датами
Тип Релевантність / тип питання «Рівняння» / перевірка
Приклад Питання перше (дата/час, код: DOB): Яка ваша дата народження?
Питання друге (дата/час, код: datetoday): Яка сьогодні дата?
Питання третє (текстовий блок): Вам XXXX днів.
Завдання: обчислити та показати кількість днів між датою з першого питання та датою з другого питання.
Вираз {(strtotime(datetoday)-strtotime(DOB))/60/60/24}
Опис strtotime обчислює кількість секунд між 1 січня 1970 року та заданою датою. Наведений вище вираз обчислює кількість секунд між двома заданими датами. Частина "/60/60/24" просто перетворює кількість секунд на кількість днів.
Замість того, щоб запитувати "datetoday", можна також використати strtotime('now') або просто time(), що безпосередньо повертає кількість секунд від січня 1970 року до цього моменту (тобто до часу проходження опитування). Таким чином можна швидко визначити вік людини в роках за допомогою рівняння {(time() - strtotime(DOB)) / 60 / 60 / 24 / 365.25} У будь-якому з цих випадків важливо, щоб дату було введено у правильному форматі, інакше функція strtotime() працюватиме неправильно.
Кроки Створіть два питання з датою (для дати народження та для сьогоднішньої дати) і питання-текстовий блок.
У тексті питання-текстового блока вставте: "{datetoday} вам було {(strtotime(today)-strtotime(dob))/60/60/24} днів."

Зверніть увагу: функція strtotime працює з БАГАТЬМА, але не з усіма форматами дати. Якщо виникнуть проблеми, встановіть для опитування формат дати mm/dd/yyyy, yyyy-mm-dd або dd.mm.yyyy"
Приклад файлу Date_difference.zip

Використання ExpressionScript для оцінювання

Ось ще один приклад використання ExpressionScript із питаннями типу «Масив» та оцінюванням:</ br>

Припустімо, у вас є 2 питання-масиви, і ви хочете зберегти результати обчислень у базі даних. Це дуже просто: потрібно створити та протестувати масиви й надіслати тестову відповідь, щоб переконатися, що все працює та результати відображаються на сторінці завершення.


Деталі реалізації:

  • додайте питання типу «Рівняння»
  • додайте наступний рядок, вважаючи, що Q1 — це код вашого питання-масиву, а Q2 — код другого:
    • {sum(Q1_SQ001.value,Q2_SQ001.value)}

Зверніть увагу, що SQ001 — це код за замовчуванням для будь-якого підпитання. Якщо ви змінюєте код підпитання, відповідно змініть наведене вище рівняння.


Використання em_validation_q у масиві

Ви можете використати рівняння перевірки питання для керування масивом за будь-якою умовою.


Деталі реалізації:

  • для першого масиву: масив з одиничним вибором
    • Код питання — ARRAY
    • Коди підпитань — SQ01, SQ02, SQ03 та SQ04
    • змініть рівняння перевірки всього питання та вставте
      !is_empty(ARRAY_SQ01) and !is_empty(ARRAY_SQ03) 
  • для другого масиву: масив з текстом
    • Код питання — ARRAYTEXT
    • Коди підпитань по осі Y — SY01, SY02, SY03 та SY04
    • Змініть рівняння перевірки всього питання та вставте
      count(self.sq_SY01 >= 1) and count(self.sq_SY03 >= 3)