dirroot . '/mod/quiz/locallib.php'); require_once($CFG->dirroot . '/mod/quiz/report/reportlib.php'); $attemptid = required_param('attempt', PARAM_INT); $page = optional_param('page', 0, PARAM_INT); $showall = optional_param('showall', 0, PARAM_BOOL); $url = new moodle_url('/mod/quiz/review.php', array('attempt'=>$attemptid)); if ($page !== 0) { $url->param('page', $page); } if ($showall !== 0) { $url->param('showall', $showall); } $PAGE->set_url($url); $attemptobj = quiz_attempt::create($attemptid); /// Check login. require_login($attemptobj->get_course(), false, $attemptobj->get_cm()); $attemptobj->check_review_capability(); /// 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 other users' attempts. if (!$attemptobj->is_own_attempt()) { quiz_error($attemptobj->get_quiz(), 'notyourattempt'); } /// 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 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); /// Save the flag states, if they are being changed. if ($options->flags == QUESTION_FLAGSEDITABLE && optional_param('savingflags', false, PARAM_BOOL)) { require_sesskey(); $formdata = data_submitted(); question_save_flags($formdata, $attemptid, $questionids); redirect($attemptobj->review_url(0, $page, $showall)); } /// 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 and whether blocks should be shown if ($attemptobj->is_preview_user() && $attemptobj->is_own_attempt()) { // Normal blocks $strreviewtitle = get_string('reviewofpreview', 'quiz'); navigation_node::override_active_url($attemptobj->start_attempt_url()); } else { $strreviewtitle = get_string('reviewofattempt', 'quiz', $attemptobj->get_attempt_number()); if (empty($attemptobj->get_quiz()->showblocks) && !$attemptobj->is_preview_user()) { // Only show pretend blocks $PAGE->blocks->show_only_fake_blocks(); } } // Initialise the JavaScript. $headtags = $attemptobj->get_html_head_contributions($page); // Arrange for the navigation to be displayed. $navbc = $attemptobj->get_navigation_panel('quiz_review_nav_panel', $page, $showall); $firstregion = reset($PAGE->blocks->get_regions()); $PAGE->blocks->add_fake_block($navbc, $firstregion); /// Print the page header $headtags = $attemptobj->get_html_head_contributions($page); if ($accessmanager->securewindow_required($attemptobj->is_preview_user())) { $accessmanager->setup_secure_page($attemptobj->get_course()->shortname.': '.format_string($attemptobj->get_quiz_name()), $headtags); } elseif ($accessmanager->safebrowser_required($attemptobj->is_preview_user())) { $PAGE->set_title($attemptobj->get_course()->shortname . ': '.format_string($attemptobj->get_quiz_name())); $PAGE->set_heading($attemptobj->get_course()->fullname); $PAGE->set_cacheable(false); echo $OUTPUT->header(); } else { $attemptobj->navigation($strreviewtitle); $PAGE->set_title(format_string($attemptobj->get_quiz_name())); $PAGE->set_heading($attemptobj->get_course()->fullname); echo $OUTPUT->header(); } /// Print heading. if ($attemptobj->is_preview_user() && $attemptobj->is_own_attempt()) { $attemptobj->print_restart_preview_button(); } echo $OUTPUT->heading($strreviewtitle); /// Summary table start ============================================================================ /// Work out some time-related things. $attempt = $attemptobj->get_attempt(); $quiz = $attemptobj->get_quiz(); $overtime = 0; if ($attempt->timefinish) { if ($timetaken = ($attempt->timefinish - $attempt->timestart)) { if($quiz->timelimit && $timetaken > ($quiz->timelimit + 60)) { $overtime = $timetaken - $quiz->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_quiz()->showuserpicture && $attemptobj->get_userid() <> $USER->id) { /// If showuserpicture is true, the picture is shown elsewhere, so don't repeat it. $student = $DB->get_record('user', array('id' => $attemptobj->get_userid())); $picture = $OUTPUT->user_picture($student, array('courseid'=>$attemptobj->get_courseid())); $rows[] = '