diff --git a/mod/quiz/attempt.php b/mod/quiz/attempt.php index 5c5395d8070..a8d7a8c070f 100644 --- a/mod/quiz/attempt.php +++ b/mod/quiz/attempt.php @@ -42,6 +42,7 @@ $attemptid = required_param('attempt', PARAM_INT); $page = optional_param('page', 0, PARAM_INT); $attemptobj = quiz_attempt::create($attemptid); +$page = $attemptobj->force_page_number_into_range($page); $PAGE->set_url($attemptobj->attempt_url(null, $page)); // Check login. diff --git a/mod/quiz/attemptlib.php b/mod/quiz/attemptlib.php index b0efecec374..9a1693b5814 100644 --- a/mod/quiz/attemptlib.php +++ b/mod/quiz/attemptlib.php @@ -516,7 +516,17 @@ class quiz_attempt { } } - // Simple getters ====================================================================== + /** + * If the given page number is out of range (before the first page, or after + * the last page, chnage it to be within range). + * @param int $page the requested page number. + * @return int a safe page number to use. + */ + public function force_page_number_into_range($page) { + return min(max($page, 0), count($this->pagelayout) - 1); + } + + // Simple getters ========================================================== public function get_quiz() { return $this->quizobj->get_quiz(); } @@ -974,7 +984,7 @@ class quiz_attempt { } /** - * Initialise the JS etc. required all the questions on a page.. + * Initialise the JS etc. required all the questions on a page. * @param mixed $page a page number, or 'all'. */ public function get_html_head_contributions($page = 'all', $showall = false) { diff --git a/mod/quiz/processattempt.php b/mod/quiz/processattempt.php index 4ec7afe5b53..06d577ecea9 100644 --- a/mod/quiz/processattempt.php +++ b/mod/quiz/processattempt.php @@ -37,13 +37,13 @@ require_once($CFG->dirroot . '/mod/quiz/locallib.php'); $timenow = time(); // Get submitted parameters. -$attemptid = required_param('attempt', PARAM_INT); -$next = optional_param('next', false, PARAM_BOOL); -$thispage = optional_param('thispage', 0, PARAM_INT); -$nextpage = optional_param('nextpage', 0, PARAM_INT); -$finishattempt = optional_param('finishattempt', 0, PARAM_BOOL); -$timeup = optional_param('timeup', 0, PARAM_BOOL); // True if form was submitted by timer. -$scrollpos = optional_param('scrollpos', '', PARAM_RAW); +$attemptid = required_param('attempt', PARAM_INT); +$thispage = required_param('thispage', PARAM_INT); +$nextpage = required_param('nextpage', PARAM_INT); +$next = optional_param('next', false, PARAM_BOOL); +$finishattempt = optional_param('finishattempt', false, PARAM_BOOL); +$timeup = optional_param('timeup', 0, PARAM_BOOL); // True if form was submitted by timer. +$scrollpos = optional_param('scrollpos', '', PARAM_RAW); $transaction = $DB->start_delegated_transaction(); $attemptobj = quiz_attempt::create($attemptid); diff --git a/mod/quiz/review.php b/mod/quiz/review.php index 8ecae8930f6..64bc0b2f3b4 100644 --- a/mod/quiz/review.php +++ b/mod/quiz/review.php @@ -32,8 +32,8 @@ 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', 0, PARAM_BOOL); +$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) { @@ -45,6 +45,7 @@ if ($showall !== 0) { $PAGE->set_url($url); $attemptobj = quiz_attempt::create($attemptid); +$page = $attemptobj->force_page_number_into_range($page); // Check login. require_login($attemptobj->get_course(), false, $attemptobj->get_cm());