156 lines
4.1 KiB
PHP
156 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace Questionnaire\Controller;
|
|
|
|
use Silex\Application;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Session\Session;
|
|
use Questionnaire\Model\Question;
|
|
use Questionnaire\Model\ResultPeer;
|
|
use Questionnaire\Model\QuestionPeer;
|
|
|
|
class QuestionnaireController
|
|
{
|
|
public function indexAction(Application $app)
|
|
{
|
|
return $app['twig']->render(
|
|
'Questionnaire/index.html.twig'
|
|
);
|
|
}
|
|
|
|
public function startAction(Application $app)
|
|
{
|
|
$this->initUserResponses($app['session']);
|
|
|
|
return $this->redirectToStep(1, $app);
|
|
}
|
|
|
|
public function stepAction($step, Application $app, Request $request)
|
|
{
|
|
$step = (int) $step;
|
|
$realStep = $step - 1;
|
|
|
|
$questions = QuestionPeer::retrieveQuestions();
|
|
|
|
if ($step > count($questions)) {
|
|
return $app->redirect($app['url_generator']->generate('result'));
|
|
}
|
|
|
|
$question = $questions[$realStep];
|
|
|
|
if ($request->isMethod('post')) {
|
|
$response = $request->request->get('response');
|
|
|
|
if ($response !== null) {
|
|
$response = (int) $response;
|
|
|
|
if (isset($question->getChoices()[$response])) {
|
|
$this->mergeUserResponse($question, $response, $app['session']);
|
|
|
|
return $this->redirectToStep($step + 1, $app);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$question->isCompatibleWithResponses($app['session']->get('responses', array()))) {
|
|
return $this->redirectToStep($step + 1, $app);
|
|
}
|
|
|
|
return $app['twig']->render(
|
|
'Questionnaire/step.html.twig',
|
|
array(
|
|
'step' => $step,
|
|
'question' => $question,
|
|
'percent' => round((100 * $realStep) / count($questions)),
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @todo Migrate calculation algorithm in its own class.
|
|
*/
|
|
public function resultAction(Application $app)
|
|
{
|
|
$responses = $app['session']->get('responses', array());
|
|
|
|
if (empty($responses)) {
|
|
return $this->redirectToStep(1, $app);
|
|
}
|
|
|
|
$results = ResultPeer::retrieveResults();
|
|
|
|
foreach ($results as $result) {
|
|
foreach ($responses as $questionId => $response) {
|
|
if (isset($result->getWeightings()[$questionId][$response])) {
|
|
$value = $result->getWeightings()[$questionId][$response];
|
|
|
|
if (false === $value) {
|
|
$result->isOut(true);
|
|
continue 2;
|
|
}
|
|
|
|
$result->addWeighting($value);
|
|
}
|
|
}
|
|
}
|
|
|
|
$finalResults = [];
|
|
|
|
foreach ($results as $result) {
|
|
if ($result->isOut()) {
|
|
continue;
|
|
}
|
|
|
|
$finalResults[] = $result;
|
|
}
|
|
|
|
$hasLoop = true;
|
|
$length = count($finalResults);
|
|
|
|
while ($hasLoop) {
|
|
$hasLoop = false;
|
|
|
|
for ($u = 0; $u < $length - 1; $u++) {
|
|
if ($finalResults[$u]->getValue() < $finalResults[$u + 1]->getValue()) {
|
|
$a = $finalResults[$u + 1];
|
|
$finalResults[$u + 1] = $finalResults[$u];
|
|
$finalResults[$u] = $a;
|
|
|
|
$hasLoop = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $app['twig']->render(
|
|
'Questionnaire/result.html.twig',
|
|
array(
|
|
'results' => $finalResults,
|
|
)
|
|
);
|
|
}
|
|
|
|
protected function initUserResponses(Session $session)
|
|
{
|
|
$session->set('responses', array());
|
|
}
|
|
|
|
protected function mergeUserResponse(Question $question, $response, Session $session)
|
|
{
|
|
$responses = $session->get('responses', array());
|
|
|
|
$responses[$question->getId()] = $response;
|
|
|
|
$session->set('responses', $responses);
|
|
}
|
|
|
|
protected function redirectToStep($step, Application $app)
|
|
{
|
|
return $app->redirect($app['url_generator']->generate(
|
|
'step',
|
|
array(
|
|
'step' => $step
|
|
)
|
|
));
|
|
}
|
|
}
|