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