/** * Returns the value of a question hint, and records the fact that it has * been consulted within the context of a given paper. * * @EXT\Route( * "", * name="exercise_hint_show" * ) * @EXT\ParamConverter("user", converter="current_user", options={"allowAnonymous"=true}) * * @param Paper $paper * @param Hint $hint * @param User $user * * @return JsonResponse */ public function showHintAction(Paper $paper, Hint $hint, User $user = null) { $this->assertHasPaperAccess($paper, $user); if (!$this->hintManager->hasHint($paper, $hint)) { return new JsonResponse('Hint and paper are not related', 422); } return new JsonResponse($this->hintManager->viewHint($paper, $hint)); }
/** * Export submitted answers for one Question of the Paper. * * @param Question $question * @param Paper $paper * @param bool $withScore Do we need to export the score of the Paper ? * * @return array * * @throws \UJM\ExoBundle\Transfer\Json\UnregisteredHandlerException */ public function exportPaperAnswer(Question $question, Paper $paper, $withScore = false) { $responseRepo = $this->om->getRepository('UJMExoBundle:Response'); $handler = $this->handlerCollector->getHandlerForInteractionType($question->getType()); // TODO: these two queries must be moved out of the loop $response = $responseRepo->findOneBy(['paper' => $paper, 'question' => $question]); $usedHints = $this->hintManager->getUsedHints($paper, $question); $hints = array_map(function ($hint) { return $this->hintManager->exportHint($hint, true); // We always grab hint value for used hints }, $usedHints); $answer = $response ? $handler->convertAnswerDetails($response) : null; $answerScore = $response ? $response->getMark() : 0; $nbTries = $response ? $response->getNbTries() : 0; $paperQuestion = null; if ($response || count($hints) > 0) { $paperQuestion = ['id' => $question->getId(), 'answer' => $answer, 'hints' => $hints, 'nbTries' => $nbTries, 'score' => $withScore ? $answerScore : null]; } return $paperQuestion; }
/** * Exports a question in a JSON-encodable format. * * @param Question $question * @param bool $withSolution * @param bool $forPaperList * * @return \stdClass * * @throws \Exception if the question type export is not implemented */ public function exportQuestion(Question $question, $withSolution = true, $forPaperList = false) { $handler = $this->handlerCollector->getHandlerForInteractionType($question->getType()); $rm = $this->rm; $data = new \stdClass(); $data->id = $question->getId(); $data->type = $handler->getQuestionMimeType(); $data->title = $question->getTitle(); $data->description = $question->getDescription(); $data->invite = $question->getInvite(); $data->supplementary = $question->getSupplementary(); $data->specification = $question->getSpecification(); $data->objects = array_map(function ($object) use($rm) { $resourceObjectData = new \stdClass(); $resourceObjectData->id = (string) $object->getResourceNode()->getId(); $resourceObjectData->type = $object->getResourceNode()->getResourceType()->getName(); switch ($object->getResourceNode()->getResourceType()->getName()) { case 'text': if ($rm->getResourceFromNode($object->getResourceNode())->getRevisions()[0]) { $resourceObjectData->data = $rm->getResourceFromNode($object->getResourceNode())->getRevisions()[0]->getContent(); } default: $resourceObjectData->url = $this->router->generate('claro_resource_open', ['resourceType' => $object->getResourceNode()->getResourceType()->getName(), 'node' => $object->getResourceNode()->getId()]); } return $resourceObjectData; }, $question->getObjects()->toArray()); if (count($question->getHints()) > 0) { $data->hints = array_map(function ($hint) use($withSolution) { return $this->hintManager->exportHint($hint, $withSolution); }, $question->getHints()->toArray()); } if ($withSolution && $question->getFeedback()) { $data->feedback = $question->getFeedback(); } $handler->convertInteractionDetails($question, $data, $withSolution, $forPaperList); return $data; }