dirroot . '/mod/quiz/locallib.php'); $attemptid = required_param('attempt', PARAM_INT); $page = optional_param('page', 0, PARAM_INT); $showall = optional_param('showall', 0, PARAM_BOOL); $attemptobj = new quiz_attempt($attemptid); /// Check login. require_login($attemptobj->get_courseid(), false, $attemptobj->get_cm()); /// Create an object to manage all the other (non-roles) access rules. $accessmanager = $attemptobj->get_access_manager(time()); $options = $attemptobj->get_review_options(); /// Permissions checks for normal users who do not have quiz:viewreports capability. if (!$attemptobj->has_capability('mod/quiz:viewreports')) { /// Can't review during the attempt - send them back to the attempt page. if (!$attemptobj->is_finished()) { redirect($attemptobj->attempt_url(0, $page)); } /// Can't review other users' attempts. if (!$attemptobj->is_own_attempt()) { quiz_error($quiz, 'notyourattempt'); } /// Can't review unless Students may review -> Responses option is turned on. if (!$options->responses) { $accessmanager->back_to_view_page($attemptobj->is_preview_user(), $accessmanager->cannot_review_message($options)); } } /// load the questions and states needed by this page. if ($showall) { $questionids = $attemptobj->get_question_ids(); } else { $questionids = $attemptobj->get_question_ids($page); } $attemptobj->load_questions($questionids); $attemptobj->load_question_states($questionids); /// Log this review. add_to_log($attemptobj->get_courseid(), 'quiz', 'review', 'review.php?attempt=' . $attemptobj->get_attemptid(), $attemptobj->get_quizid(), $attemptobj->get_cmid()); /// Work out appropriate title. if ($attemptobj->is_preview_user() && $attemptobj->is_own_attempt()) { $strreviewtitle = get_string('reviewofpreview', 'quiz'); } else { $strreviewtitle = get_string('reviewofattempt', 'quiz', $attemptobj->get_attempt_number()); } /// Print the page header $headtags = $attemptobj->get_html_head_contributions($page); if ($accessmanager->securewindow_required($attemptobj->is_preview_user())) { $accessmanager->setup_secure_page($course->shortname.': '.format_string($quiz->name), $headtags); } else { print_header_simple(format_string($attemptobj->get_quiz_name()), '', $attemptobj->navigation($strreviewtitle), '', $headtags, true, $attemptobj->update_module_button()); } echo ''; // for overlib /// Print tabs if they should be there. if ($attemptobj->is_preview_user()) { if ($attemptobj->is_own_attempt()) { $currenttab = 'preview'; } else { $currenttab = 'reports'; $mode = ''; } include('tabs.php'); } /// Print heading. print_heading(format_string($attemptobj->get_quiz_name())); if ($attemptobj->is_preview_user() && $attemptobj->is_own_attempt()) { $attemptobj->print_restart_preview_button(); } print_heading($strreviewtitle); /// Print the navigation panel in a left column. print_container_start(); echo '
'; $attemptobj->print_navigation_panel('quiz_review_nav_panel', $page); echo '
'; print_container_end(); /// Start the main column. echo '
'; print_container_start(); echo skip_main_destination(); /// Summary table start ============================================================================ /// Work out some time-related things. $attempt = $attemptobj->get_attempt(); $quiz = $attemptobj->get_quiz(); $timelimit = $quiz->timelimit * 60; $overtime = 0; if ($attempt->timefinish) { if ($timetaken = ($attempt->timefinish - $attempt->timestart)) { if($timelimit && $timetaken > ($timelimit + 60)) { $overtime = $timetaken - $timelimit; $overtime = format_time($overtime); } $timetaken = format_time($timetaken); } else { $timetaken = "-"; } } else { $timetaken = get_string('unfinished', 'quiz'); } /// Print summary table about the whole attempt. /// First we assemble all the rows that are appopriate to the current situation in /// an array, then later we only output the table if there are any rows to show. $rows = array(); if ($attemptobj->get_userid() <> $USER->id) { $student = $DB->get_record('user', array('id' => $attemptobj->get_userid())); $picture = print_user_picture($student, $attemptobj->get_courseid(), $student->picture, false, true); $rows[] = '' . $picture . '' . fullname($student, true) . ''; } if ($attemptobj->has_capability('mod/quiz:viewreports')) { $attemptlist = $attemptobj->links_to_other_attempts($attemptobj->review_url(0, $page, $showall)); if ($attemptlist) { $rows[] = '' . get_string('attempts', 'quiz') . '' . $attemptlist . ''; } } /// Timing information. $rows[] = '' . get_string('startedon', 'quiz') . '' . userdate($attempt->timestart) . ''; if ($attempt->timefinish) { $rows[] = '' . get_string('completedon', 'quiz') . '' . userdate($attempt->timefinish) . ''; $rows[] = '' . get_string('timetaken', 'quiz') . '' . $timetaken . ''; } if (!empty($overtime)) { $rows[] = '' . get_string('overdue', 'quiz') . '' . $overtime . ''; } /// Show scores (if the user is allowed to see scores at the moment). $grade = quiz_rescale_grade($attempt->sumgrades, $quiz); if ($options->scores) { if ($quiz->grade and $quiz->sumgrades) { if($overtime) { $result->sumgrades = "0"; $result->grade = "0.0"; } /// Show raw marks only if they are different from the grade (like on the view page. if ($quiz->grade != $quiz->sumgrades) { $a = new stdClass; $a->grade = round($attempt->sumgrades, $CFG->quiz_decimalpoints); $a->maxgrade = $quiz->sumgrades; $rows[] = '' . get_string('marks', 'quiz') . '' . get_string('outofshort', 'quiz', $a) . ''; } /// Now the scaled grade. $a = new stdClass; $a->grade = '' . $grade . ''; $a->maxgrade = $quiz->grade; $a->percent = '' . round(($attempt->sumgrades/$quiz->sumgrades)*100, 0) . ''; $rows[] = '' . get_string('grade') . '' . get_string('outofpercent', 'quiz', $a) . ''; } } /// Feedback if there is any, and the user is allowed to see it now. $feedback = quiz_feedback_for_grade($grade, $attempt->quiz); if ($options->overallfeedback && $feedback) { $rows[] = '' . get_string('feedback', 'quiz') . '' . $feedback . ''; } /// Now output the summary table, if there are any rows to be shown. if (!empty($rows)) { echo '', "\n"; echo implode("\n", $rows); echo "\n
\n"; } /// Summary table end ============================================================================== /// Print all the questions if ($showall) { $thispage = 'all'; $lastpage = true; } else { $thispage = $page; $lastpage = $attemptobj->is_last_page($page); } foreach ($attemptobj->get_question_ids($thispage) as $id) { $attemptobj->print_question($id); } /// Print a link to the next page. echo '
'; if ($lastpage) { $accessmanager->print_finish_review_link($attemptobj->is_preview_user()); } else { link_arrow_right(get_string('next'), $attemptobj->review_url(0, $page + 1)); } echo "
"; // End middle column. print_container_end(); echo '
'; echo ''; echo '
'; // Finish the page if ($accessmanager->securewindow_required($attemptobj->is_preview_user())) { print_footer('empty'); } else { print_footer($course); } ?>