/** * Display the exercise results * @param Exercise $objExercise * @param int $exe_id * @param bool $save_user_result save users results (true) or just show the results (false) */ public static function display_question_list_by_attempt($objExercise, $exe_id, $save_user_result = false) { global $origin; // Getting attempt info $exercise_stat_info = $objExercise->get_stat_track_exercise_info_by_exe_id($exe_id); // Getting question list $question_list = array(); if (!empty($exercise_stat_info['data_tracking'])) { $question_list = explode(',', $exercise_stat_info['data_tracking']); } else { // Try getting the question list only if save result is off if ($save_user_result == false) { $question_list = $objExercise->get_validated_question_list(); } } $counter = 1; $total_score = $total_weight = 0; $exercise_content = null; // Hide results $show_results = false; $show_only_score = false; if ($objExercise->results_disabled == RESULT_DISABLE_SHOW_SCORE_AND_EXPECTED_ANSWERS) { $show_results = true; } if (in_array($objExercise->results_disabled, array(RESULT_DISABLE_SHOW_SCORE_ONLY, RESULT_DISABLE_SHOW_FINAL_SCORE_ONLY_WITH_CATEGORIES))) { $show_only_score = true; } // Not display expected answer, but score, and feedback $show_all_but_expected_answer = false; if ($objExercise->results_disabled == RESULT_DISABLE_SHOW_SCORE_ONLY && $objExercise->feedback_type == EXERCISE_FEEDBACK_TYPE_END) { $show_all_but_expected_answer = true; $show_results = true; $show_only_score = false; } if ($show_results || $show_only_score) { $user_info = api_get_user_info($exercise_stat_info['exe_user_id']); //Shows exercise header echo $objExercise->show_exercise_result_header($user_info, api_convert_and_format_date($exercise_stat_info['start_date'], DATE_TIME_FORMAT_LONG), $exercise_stat_info['duration'], $exercise_stat_info['user_ip']); } // Display text when test is finished #4074 and for LP #4227 $end_of_message = $objExercise->selectTextWhenFinished(); if (!empty($end_of_message)) { Display::display_normal_message($end_of_message, false); echo "<div class='clear'> </div>"; } $question_list_answers = array(); $media_list = array(); $category_list = array(); // Loop over all question to show results for each of them, one by one if (!empty($question_list)) { foreach ($question_list as $questionId) { // creates a temporary Question object $objQuestionTmp = Question::read($questionId); // This variable came from exercise_submit_modal.php ob_start(); // We're inside *one* question. Go through each possible answer for this question $result = $objExercise->manage_answer($exercise_stat_info['exe_id'], $questionId, null, 'exercise_result', array(), $save_user_result, true, $show_results, $objExercise->selectPropagateNeg(), array()); if (empty($result)) { continue; } // In case of global score, make sure the calculated total score is integer /*if (!is_int($result['score'])) { $result['score'] = round($result['score']); }*/ $total_score += $result['score']; $total_weight += $result['weight']; $question_list_answers[] = array('question' => $result['open_question'], 'answer' => $result['open_answer'], 'answer_type' => $result['answer_type']); $my_total_score = $result['score']; $my_total_weight = $result['weight']; // Category report $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 ($category_was_added_for_this_test == false) { if (!isset($category_list['none']['score'])) { $category_list['none']['score'] = 0; } if (!isset($category_list['none']['total'])) { $category_list['none']['total'] = 0; } $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; } $comnt = null; if ($show_results) { $comnt = Event::get_comments($exe_id, $questionId); if (!empty($comnt)) { echo '<b>' . get_lang('Feedback') . '</b>'; echo '<div id="question_feedback">' . $comnt . '</div>'; } } if ($show_results) { $score = array('result' => get_lang('Score') . " : " . self::show_score($my_total_score, $my_total_weight, false, true), 'pass' => $my_total_score >= $my_total_weight ? true : false, 'score' => $my_total_score, 'weight' => $my_total_weight, 'comments' => $comnt); } else { $score = array(); } $contents = ob_get_clean(); $question_content = ''; if ($show_results) { $question_content = '<div class="question_row_answer">'; $show_media = false; /*if ($objQuestionTmp->parent_id != 0 && !in_array($objQuestionTmp->parent_id, $media_list)) { $show_media = true; $media_list[] = $objQuestionTmp->parent_id; }*/ //Shows question title an description $question_content .= $objQuestionTmp->return_header(null, $counter, $score); } $counter++; $question_content .= $contents; if ($show_results) { $question_content .= '</div>'; } $exercise_content .= $question_content; } // end foreach() block that loops over all questions } $total_score_text = null; if ($origin != 'learnpath') { if ($show_results || $show_only_score) { $total_score_text .= '<div class="question_row_score">'; $total_score_text .= self::get_question_ribbon($objExercise, $total_score, $total_weight, true); $total_score_text .= '</div>'; } } if (!empty($category_list) && ($show_results || $show_only_score)) { //Adding total $category_list['total'] = array('score' => $total_score, 'total' => $total_weight); echo TestCategory::get_stats_table_by_attempt($objExercise->id, $category_list); } if ($show_all_but_expected_answer) { $exercise_content .= "<div class='normal-message'>" . get_lang("ExerciseWithFeedbackWithoutCorrectionComment") . "</div>"; } // Remove audio auto play from questions on results page - refs BT#7939 $exercise_content = preg_replace(['/autoplay[\\=\\".+\\"]+/', '/autostart[\\=\\".+\\"]+/'], '', $exercise_content); echo $total_score_text; echo $exercise_content; if (!$show_only_score) { echo $total_score_text; } if ($save_user_result) { // Tracking of results $learnpath_id = $exercise_stat_info['orig_lp_id']; $learnpath_item_id = $exercise_stat_info['orig_lp_item_id']; $learnpath_item_view_id = $exercise_stat_info['orig_lp_item_view_id']; if (api_is_allowed_to_session_edit()) { Event::update_event_exercice($exercise_stat_info['exe_id'], $objExercise->selectId(), $total_score, $total_weight, api_get_session_id(), $learnpath_id, $learnpath_item_id, $learnpath_item_view_id, $exercise_stat_info['exe_duration'], $question_list, '', array()); } // Send notification .. if (!api_is_allowed_to_edit(null, true) && !api_is_excluded_user_type()) { if (api_get_course_setting('email_alert_manager_on_new_quiz') == 1) { $objExercise->send_mail_notification_for_exam($question_list_answers, $origin, $exe_id); } $objExercise->send_notification_for_open_questions($question_list_answers, $origin, $exe_id); $objExercise->send_notification_for_oral_questions($question_list_answers, $origin, $exe_id); } } }
</tr> </table>'; } } } } else { Display::display_warning_message(get_lang('CantViewResults')); $show_results = false; } if ($origin == 'learnpath' && !isset($_GET['fb_type'])) { $show_results = false; } if ($show_results || $show_only_total_score) { $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)); } $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) . " "; $query = "SELECT attempts.question_id, answer FROM " . $TBL_TRACK_ATTEMPT . " as attempts\n\t\t\t\tINNER JOIN " . $TBL_TRACK_EXERCICES . " AS stats_exercices ON stats_exercices.exe_id=attempts.exe_id\n\t\t\t\tINNER JOIN " . $TBL_EXERCICE_QUESTION . " AS quizz_rel_questions\n\t\t\t\t ON quizz_rel_questions.exercice_id=stats_exercices.exe_exo_id\n\t\t\t\t AND quizz_rel_questions.question_id = attempts.question_id\n\t\t\t\t AND quizz_rel_questions.c_id=" . api_get_course_int_id() . "\n\t\t\t\tINNER JOIN " . $TBL_QUESTIONS . " AS questions\n\t\t\t\t ON questions.id=quizz_rel_questions.question_id\n\t\t\t\t AND questions.c_id = " . api_get_course_int_id() . "\n\t\t WHERE attempts.exe_id='" . Database::escape_string($id) . "' {$user_restriction}\n\t\t GROUP BY quizz_rel_questions.question_order, attempts.question_id"; $result = Database::query($query); $question_list_from_database = array(); $exerciseResult = array(); while ($row = Database::fetch_array($result)) { $question_list_from_database[] = $row['question_id'];
</tr> </table>'; } } } } else { Display::display_warning_message(get_lang('CantViewResults')); $show_results = false; } if ($origin == 'learnpath' && !isset($_GET['fb_type'])) { $show_results = false; } if ($show_results || $show_only_total_score) { $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\n FROM {$TBL_TRACK_ATTEMPT} as attempts\n INNER JOIN " . $TBL_TRACK_EXERCISES . " AS stats_exercises\n ON stats_exercises.exe_id=attempts.exe_id\n INNER JOIN {$TBL_EXERCISE_QUESTION} AS quizz_rel_questions\n ON\n quizz_rel_questions.exercice_id=stats_exercises.exe_exo_id AND\n quizz_rel_questions.question_id = attempts.question_id AND\n quizz_rel_questions.c_id=" . api_get_course_int_id() . "\n INNER JOIN " . $TBL_QUESTIONS . " AS questions\n ON\n questions.id=quizz_rel_questions.question_id AND\n questions.c_id = " . api_get_course_int_id() . "\n WHERE\n attempts.exe_id = " . intval($id) . " {$user_restriction}\n\t\tGROUP 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'];
</tr> </table>'; } } } } else { Display::display_warning_message(get_lang('CantViewResults')); $show_results = false; } if ($origin == 'learnpath' && !isset($_GET['fb_type'])) { $show_results = false; } if ($show_results || $show_only_total_score) { $user_info = api_get_user_info($student_id); // Shows exercise header. echo $objExercise->show_exercise_result_header(api_get_person_name($user_info['firstName'], $user_info['lastName']), api_convert_and_format_date($exercise_date)); } $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) . " "; $query = "SELECT attempts.question_id, answer\n FROM " . $TBL_TRACK_ATTEMPT . " as attempts\n INNER JOIN " . $TBL_TRACK_EXERCICES . " AS stats_exercices\n ON stats_exercices.exe_id=attempts.exe_id\n INNER JOIN " . $TBL_EXERCICE_QUESTION . " AS quizz_rel_questions\n ON quizz_rel_questions.exercice_id=stats_exercices.exe_exo_id AND\n quizz_rel_questions.question_id = attempts.question_id AND\n quizz_rel_questions.c_id=" . api_get_course_int_id() . "\n INNER JOIN " . $TBL_QUESTIONS . " AS questions\n ON questions.iid=quizz_rel_questions.question_id AND\n questions.c_id = " . api_get_course_int_id() . "\n\t\t WHERE attempts.exe_id='" . Database::escape_string($id) . "' {$user_restriction}\n\t\t GROUP BY quizz_rel_questions.question_order, attempts.question_id"; $result = Database::query($query); $question_list_from_database = array(); $exerciseResult = array(); while ($row = Database::fetch_array($result)) { $question_list_from_database[] = $row['question_id'];