read($exercise_id); } $feedback_type = $objExercise->feedback_type; //Only users can see their own results if (!$is_allowedToEdit) { if ($student_id != $currentUserId) { api_not_allowed($printHeaders); } } if (isset($_SESSION['gradebook'])) { $gradebook = Security::remove_XSS($_SESSION['gradebook']); } if (!empty($gradebook) && $gradebook == 'view') { $interbreadcrumb[] = array('url' => '../gradebook/'.$_SESSION['gradebook_dest'], 'name' => get_lang('ToolGradebook')); } $interbreadcrumb[] = array("url" => "exercise.php?".api_get_cidreq(), "name" => get_lang('Exercises')); $interbreadcrumb[] = array( "url" => "overview.php?exerciseId=".$exercise_id.'&'.api_get_cidreq(), "name" => $objExercise->selectTitle(true) ); $interbreadcrumb[] = array("url" => "#", "name" => get_lang('Result')); $this_section = SECTION_COURSES; $htmlHeadXtra[] = ''; $htmlHeadXtra[] = ''; $htmlHeadXtra[] = ''; if ($origin != 'learnpath') { Display::display_header(''); } else { $htmlHeadXtra[] = " "; Display::display_reduced_header(); } ?> id, api_get_course_int_id(), api_get_session_id(), $track_exercise_info['orig_lp_id'], $track_exercise_info['orig_lp_item_id'], 'desc' ); $numberAttempts = count($attempts); if ($numberAttempts >= $track_exercise_info['max_attempt']) { $show_results = true; $show_only_total_score = true; // Attempt reach max so show score/feedback now $showTotalScoreAndUserChoicesInLastAttempt = true; } else { $show_results = true; $show_only_total_score = true; // Last attempt not reach don't show score/feedback $showTotalScoreAndUserChoicesInLastAttempt = false; } } } } else { echo Display::return_message(get_lang('CantViewResults'), 'warning'); $show_results = false; } if ($origin == 'learnpath' && !isset($_GET['fb_type'])) { $show_results = false; } if ($is_allowedToEdit && in_array($action, ['qualify', 'edit'])) { $show_results = true; } if ($show_results || $show_only_total_score || $showTotalScoreAndUserChoicesInLastAttempt) { $user_info = api_get_user_info($student_id); //Shows exercise header echo $objExercise->show_exercise_result_header( $user_info, api_convert_and_format_date($exercise_date), null, $track_exercise_info['user_ip'] ); } $i = $totalScore = $totalWeighting = 0; if ($debug > 0) { error_log("ExerciseResult: ".print_r($exerciseResult, 1)); error_log("QuestionList: ".print_r($questionList, 1)); } $arrques = array(); $arrans = array(); $user_restriction = $is_allowedToEdit ? '' : "AND user_id=".intval($student_id)." "; $sql = "SELECT attempts.question_id, answer FROM $TBL_TRACK_ATTEMPT as attempts INNER JOIN ".$TBL_TRACK_EXERCISES." AS stats_exercises ON stats_exercises.exe_id=attempts.exe_id INNER JOIN $TBL_EXERCISE_QUESTION AS quizz_rel_questions ON quizz_rel_questions.exercice_id=stats_exercises.exe_exo_id AND quizz_rel_questions.question_id = attempts.question_id AND quizz_rel_questions.c_id=".api_get_course_int_id()." INNER JOIN " . $TBL_QUESTIONS." AS questions ON questions.id=quizz_rel_questions.question_id AND questions.c_id = " . api_get_course_int_id()." WHERE attempts.exe_id = " . intval($id)." $user_restriction GROUP BY quizz_rel_questions.question_order, attempts.question_id"; $result = Database::query($sql); $question_list_from_database = array(); $exerciseResult = array(); while ($row = Database::fetch_array($result)) { $question_list_from_database[] = $row['question_id']; $exerciseResult[$row['question_id']] = $row['answer']; } //Fixing #2073 Fixing order of questions if (!empty($track_exercise_info['data_tracking'])) { $temp_question_list = explode(',', $track_exercise_info['data_tracking']); // Getting question list from data_tracking if (!empty($temp_question_list)) { $questionList = $temp_question_list; } // If for some reason data_tracking is empty we select the question list from db if (empty($questionList)) { $questionList = $question_list_from_database; } } else { $questionList = $question_list_from_database; } // Display the text when finished message if we are on a LP #4227 $end_of_message = $objExercise->selectTextWhenFinished(); if (!empty($end_of_message) && ($origin == 'learnpath')) { echo Display::return_message($end_of_message, 'normal', false); echo "
 
