get_stat_track_exercise_info_by_exe_id($exeId); // Check if student has access to the hotspot answers if (!api_is_allowed_to_edit(null, true)) { if (empty($exeId)) { api_not_allowed(); } if (empty($trackExerciseInfo)) { api_not_allowed(); } // Different exercise if ($exerciseId != $trackExerciseInfo['exe_exo_id']) { api_not_allowed(); } // Different user if ($trackExerciseInfo['exe_user_id'] != $userId) { api_not_allowed(); } } $questionRepo = Container::getQuestionRepository(); /** @var CQuizQuestion $objQuestion */ $objQuestion = $questionRepo->find($questionId); if (empty($objQuestion)) { exit; } $answer_type = $objQuestion->getType(); //very important $TBL_ANSWERS = Database::get_course_table(TABLE_QUIZ_ANSWER); $resourceFile = $objQuestion->getResourceNode()->getResourceFiles()->first(); $pictureWidth = $resourceFile->getWidth(); $pictureHeight = $resourceFile->getHeight(); $imagePath = $questionRepo->getHotSpotImageUrl($objQuestion).'?'.api_get_cidreq(); $objExercise->read($exerciseId); if (empty($objExercise)) { exit; } $em = Database::getManager(); $data = []; $data['type'] = 'solution'; $data['lang'] = HotSpot::getLangVariables(); $data['image'] = $imagePath; $data['image_width'] = $pictureWidth; $data['image_height'] = $pictureHeight; $data['hotspots'] = []; $resultDisable = $objExercise->selectResultsDisabled(); $showTotalScoreAndUserChoicesInLastAttempt = true; if (in_array( $resultDisable, [ RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT, RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT_NO_FEEDBACK, RESULT_DISABLE_DONT_SHOW_SCORE_ONLY_IF_USER_FINISHES_ATTEMPTS_SHOW_ALWAYS_FEEDBACK, ] ) ) { $showOnlyScore = true; $showResults = true; $lpId = isset($trackExerciseInfo['orig_lp_id']) ? $trackExerciseInfo['orig_lp_id'] : 0; $lpItemId = isset($trackExerciseInfo['orig_lp_item_id']) ? $trackExerciseInfo['orig_lp_item_id'] : 0; if ($objExercise->attempts > 0) { $attempts = Event::getExerciseResultsByUser( api_get_user_id(), $objExercise->id, $courseId, api_get_session_id(), $lpId, $lpItemId, 'desc' ); $numberAttempts = count($attempts); $showTotalScoreAndUserChoicesInLastAttempt = false; if ($numberAttempts >= $objExercise->attempts) { $showResults = true; $showOnlyScore = false; $showTotalScoreAndUserChoicesInLastAttempt = true; } } } $hideExpectedAnswer = false; if (0 == $objExercise->getFeedbackType() && RESULT_DISABLE_SHOW_SCORE_ONLY == $resultDisable ) { $hideExpectedAnswer = true; } if (in_array( $resultDisable, [ RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT, RESULT_DISABLE_DONT_SHOW_SCORE_ONLY_IF_USER_FINISHES_ATTEMPTS_SHOW_ALWAYS_FEEDBACK, ] ) ) { $hideExpectedAnswer = $showTotalScoreAndUserChoicesInLastAttempt ? false : true; } if (in_array( $resultDisable, [ RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT_NO_FEEDBACK, ] ) ) { $hideExpectedAnswer = false; } $hotSpotWithAnswer = []; $data['answers'] = []; $rs = $em ->getRepository(TrackEHotspot::class) ->findBy( [ 'hotspotQuestionId' => $questionId, 'course' => $courseId, 'hotspotExeId' => $exeId, ], ['hotspotAnswerId' => 'ASC'] ); /** @var TrackEHotspot $row */ foreach ($rs as $row) { $data['answers'][] = $row->getHotspotCoordinate(); if ($row->getHotspotCorrect()) { $hotSpotWithAnswer[] = $row->getHotspotAnswerId(); } } if (!$hideExpectedAnswer) { $qb = $em->createQueryBuilder(); $qb ->select('a') ->from(CQuizAnswer::class, 'a'); if (HOT_SPOT_DELINEATION == $objQuestion->getType()) { $qb ->where($qb->expr()->eq('a.question', $questionId)) ->andWhere($qb->expr()->neq('a.hotspotType', 'noerror')) ->orderBy('a.iid', 'ASC'); } else { $qb ->where($qb->expr()->eq('a.question', $questionId)) ->orderBy('a.position', 'ASC'); } $result = $qb->getQuery()->getResult(); foreach ($result as $hotSpotAnswer) { if (RESULT_DISABLE_SHOW_SCORE_ATTEMPT_SHOW_ANSWERS_LAST_ATTEMPT_NO_FEEDBACK == $resultDisable) { if (false === $showTotalScoreAndUserChoicesInLastAttempt) { if (!in_array($hotSpotAnswer->getIid(), $hotSpotWithAnswer)) { continue; } } } /** @var CQuizAnswer $hotSpotAnswer */ $hotSpot = []; $hotSpot['id'] = $hotSpotAnswer->getIid(); $hotSpot['answer'] = $hotSpotAnswer->getAnswer(); switch ($hotSpotAnswer->getHotspotType()) { case 'square': $hotSpot['type'] = 'square'; break; case 'circle': $hotSpot['type'] = 'circle'; break; case 'poly': $hotSpot['type'] = 'poly'; break; case 'delineation': $hotSpot['type'] = 'delineation'; break; case 'oar': $hotSpot['type'] = 'delineation'; break; } $hotSpot['coord'] = $hotSpotAnswer->getHotspotCoordinates(); $data['hotspots'][] = $hotSpot; } } $data['answers'] = []; $rs = $em ->getRepository(TrackEHotspot::class) ->findBy( [ 'hotspotQuestionId' => $questionId, 'course' => $courseId, 'hotspotExeId' => $exeId, ], ['hotspotAnswerId' => 'ASC'] ); /** @var TrackEHotspot $row */ foreach ($rs as $row) { $data['answers'][] = $row->getHotspotCoordinate(); } $data['done'] = 'done'; header('Content-Type: application/json'); echo json_encode($data); if ($debug) { error_log('---------- End call to hotspot_answers.as.php------------'); }