Делаем онлайн тестирование у себя на сайте
Вернемся в стопятисотый раз к продвижению… Пару месяцев назад я упоминал об одной идее, которую вычитал, изучая существующие в настоящий момент методы продвижения и увеличения посещаемости. Метод этот заключался в следующем. Добавляем на сайт онлайн-тестирование и пиарим по тематическим форумам/блогам/группам в соц сетях. Тематика тестов, на мой взгляд, не очень важна, но желательно, чтобы она была по возможности оригинальной. В результате, было решено: реализуем онлайн тестирование у себя на сайте. Кроме того, данная тема также является частой на форумах разработчиков. Особенно она популярна среди новичков — это излюбленное задание в ВУЗах, сделать онлайн тестирование. Поэтому материал может привлечь поисковый трафик. И так, вот как я реализовал данную концепцию у себя.
Для начала, выглядит это так. Над движком я работал буквально пару-тройку вечеров, ибо нечто подобное приходилось в прошлом делать неоднократно: сначала в школе (помнится, на Quick Basic’e делали с товарищем тестирование по «Истории»), затем в универе (уже на Delphi для «Деталей машин» и для приемной комиссии). Теперь сделаем онлайн тестирование на связке php, mysql, javascript и ZendFramework. Почти два месяца (!) ушло на составление первого теста (вопросов и ответов), хотя сначала казалось, что времени понадобится не так много — максимум недели полторы. Идея оригинального теста у меня появилась еще до идеи использования его в качестве инструмента продвижения. Тогда мне хотелось как-то оживить сайт, чтобы случайный посетитель со скуки не закрыл сразу вкладку. Выбор пал на мною обожаемый мульт сериал «Футурама». Смысл тестирования формулируется так: «Хорошо ли вы знаете сериал?». Когда я первый раз задумался над созданием данного теста, эта идея вдохновила меня, но все омрачала проблема: где взять вопросы? На их выдумывание ушла бы вечность. Помог его Величество Случай. В одной крупной рунетовской социальной сети я наткнулся на обсуждение, в котором люди соревнуются в знании Футурамы. Один человек задает каверзный вопрос, кто-то отвечает. Если отвечает правильно, сам задает уже вопрос, и т.д. Это был просто подарок. Обсуждение на тот момент составляло более 500 страниц. Быстренько состряпал парсер страниц вконтакте на php (если кому надо, могу выложить), и через минуту у меня на диске было все обсуждение в виде одного большого текстового файла. Далее началась очень скучная и изнурительная работа — модерация. Модерировал очень долго. Во-первых, спам, во-вторых, орфографические ошибки, в третьих, дублирующие вопросы (их была просто тьма). В итоге модерации осталось порядка 600 вопросов. Далее началась еще более изнурительная работа — выдумывание неправильных вариантов ответов. Как я уже сказал, на это ушло почти два месяца, но результат стоил того.
Вопросы в тестах я решил разбить по уровню сложности. Таких уровней в конкретном тесте может быть разное количество. Для Футурамы я сделал три уровня сложности. При каждой выборке вопросов для экзамена, которая, естественно, производится случайным образом, в результирующее множество попадает одинаковое количество вопросов разных уровней сложности. Например, 16 простых, 10 средих, и 6 сложных. Уровни сложности назначал по своему усмотрению, так как считаю себя средним знатоком Футурамы. Таким образом все сдающие экзамен оказываются в равных условиях.
Весь движок уложился а четыре таблицы: таблица с заголовками тестов (предполагается, что их может быть более одного)
CREATE TABLE `test` ( `test_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `title` varchar(128) NOT NULL, `description` varchar(1024) DEFAULT NULL, `question_count` int(10) unsigned NOT NULL DEFAULT '0', `test_rules` varchar(512) DEFAULT NULL, `difficult_lvl` varchar(128) DEFAULT NULL, PRIMARY KEY (`test_id`) )
Здесь все должно быть понятно кроме поля difficul_lvl — это небольшой трюк, а точнее следствие того, что мне было лениво делать специальную таблицу для хранения количества вопросов для разного уровня сложности — это бы обрекло меня на создание еще одной модели Zend Framework приложения, а также лишней операции выборки. Поэтому я решил хранить эти количества в виде строки чисел с разделителем. Например, так: 16;10;6. Затем в скрипте контроллера разбиваем банальным explode в массив.
таблица с вопросами (имеет отношение многие к одному с таблицей test)
CREATE TABLE `test_question` ( `question_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `question` varchar(256) NOT NULL, `test_id` int(10) unsigned NOT NULL, `difficult` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`question_id`), KEY `FK_test_question_test` (`test_id`) )
здесь difficult — уровень сложности вопроса.
таблица с ответами (имеет отношение многие к одному с таблицей test_question)
CREATE TABLE `test_answer` ( `answer_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `answer` varchar(256) NOT NULL DEFAULT '', `question_id` int(10) unsigned NOT NULL, `is_correct` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`answer_id`), KEY `FK_test_answer_question` (`question_id`) )
Поле is_correct может показаться избыточным, требующим нормализации, но на самом деле таким образом достигается множественность выбора — вопрос может содержать несколько правильных ответов. таблица с результатами тестов (имеет отношение многие к одному с таблицей test)
CREATE TABLE `hx_test_exam` ( `exam_id` char(8) NOT NULL DEFAULT '00000000', `test_id` varchar(45) NOT NULL, `user_name` varchar(64) NOT NULL DEFAULT '', `total_quest_count` int(10) unsigned NOT NULL, `correct_quest_count` int(10) unsigned NOT NULL, `user_state` int(10) unsigned NOT NULL, PRIMARY KEY (`exam_id`) )
Для поля exam_id неспроста выбран строковый тип. Идентификаторы генерируются случайным образом, что позволяет избежать тупой перебор.
Для пользователя тест проходит в три этапа.
1. Заполнение имени и капчи (от злобных спамеров:), после этого в таблице test_exam создается запись с экзаменом, и ее идентификатор через ajax-ответ возвращается назад вместе с вопросами
2. Пользователь отвечает на вопросы и нажимает Готово.
3. Данные уезжают на сервер, валидируются, результат заносится опять же в таблицу test_exam, и в ajax-ответе возвразщается результат, после чего отображается пользователю.
Скриптовая реализация на Zend Framework заняла один скрипт контроллера, три скрипта представлений и 8 скриптов модели (по два на таблицу).
Напоследок я решил внедрить еще одну идею, которая способна увеличить посещаемость — это так называемый флаер. Картинка с результатами тестирования. Двух видов. Такой:
и такой
Если будет настроение, еще каких-нибудь придумаю)) В конце, при показе результатов, пользователю выдается HTML-код такого флаера, который он может вставить в подпись на форуме или в свой блог. HTML-код содержит ссылку на мой сайт, что в теории должно увеличить ссылочную массу, а также привлечь новых посетителей.
ToDo #1. Когда количество экзаменов существенно увеличится, можно будет сделать показ таблицы рекордов.
ToDo #2. Еще одна полезная идея. Нужно организовать фидбэк для сервиса тестирования на тот случай, если пользователь не согласен с каким-либо ответом, или у него просто есть пожелания по улучшению теста.
ToDo #3. Если новая фича будет пользоваться популярностью, можно будет создать приложение для AppStore по мотивам теста. Правда, не совсем пока ясен юридический аспект этого дела. По идее, могут возникнуть претензии по авторскому праву. Такое приложение (конкретно тест по Футураме) я видел в АппСторе, но только в американском сегменте, так что есть шанс занять нишу в русском.
P.S. Не прошло и недели после запуска онлайн тестирования в продакшн, как уже появились первые экзаменующиеся — пять человек прошли тестирование. Наибольшее количество баллов составило 19/32.
Здравствуйте. А не могли бы Вы скинуть скрипт тестирования полностью. Заранее благодарен.
Как можно получить сам скрипт? Я новичок, но данный скрипт очень понравился…где можно скачать его?
Здравствуйте. Как можно получить этот скрипт тестирования полностью? Где можно скачать его?
Здравствуйте. Как можно получить этот скрипт тестирования полностью. Буду благодарен.