"; } // for each question $total_weighting = 0; foreach ($questionList as $questionId) { $objQuestionTmp = Question::read($questionId); $total_weighting += $objQuestionTmp->selectWeighting(); } $counter = 1; $exercise_content = null; $category_list = array(); $useAdvancedEditor = true; if (!empty($maxEditors) && count($questionList) > $maxEditors) { $useAdvancedEditor = false; } foreach ($questionList as $questionId) { $choice = $exerciseResult[$questionId]; // destruction of the Question object unset($objQuestionTmp); // creates a temporary Question object $objQuestionTmp = Question::read($questionId); $questionWeighting = $objQuestionTmp->selectWeighting(); $answerType = $objQuestionTmp->selectType(); // Start buffer ob_start(); if ($answerType == MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE) { $choice = array(); } $relPath = api_get_path(WEB_CODE_PATH); switch ($answerType) { case MULTIPLE_ANSWER_COMBINATION: //no break case MULTIPLE_ANSWER_COMBINATION_TRUE_FALSE: //no break case UNIQUE_ANSWER: //no break; case UNIQUE_ANSWER_NO_OPTION: //no break case UNIQUE_ANSWER_IMAGE: //no break case MULTIPLE_ANSWER: //no break case MULTIPLE_ANSWER_TRUE_FALSE: //no break case FILL_IN_BLANKS: //no break case CALCULATED_ANSWER: //no break case GLOBAL_MULTIPLE_ANSWER: //no break case FREE_ANSWER: //no break case ORAL_EXPRESSION: //no break case MATCHING: //no break case DRAGGABLE: //no break case READING_COMPREHENSION: //no break case MATCHING_DRAGGABLE: $question_result = $objExercise->manage_answer( $id, $questionId, $choice, 'exercise_show', array(), false, true, $show_results, $objExercise->selectPropagateNeg(), [], $showTotalScoreAndUserChoicesInLastAttempt ); $questionScore = $question_result['score']; $totalScore += $question_result['score']; break; case HOT_SPOT: if ($show_results || $showTotalScoreAndUserChoicesInLastAttempt) { echo ''; echo "
'; } $question_result = $objExercise->manage_answer( $id, $questionId, $choice, 'exercise_show', array(), false, true, $show_results, $objExercise->selectPropagateNeg(), [], $showTotalScoreAndUserChoicesInLastAttempt ); $questionScore = $question_result['score']; $totalScore += $question_result['score']; if ($show_results) { echo '

