Перейти к основному содержимому

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

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

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

function Q1_BeforeShow(Q) {
return skip;
}

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

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

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

Подготовка

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

Обработка

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

Перед показом

Глобальный скрипт перед показом вызывается для каждого вопроса перед его показом. Скрипт может вернуть результат, который заставит пропустить вопрос, перейти на какой-то другой вопрос, завершить интервью, или просто подготовить варианты ответа к показу (например скрыть не нужные, и т.д.). В качестве параметра этот скрипт получает переменную Q, которая указывает на вопрос, для которого запускается скрипт.

После ответа

Глобальный скрипт после ответа вызывается для каждого вопроса после ответа на него (после проведения базовой проверки корректности ответа). Этот скрипт, так же как и скрипт перед показом, может вернуть результат, который заставит перейти на какой-то другой вопрос, завершить интервью или, проверив ответ, сообщить об ошибке. В качестве параметра этот скрипт получает переменную Q, которая указывает на вопрос, для которого запускается скрипт.

Функции

Здесь прописываются глобальные функции, которые можно вызывать из любого скрипта анкеты (кроме Во время показа), чтобы избавиться от дублирования кода.

Во время показа

Данный скрипт выполняется во время показа каждого вопроса в браузере, а не на сервере, и не имеет доступа к вопросам и API системы.

CSS стили

Не имеют отношения к скриптам, но прописываются для всей анкеты в целом. Подробную информацию о них можно найти в этом разделе.

предупреждение

SURVEYSTUDIO постоянно меняется: исправляются ошибки, добавляются новые функции, улучшается внешний вид. Поэтому сторонние стили и скрипты во время показа в какой-то момент могут перестать работать или начать работать не так, как задумано. Настоятельно рекомендуем использовать только встроенные в систему возможности. Если необходимой вам функции ещё нет — можно отправить в техническую поддержку запрос на её добавление.

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

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

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

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

return ok;

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

return skip;

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

return answered;

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

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

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

return question(123);

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

return exitWithResult(InterviewResult.Completed, 'Текст прощального сообщения');

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

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

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

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

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

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

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

return exitAndRestart(InterviewResult.Completed);

Завершает интервью с проставлением результата, а затем автоматически начинает новое.