. /** * This page prints a review of a particular quiz attempt * * It is used either by the student whose attempts this is, after the attempt, * or by a teacher reviewing another's attempt during or afterwards. * * @package mod_quiz * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ use mod_quiz\output\attempt_summary_information; use mod_quiz\output\navigation_panel_review; use mod_quiz\output\renderer; use mod_quiz\quiz_attempt; require_once(__DIR__ . '/../../config.php'); require_once($CFG->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', null, PARAM_BOOL); $cmid = optional_param('cmid', null, PARAM_INT); $url = new moodle_url('/mod/quiz/review.php', ['attempt' => $attemptid]); if ($page !== 0) { $url->param('page', $page); } else if ($showall) { $url->param('showall', $showall); } $PAGE->set_url($url); $PAGE->set_secondary_active_tab("modulepage"); $attemptobj = quiz_create_attempt_handling_errors($attemptid, $cmid); $attemptobj->preload_all_attempt_step_users(); $page = $attemptobj->force_page_number_into_range($page); // Now we can validate the params better, re-genrate the page URL. if ($showall === null) { $showall = $page == 0 && $attemptobj->get_default_show_all('review'); } $PAGE->set_url($attemptobj->review_url(null, $page, $showall)); // 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()); $accessmanager->setup_attempt_page($PAGE); $options = $attemptobj->get_display_options(true); // Check permissions - warning there is similar code in reviewquestion.php and // quiz_attempt::check_file_access. If you change on, change them all. if ($attemptobj->is_own_attempt()) { if (!$attemptobj->is_finished()) { redirect($attemptobj->attempt_url(null, $page)); } else if (!$options->attempt) { $accessmanager->back_to_view_page($PAGE->get_renderer('mod_quiz'), $attemptobj->cannot_review_message()); } } else if (!$attemptobj->is_review_allowed()) { throw new moodle_exception('noreviewattempt', 'quiz', $attemptobj->view_url()); } // Load the questions and states needed by this page. if ($showall) { $questionids = $attemptobj->get_slots(); } else { $questionids = $attemptobj->get_slots($page); } // Save the flag states, if they are being changed. if ($options->flags == question_display_options::EDITABLE && optional_param('savingflags', false, PARAM_BOOL)) { require_sesskey(); $attemptobj->save_question_flags(); redirect($attemptobj->review_url(null, $page, $showall)); } // Work out appropriate title and whether blocks should be shown. if ($attemptobj->is_own_preview()) { navigation_node::override_active_url($attemptobj->start_attempt_url()); $attemptobj->update_questions_to_new_version_if_changed(); } else { if (empty($attemptobj->get_quiz()->showblocks) && !$attemptobj->is_preview_user()) { $PAGE->blocks->show_only_fake_blocks(); } } // Set up the page header. $headtags = $attemptobj->get_html_head_contributions($page, $showall); $PAGE->set_title($attemptobj->review_page_title($page, $showall)); $PAGE->set_heading($attemptobj->get_course()->fullname); $PAGE->activityheader->disable(); $summarydata = attempt_summary_information::create_for_attempt($attemptobj, $options, $page, $showall); if ($showall) { $slots = $attemptobj->get_slots(); $lastpage = true; } else { $slots = $attemptobj->get_slots($page); $lastpage = $attemptobj->is_last_page($page); } /** @var renderer $output */ $output = $PAGE->get_renderer('mod_quiz'); // Arrange for the navigation to be displayed. $navbc = $attemptobj->get_navigation_panel($output, navigation_panel_review::class, $page, $showall); $regions = $PAGE->blocks->get_regions(); $PAGE->blocks->add_fake_block($navbc, reset($regions)); echo $output->review_page($attemptobj, $slots, $page, $showall, $lastpage, $options, $summarydata); // Trigger an event for this review. $attemptobj->fire_attempt_reviewed_event();