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 — краткое руководство
  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»): Как долго вы живёте в ГОРОДЕ?
Задача: во втором вопросе вместо «ГОРОД» нужно использовать ответ на первый вопрос.
Выражение {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. Вопросы с двумя шкалами

  • Массив с двойной шкалой [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}

Чтобы вывести текст подвопроса, необходимо добавить ID шкалы в плейсхолдер (хотя тексты одинаковы для обеих шкал). Поэтому вместо {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

Проверка количества отмеченных галочек в строке для вопроса «Массив (числовой)» с расположением галочек

Цель Проверить количество отмеченных галочек в строке
Тип Проверка
Пример Вопрос типа "Массив (числовой)" (Расположение галочек)
Выражение 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)
Шаги Создайте/отредактируйте вопрос типа "Массив (числовой)" (Расположение галочек).
Вставьте приведённое выше выражение в поле "Уравнение условия для проверки вопроса" в расширенных настройках вопроса (возможно, потребуется изменить имена переменных!).
Файл-пример Validate number of boxes ticker per row for an Array (Numbers) Checkbox.lss

Вычисление разницы между двумя датами

Цель Вычислить разницу между двумя датами
Тип Условие / тип вопроса «Уравнение» / Проверка
Пример Вопрос первый (дата/время, код: DOB): Какова ваша дата рождения?
Вопрос второй (дата/время, код: datetoday): Какое сегодня число?
Вопрос третий (текстовый блок): Вам XXXX дней.
Задача: вычислить и показать количество дней между датой из вопроса 1 и датой из вопроса 2.
Выражение {(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)