Example #1
0
 /**
  * Records or updates an answer for a given question and paper.
  *
  * @param Paper    $paper
  * @param Question $question
  * @param mixed    $data
  * @param string   $ip
  */
 public function recordAnswer(Paper $paper, Question $question, $data, $ip)
 {
     $handler = $this->handlerCollector->getHandlerForInteractionType($question->getType());
     $response = $this->om->getRepository('UJMExoBundle:Response')->findOneBy(['paper' => $paper, 'question' => $question]);
     if (!$response) {
         $response = new Response();
         $response->setPaper($paper);
         $response->setQuestion($question);
         $response->setIp($ip);
     } else {
         $response->setNbTries($response->getNbTries() + 1);
     }
     $handler->storeAnswerAndMark($question, $response, $data);
     if (-1 !== $response->getMark()) {
         // Only apply penalties if the answer has been marked
         $this->applyPenalties($paper, $question, $response);
     }
     $this->om->persist($response);
     $this->om->flush();
 }
 /**
  * To navigate in the Questions of the assessment
  *
  * @access public
  *
  * @param Request $request
  *
  * @return \Symfony\Component\HttpFoundation\Response
  */
 public function exercisePaperNavAction(Request $request)
 {
     $response = '';
     $em = $this->getDoctrine()->getManager();
     $session = $request->getSession();
     $paper = $em->getRepository('UJMExoBundle:Paper')->find($session->get('paper'));
     $workspace = $paper->getExercise()->getResourceNode()->getWorkspace();
     $typeInterToRecorded = $request->get('typeInteraction');
     $tabOrderInter = $session->get('tabOrderInter');
     if ($paper->getEnd()) {
         return $this->forward('UJMExoBundle:Paper:show', array('id' => $paper->getId(), 'p' => -1));
     }
     //To record response
     $exerciseSer = $this->container->get('ujm.exercise_services');
     $ip = $exerciseSer->getIP();
     $interactionToValidatedID = $request->get('interactionToValidated');
     $response = $this->getDoctrine()->getManager()->getRepository('UJMExoBundle:Response')->getAlreadyResponded($session->get('paper'), $interactionToValidatedID);
     switch ($typeInterToRecorded) {
         case "InteractionQCM":
             $res = $exerciseSer->responseQCM($request, $session->get('paper'));
             break;
         case "InteractionGraphic":
             $res = $exerciseSer->responseGraphic($request, $session->get('paper'));
             break;
         case "InteractionHole":
             $res = $exerciseSer->responseHole($request, $session->get('paper'));
             break;
         case "InteractionOpen":
             $res = $exerciseSer->responseOpen($request, $session->get('paper'));
             break;
         case "InteractionMatching":
             $res = $exerciseSer->responseMatching($request, $session->get('paper'));
             break;
     }
     if (count($response) == 0) {
         //INSERT Response
         $response = new Response();
         $response->setNbTries(1);
         $response->setPaper($paper);
         $response->setInteraction($em->getRepository('UJMExoBundle:Interaction')->find($interactionToValidatedID));
     } else {
         //UPDATE Response
         $response = $response[0];
         $response->setNbTries($response->getNbTries() + 1);
     }
     $response->setIp($ip);
     $score = explode('/', $res['score']);
     $response->setMark($score[0]);
     $response->setResponse($res['response']);
     $em->persist($response);
     $em->flush();
     //To display selectioned question
     $numQuestionToDisplayed = $request->get('numQuestionToDisplayed');
     if ($numQuestionToDisplayed == 'finish') {
         return $this->finishExercise($session);
     } else {
         if ($numQuestionToDisplayed == 'interupt') {
             return $this->interuptExercise();
         } else {
             $interactionToDisplayedID = $tabOrderInter[$numQuestionToDisplayed - 1];
             $interactionToDisplay = $em->getRepository('UJMExoBundle:Interaction')->find($interactionToDisplayedID);
             $typeInterToDisplayed = $interactionToDisplay->getType();
             return $this->displayQuestion($numQuestionToDisplayed, $interactionToDisplay, $typeInterToDisplayed, $response->getPaper()->getExercise()->getDispButtonInterrupt(), $response->getPaper()->getExercise()->getMaxAttempts(), $workspace, $paper);
         }
     }
 }