"; } break; case HOT_SPOT_DELINEATION: $question_result = $objExercise->manage_answer( $id, $questionId, $choice, 'exercise_show', array(), false, true, $show_results, $objExercise->selectPropagateNeg(), 'database', [], $showTotalScoreAndUserChoicesInLastAttempt ); $questionScore = $question_result['score']; $totalScore += $question_result['score']; $final_overlap = $question_result['extra']['final_overlap']; $final_missing = $question_result['extra']['final_missing']; $final_excess = $question_result['extra']['final_excess']; $overlap_color = $question_result['extra']['overlap_color']; $missing_color = $question_result['extra']['missing_color']; $excess_color = $question_result['extra']['excess_color']; $threadhold1 = $question_result['extra']['threadhold1']; $threadhold2 = $question_result['extra']['threadhold2']; $threadhold3 = $question_result['extra']['threadhold3']; if ($show_results) { if ($overlap_color) { $overlap_color = 'green'; } else { $overlap_color = 'red'; } if ($missing_color) { $missing_color = 'green'; } else { $missing_color = 'red'; } if ($excess_color) { $excess_color = 'green'; } else { $excess_color = 'red'; } if (!is_numeric($final_overlap)) { $final_overlap = 0; } if (!is_numeric($final_missing)) { $final_missing = 0; } if (!is_numeric($final_excess)) { $final_excess = 0; } if ($final_excess > 100) { $final_excess = 100; } $table_resume = '
' . get_lang('Requirements').' ' . get_lang('YourAnswer').'
' . get_lang('Overlap').' ' . get_lang('Min').' '.$threadhold1.'
'.(($final_overlap < 0) ? 0 : intval($final_overlap)).'
' . get_lang('Excess').' ' . get_lang('Max').' '.$threadhold2.'
'.(($final_excess < 0) ? 0 : intval($final_excess)).'
' . get_lang('Missing').' ' . get_lang('Max').' '.$threadhold3.'
'.(($final_missing < 0) ? 0 : intval($final_missing)).'
'; if ($answerType != HOT_SPOT_DELINEATION) { $item_list = explode('@@', $destination); $try = $item_list[0]; $lp = $item_list[1]; $destinationid = $item_list[2]; $url = $item_list[3]; $table_resume = ''; } else { if ($next == 0) { $try = $try_hotspot; $lp = $lp_hotspot; $destinationid = $select_question_hotspot; $url = $url_hotspot; } else { //show if no error $comment = $answerComment = $objAnswerTmp->selectComment($nbrAnswers); $answerDestination = $objAnswerTmp->selectDestination($nbrAnswers); } } echo '

'.get_lang('Feedback').'

'; if ($answerType == HOT_SPOT_DELINEATION) { if ($organs_at_risk_hit > 0) { $message = '
'.get_lang('ResultIs').' '.$result_comment.'
'; $message .= '

'.get_lang('OARHit').'

'; } else { $message = '

'.get_lang('YourDelineation').'

'; $message .= $table_resume; $message .= '
'.get_lang('ResultIs').' '.$result_comment.'
'; } $message .= '

'.$comment.'

'; echo $message; } else { echo '

'.$comment.'

