linux-questionnaire/src/Questionnaire/Controller/QuestionnaireController.php
2015-03-02 20:07:17 +01:00

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
)
));
}
}