Написание скриптов

Достаточно часто встречаются анкеты, логику работы которых невозможно реализовать простыми средствами, такими как действия или условия показа вопросов. Для этого в SURVEYSTUDIO есть поддержка скриптов на языке JavaScript, с помощью которых можно реализовать логику работы анкеты практически любой сложности. Более того, скриптами можно полностью создать анкету (вопросы и варианты ответов), не используя редактор вопросов анкеты.

Каждый скрипт представляет собой функцию, которая получает в качестве параметра вопрос, производит некую обработку и возвращает результат. Существуют глобальные для анкеты скрипты, в которые вопрос в качестве параметра не передается. Таким образом, используя синтаксис JavaScript, любой написаный в SURVEYSTUDIO скрипт в итоге выглядит примерно так:

function Q1_BeforeShow(Q) {
    return skip;
}

При этом в SURVEYSTUDIO не нужно описывать саму функцию для скрипта - это выполняется системой, т.е. в этом примере только строка return skip; должна быть написана в окне редактирования скрипта.

Типы скриптов

В анкете есть глобальные скрипты, не связанные с каким-то конкретным вопросом, а также скрипты для вопросов. Редактор глобальных скриптов можно открыть, выбрав необходимый пункт в меню в верхней правой части редактора вопросов анкеты:

Подготовка
Этот скрипт вызывается в самом начале, один раз при подготовке анкеты для запуска, а также при каждой выгрузке массива. Используется для создания вопросов, изменения их порядка (рандомизация/ротация), установки флагов и т.д. То есть в этом скрипте можно только формировать макет анкеты. Нельзя выполнять действия, влияющие на логику. Например, скрывать/показывать или случайным образом добавлять варианты ответа, объявлять глобальные переменные, от которых будут зависеть переходы между вопросами – для всего этого нужно использовать другие скрипты.
Обработка
Данный скрипт вызывается после завершения анкеты, непосредственно перед записью интервью в базу данных. Здесь можно провести анализ всех ответов в интервью и выполнить какие-то расчеты, исправления и прочие действия.
Перед показом
Глобальный скрипт перед показом вызывается для каждого вопроса перед его показом. Скрипт может вернуть результат, который заставит пропустить вопрос, перейти на какой-то другой вопрос, завершить интервью, или просто подготовить варианты ответа к показу (например скрыть не нужные, и т.д.). В качестве параметра этот скрипт получает переменную Q, которая указывает на вопрос, для которого запускается скрипт.
После ответа
Глобальный скрипт после ответа вызывается для каждого вопроса после ответа на него (после проведения базовой проверки корректности ответа). Этот скрипт, так же как и скрипт перед показом, может вернуть результат, который заставит перейти на какой-то другой вопрос, завершить интервью или, проверив ответ, сообщить об ошибке. В качестве параметра этот скрипт получает переменную Q, которая указывает на вопрос, для которого запускается скрипт.

Глобальные скрипты перед показом и после ответа выполняются перед такими же скриптами, указанными непосредственно в самом вопросе. В свойствах вопроса для редактирования скриптов используется кнопка:

Скрипты перед показом и после ответа аналогичны соответствующим глобальным скриптам, только выполняются для вопроса, в котором они написаны. Скрипт Во время показа выполняется во время показа вопроса, в браузере, а не на сервере, и не имеет доступа к вопросам и API системы.

Результат выполнения скрипта

Любой скрипт должен вернуть в качестве результата специальное значение. Предусмотрен набор вспомогательных функций и глобальных переменных, которые помогают сформировать результат в необходимом формате:

return ok;

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

return skip;

Возврат значения skip используется в скриптах перед показом вопроса и заставляет систему сбросить состояние текущего вопроса (аналогично reset()) и перейти к следующему по порядку.

return answered;

Возврат значения answered так же используется в скриптах перед показом вопроса и помечает вопрос как отвеченный, без вывода на экран. Т.е. ответ на него должен быть сделан так же скриптом. Система проверит правильность ответа, так же как это происходит в обычном случае. Если ответ не пройдет проверку - вопрос будет показан с сообщением об ошибке. Если вопрос окажется без ответа - он будет выведен на экран.

return error('Текст сообщения об ошибке');

Такой метод возврата результата используется в скриптах после ответа, когда необходимо показать вопрос заново с сообщением об ошибке. Если в функцию error() не передано сообщение, которое необходимо показать - будет показано стандартное.

return question(123);

Возврат номера вопроса, на который необходимо совершить переход. Может использоваться как в скриптах перед показом (в этом случае текущий вопрос будет пропущен со сбросом состояния как при возврате skip), так и после ответа на вопрос.

return exit('Текст прощального сообщения');

Принудительное завершение интервью. Если в функцию exit() не передано сообщение, которое необходимо показать - будет показано стандартное.

return exitAndRedirect('Текст прощального сообщения', 'http://www.rbc.ru/');

Также выполняется завершение интервью, но после его сохранения производится переход на указанный вторым параметром адрес.

return exitAndRestart('Текст прощального сообщения'); (пока не реализовано)

Выполняется завершение интервью, после чего производится повторный запуск для ввода следующего интервью в этот же проект.


Читайте далее: глобальные объекты, функции и переменные.