'; } //showing the score $queryfree = "SELECT marks from ".$TBL_TRACK_ATTEMPT." WHERE exe_id = " . intval($id)." AND question_id= ".intval($questionId).""; $resfree = Database::query($queryfree); $questionScore = Database::result($resfree, 0, "marks"); $totalScore += $questionScore; $relPath = api_get_path(REL_PATH); echo ''; echo "
"; } break; case ANNOTATION: $question_result = $objExercise->manage_answer( $id, $questionId, $choice, 'exercise_show', array(), false, true, $show_results, $objExercise->selectPropagateNeg(), [], $showTotalScoreAndUserChoicesInLastAttempt ); $questionScore = $question_result['score']; $totalScore += $question_result['score']; if ($show_results) { echo '
'; } break; } if ($answerType == MULTIPLE_ANSWER_TRUE_FALSE) { echo ''; } if ($show_results && $answerType != HOT_SPOT) { echo ''; } $comnt = null; if ($show_results) { if ($is_allowedToEdit && $locked == false && !api_is_drh() && $isCoachAllowedToEdit ) { $isFeedbackAllowed = true; } elseif (!$isCoachAllowedToEdit && $allowCoachFeedbackExercises) { $isFeedbackAllowed = true; } // Boss cannot edit exercise result if ($isBossOfStudent) { $isFeedbackAllowed = false; } $marksname = ''; if ($isFeedbackAllowed) { $name = "fckdiv".$questionId; $marksname = "marksName".$questionId; if (in_array($answerType, array(FREE_ANSWER, ORAL_EXPRESSION, ANNOTATION))) { $url_name = get_lang('EditCommentsAndMarks'); } else { if ($action == 'edit') { $url_name = get_lang('EditIndividualComment'); } else { $url_name = get_lang('AddComments'); } } echo '
'; echo Display::url( $url_name, 'javascript://', array( 'class' => 'btn', 'onclick' => "showfck('".$name."', '".$marksname."');", ) ); echo '
'; echo '
'; $comnt = trim(Event::get_comments($id, $questionId)); if (empty($comnt)) { echo '
'; } else { echo '
'.$comnt.'
'; } echo '
'; echo ''; } else { $comnt = Event::get_comments($id, $questionId); echo '
'; if (!empty($comnt)) { echo ''.get_lang('Feedback').''; echo '
'.$comnt.'
'; } } if ($is_allowedToEdit && $isFeedbackAllowed) { if (in_array($answerType, array(FREE_ANSWER, ORAL_EXPRESSION, ANNOTATION))) { $marksname = "marksName".$questionId; echo ''; if ($questionScore == -1) { $questionScore = 0; echo Display::return_message(get_lang('notCorrectedYet')); } } else { $arrmarks[] = $questionId; echo ''; } } else { if ($questionScore == -1) { $questionScore = 0; } } } $my_total_score = $questionScore; $my_total_weight = $questionWeighting; $totalWeighting += $questionWeighting; $category_was_added_for_this_test = false; if (isset($objQuestionTmp->category) && !empty($objQuestionTmp->category)) { if (!isset($category_list[$objQuestionTmp->category]['score'])) { $category_list[$objQuestionTmp->category]['score'] = 0; } if (!isset($category_list[$objQuestionTmp->category]['total'])) { $category_list[$objQuestionTmp->category]['total'] = 0; } $category_list[$objQuestionTmp->category]['score'] += $my_total_score; $category_list[$objQuestionTmp->category]['total'] += $my_total_weight; $category_was_added_for_this_test = true; } if (isset($objQuestionTmp->category_list) && !empty($objQuestionTmp->category_list)) { foreach ($objQuestionTmp->category_list as $category_id) { $category_list[$category_id]['score'] += $my_total_score; $category_list[$category_id]['total'] += $my_total_weight; $category_was_added_for_this_test = true; } } // No category for this question! if (!isset($category_list['none']['score'])) { $category_list['none']['score'] = 0; } if (!isset($category_list['none']['total'])) { $category_list['none']['total'] = 0; } if ($category_was_added_for_this_test == false) { $category_list['none']['score'] += $my_total_score; $category_list['none']['total'] += $my_total_weight; } if ($objExercise->selectPropagateNeg() == 0 && $my_total_score < 0) { $my_total_score = 0; } $score = array(); if ($show_results) { $score['result'] = get_lang('Score')." : ".ExerciseLib::show_score( $my_total_score, $my_total_weight, false, false ); $score['pass'] = $my_total_score >= $my_total_weight ? true : false; $score['type'] = $answerType; $score['score'] = $my_total_score; $score['weight'] = $my_total_weight; $score['comments'] = isset($comnt) ? $comnt : null; } unset($objAnswerTmp); $i++; $contents = ob_get_clean(); $question_content = '
'; if ($show_results) { //Shows question title an description $question_content .= $objQuestionTmp->return_header(null, $counter, $score); } $counter++; $question_content .= $contents; $question_content .= '
'; $exercise_content .= $question_content; } // end of large foreach on questions $total_score_text = null; //Total score if ($origin != 'learnpath' || ($origin == 'learnpath' && isset($_GET['fb_type']))) { if ($show_results || $show_only_total_score || $showTotalScoreAndUserChoicesInLastAttempt) { $total_score_text .= '
'; $my_total_score_temp = $totalScore; if ($objExercise->selectPropagateNeg() == 0 && $my_total_score_temp < 0) { $my_total_score_temp = 0; } $total_score_text .= ExerciseLib::get_question_ribbon( $objExercise, $my_total_score_temp, $totalWeighting, true ); $total_score_text .= '
'; } } if (!empty($category_list) && ($show_results || $show_only_total_score || $showTotalScoreAndUserChoicesInLastAttempt)) { // Adding total $category_list['total'] = array( 'score' => $my_total_score_temp, 'total' => $totalWeighting ); echo TestCategory::get_stats_table_by_attempt($objExercise->id, $category_list); } echo $total_score_text; echo $exercise_content; echo $total_score_text; if ($isFeedbackAllowed) { if (is_array($arrid) && is_array($arrmarks)) { $strids = implode(",", $arrid); $marksid = implode(",", $arrmarks); } } if ($isFeedbackAllowed && $origin != 'learnpath' && $origin != 'student_progress') { if (in_array($origin, array('tracking_course', 'user_course', 'correct_exercise_in_lp'))) { $formUrl = api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&'; $formUrl .= http_build_query([ 'exerciseId' => $exercise_id, 'filter' => 2, 'comments' => 'update', 'exeid' => $id, 'origin' => $origin, 'details' => 'true', 'course' => Security::remove_XSS($_GET['cidReq']) ]); $emailForm = new FormValidator('myform', 'post', $formUrl, '', ['id' => 'myform']); $emailForm->addHidden('lp_item_id', $learnpath_id); $emailForm->addHidden('lp_item_view_id', $lp_item_view_id); $emailForm->addHidden('student_id', $student_id); $emailForm->addHidden('total_score', $totalScore); $emailForm->addHidden('my_exe_exo_id', $exercise_id); } else { $formUrl = api_get_path(WEB_CODE_PATH).'exercise/exercise_report.php?'.api_get_cidreq().'&'; $formUrl .= http_build_query([ 'exerciseId' => $exercise_id, 'filter' => 1, 'comments' => 'update', 'exeid' => $id ]); $emailForm = new FormValidator('myform', 'post', $formUrl, '', ['id' => 'myform']); } $emailForm->addCheckBox( 'send_notification', get_lang('SendEmail'), get_lang('SendEmail'), ['onclick' => 'openEmailWrapper();'] ); $emailForm->addHtml(''); if (empty($track_exercise_info['orig_lp_id']) || empty($track_exercise_info['orig_lp_item_id'])) { // Default url $url = api_get_path(WEB_CODE_PATH).'exercise/result.php?id='.$track_exercise_info['exe_id'].'&'.api_get_cidreq().'&show_headers=1&id_session='.api_get_session_id(); } else { $url = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?action=view&item_id='.$track_exercise_info['orig_lp_item_id'].'&lp_id='.$track_exercise_info['orig_lp_id'].'&'.api_get_cidreq().'&id_session='.api_get_session_id(); } $content = ExerciseLib::getEmailNotification( $currentUserId, api_get_course_info(), $track_exercise_info['title'], $url ); $emailForm->setDefaults(['notification_content' => $content]); $emailForm->addButtonSend( get_lang('CorrectTest'), 'submit', false, ['onclick' => "getFCK('$strids', '$marksid')"] ); echo $emailForm->returnForm(); } //Came from lpstats in a lp if ($origin == 'student_progress') { ?> 'view', 'lp_id' => $learnpath_id, 'lp_item_id' => $learnpath_item_id, 'exeId' => $exeId, 'fb_type' => $feedback_type ]); $href = ($lp_mode == 'fullscreen') ? ' window.opener.location.href="'.$url.'" ' : ' top.location.href="'.$url.'" '; echo ''; // Record the results in the learning path, using the SCORM interface (API) echo ""; echo ''; } else { echo Display::return_message(get_lang('ExerciseFinished').' '.get_lang('ToContinueUseMenu'), 'normal'); echo '
'; } } // Destroying the session Session::erase('questionList'); unset($questionList); Session::erase('exerciseResult'); unset($exerciseResult);