процесс

Создание страницы с тестом

Акимов Михаил, основатель школы
18 апреля 2017
Дочь не может определиться, чем будет заниматься после школы, поэтому я решил поискать профориентационные тесты. Популярный тест личности Майерс-Бриггс не очень нравися, хоть на некоторых сайтах его и используют для тестирования школьников. В сети интернет наткнулся на расшифровку теста "Карта интересов" от А.Е. Голомштока. И чтобы не считать балы ручками, решил сделать интернет-страницу для этого теста.
Кратко
тайминг разработки (от и до, грязного времени около недели, а чистого около 4-5 часов):

- на набросок архитектуры ушло минут 30-40:
- набросок выкинул (делаю один конкретный тест, зачем создавать кучу таблиц и универсальное решение?);
- за 1 час 15 минут запрогал тест (выводятся вопросы, считаются результаты и выводятся);
- потом решил, что хорошо бы результат можно было сохранять в базу (еще 1 час, начал вывод делать красивым);
- потом еще 2 часа ушло на украшательства, починку выявленных багов при украшательстве и заливку на хостинг;
Чуть подробнее о том как создавал тест
Сначала скачиваем библиотеку MiniLib и подключаем ее к проекту.
<?php
include $_SERVER['DOCUMENT_ROOT'].DIRECTORY_SEPARATOR.'inc'.DIRECTORY_SEPARATOR.'class_application.php';
Application::one()->init();
header('Content-type: text/html;charset=utf-8');
Сначала нужно в чем-то хранить список вопросов теста. Разместил список вопросов в массив.

Затем создал массив с темами (с типами интересов - их 29).
$arInterests = array(
    'Биология',
    'География',
    'Геология',
    ...
    'Музыка',
    'Физкультура и спорт'
);

$arQuestions = array(
    'Знакомиться с жизнью растений и животных.',
    'Занятия и чтение книг по географии.',
    'Читать художественную или научно-папулярную литературу о геологических экспедициях.',
    'Уроки и книги по анатомии и физиологии человека.',
    'Выполнять ежедневную домашнюю работу.',
    ....
);
Дальше все просто:
Смотрим - есть ли от пользователя ответ и есть ли вопрос на который пользователь прислал ответ.
Если есть, то сохраняем ответ в массив ответов и формируем страницу со следующим вопросом. Иначе выводим первый вопрос.
// массив ответов пользователя
if (empty($_SESSION['arAnswers'])) {
    $arAnswers = array();
} else {
    $arAnswers = $_SESSION['arAnswers'];
}
// определим какой сейчас вопрос
if (! isset($_REQUEST['questionid'])) {
    // если вдруг у нас уже есть ответы - то можно предложить продолжить предыдущие ответы
    if (sizeof($arAnswers) > 0) {
        $questionid = sizeof($arAnswers);
    } else {
        $arParams = array();
        Application::one()->setTitle('Карта Интересов - тест');
        Application::one()->showPage('test_interests_start','main', $arParams);
        die();
    }
    
} else {
    $questionid = intval($_REQUEST['questionid']);
}
if ($questionid == -1) {
    $_SESSION['arAnswers'] = array();
    $arParams = array();
    Application::one()->setTitle('Карта Интересов - тест');
    Application::one()->showPage('test_interests_start','main', $arParams);
    die();
}
// есть ли ответ, на вопрос
if (isset($_POST['answer'])) {
    // и существует вопрос на который дан ответ
    if (isset($arQuestions[$questionid])) {
        $arAnswers[$questionid] = intval($_POST['answer']);
        $questionid++;
    }
}
$_SESSION['arAnswers'] = $arAnswers;
Если вопросы закончились, значит на все ответили - подсчитываем количество балов по каждой теме и выводим список тем и набранные балы. Чем больше балов, тем тема интереснее школьнику, чем меньше - тем менее интересна.
if (isset($arQuestions[$questionid])) {
    $arParams = array(
        'questionid'=> $questionid,
        'sQuestion' => $arQuestions[$questionid],
        'currentstep' => $questionid+1,
        'totalstep' => sizeof($arQuestions)
    );
    Application::one()->setTitle('Вопрос '.$arParams['currentstep'].' из '.$arParams['totalstep'].' теста Карта Интересов');
    
    //отобразим страницу со следующим вопросом
    Application::one()->showPage('test_interests','main', $arParams);
} else {
    //var_dump($_SESSION['arAnswers']);
    $arParams = array();
    $arScores = array();
    $iTheme = 0;
    
    
    for($i=0;$i<sizeof($arAnswers);$i++) {
        if (! isset($arScores[$iTheme])) {
            $arScores[$iTheme] = 0;
        }
        
        $arScores[$iTheme] += $arAnswers[$i];
        $iTheme++;
        
        if ($iTheme == 29) {
            $iTheme=0;
        }
    }
    $arParams = array(
        'arInterests' => $arInterests,
        'arScores' => $arScores
    );
    Application::one()->showPage('test_interests_result','main', $arParams);    
}
Результат всего выше описанного размещен на серевере PlaceHiring.com и его можно посмотреть :)
Made on
Tilda