MDL-52738 quiz: Previous button during attempt review.

This is to be consistent with places like forum and book, where if we
have a next link, we also have a previous link.

At the same time I have amended the links/buttons from 'Previous'/'Next'
to 'Previous page'/'Next page' because I think that is clearer.

Also, on the last page of the quiz, I have changed 'Next' to 'Finish
attempt ...' for consistency with the link in the navigation block.

AMOS BEGIN
 CPY [navigatenext,mod_assignment],[navigatenext,mod_quiz]
 CPY [navigateprevious,mod_assignment],[navigateprevious,mod_quiz]
AMOS END
This commit is contained in:
Tim Hunt 2016-01-12 17:08:32 +00:00
parent e8d5100212
commit c67ab86fa9
11 changed files with 101 additions and 20 deletions

View File

@ -498,6 +498,8 @@ $string['multichoice'] = 'Multiple choice';
$string['multipleanswers'] = 'Choose at least one answer.'; $string['multipleanswers'] = 'Choose at least one answer.';
$string['mustbesubmittedby'] = 'This attempt must be submitted by {$a}.'; $string['mustbesubmittedby'] = 'This attempt must be submitted by {$a}.';
$string['name'] = 'Name'; $string['name'] = 'Name';
$string['navigatenext'] = 'Next page';
$string['navigateprevious'] = 'Previous page';
$string['navmethod'] = 'Navigation method'; $string['navmethod'] = 'Navigation method';
$string['navmethod_free'] = 'Free'; $string['navmethod_free'] = 'Free';
$string['navmethod_help'] = 'When sequential navigation is enabled a student must progress through the quiz in order and may not return to previous pages nor skip ahead.'; $string['navmethod_help'] = 'When sequential navigation is enabled a student must progress through the quiz in order and may not return to previous pages nor skip ahead.';

View File

@ -39,6 +39,7 @@ $timenow = time();
$attemptid = required_param('attempt', PARAM_INT); $attemptid = required_param('attempt', PARAM_INT);
$thispage = optional_param('thispage', 0, PARAM_INT); $thispage = optional_param('thispage', 0, PARAM_INT);
$nextpage = optional_param('nextpage', 0, PARAM_INT); $nextpage = optional_param('nextpage', 0, PARAM_INT);
$previous = optional_param('previous', false, PARAM_BOOL);
$next = optional_param('next', false, PARAM_BOOL); $next = optional_param('next', false, PARAM_BOOL);
$finishattempt = optional_param('finishattempt', false, PARAM_BOOL); $finishattempt = optional_param('finishattempt', false, PARAM_BOOL);
$timeup = optional_param('timeup', 0, PARAM_BOOL); // True if form was submitted by timer. $timeup = optional_param('timeup', 0, PARAM_BOOL); // True if form was submitted by timer.
@ -50,6 +51,8 @@ $attemptobj = quiz_attempt::create($attemptid);
// Set $nexturl now. // Set $nexturl now.
if ($next) { if ($next) {
$page = $nextpage; $page = $nextpage;
} else if ($previous && $thispage > 0) {
$page = $thispage - 1;
} else { } else {
$page = $thispage; $page = $thispage;
} }

View File

@ -237,25 +237,36 @@ class mod_quiz_renderer extends plugin_renderer_base {
array($url), false, quiz_get_js_module()); array($url), false, quiz_get_js_module());
return html_writer::empty_tag('input', array('type' => 'button', return html_writer::empty_tag('input', array('type' => 'button',
'value' => get_string('finishreview', 'quiz'), 'value' => get_string('finishreview', 'quiz'),
'id' => 'secureclosebutton')); 'id' => 'secureclosebutton',
'class' => 'mod_quiz-next-nav'));
} else { } else {
return html_writer::link($url, get_string('finishreview', 'quiz')); return html_writer::link($url, get_string('finishreview', 'quiz'),
array('class' => 'mod_quiz-next-nav'));
} }
} }
/** /**
* Creates a next page arrow or the finishing link * Creates the navigation links/buttons at the bottom of the reivew attempt page.
*
* Note, the name of this function is no longer accurate, but when the design
* changed, it was decided to keep the old name for backwards compatibility.
* *
* @param quiz_attempt $attemptobj instance of quiz_attempt * @param quiz_attempt $attemptobj instance of quiz_attempt
* @param int $page the current page * @param int $page the current page
* @param bool $lastpage if true current page is the last page * @param bool $lastpage if true current page is the last page
*/ */
public function review_next_navigation(quiz_attempt $attemptobj, $page, $lastpage) { public function review_next_navigation(quiz_attempt $attemptobj, $page, $lastpage) {
$nav = '';
if ($page > 0) {
$nav .= link_arrow_left(get_string('navigateprevious', 'quiz'),
$attemptobj->review_url(null, $page - 1), false, 'mod_quiz-prev-nav');
}
if ($lastpage) { if ($lastpage) {
$nav = $this->finish_review_link($attemptobj); $nav .= $this->finish_review_link($attemptobj);
} else { } else {
$nav = link_arrow_right(get_string('next'), $attemptobj->review_url(null, $page + 1)); $nav .= link_arrow_right(get_string('navigatenext', 'quiz'),
$attemptobj->review_url(null, $page + 1), false, 'mod_quiz-next-nav');
} }
return html_writer::tag('div', $nav, array('class' => 'submitbtns')); return html_writer::tag('div', $nav, array('class' => 'submitbtns'));
} }
@ -476,10 +487,7 @@ class mod_quiz_renderer extends plugin_renderer_base {
$attemptobj->attempt_url($slot, $page), $this); $attemptobj->attempt_url($slot, $page), $this);
} }
$output .= html_writer::start_tag('div', array('class' => 'submitbtns')); $output .= $this->attempt_navigation_buttons($page, $attemptobj->is_last_page($page));
$output .= html_writer::empty_tag('input', array('type' => 'submit', 'name' => 'next',
'value' => get_string('next')));
$output .= html_writer::end_tag('div');
// Some hidden fields to trach what is going on. // Some hidden fields to trach what is going on.
$output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'attempt', $output .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'attempt',
@ -510,6 +518,33 @@ class mod_quiz_renderer extends plugin_renderer_base {
return $output; return $output;
} }
/**
* Display the prev/next buttons that go at the bottom of each page of the attempt.
*
* @param int $page the page number. Starts at 0 for the first page.
* @param bool $lastpage is this the last page in the quiz?
* @return string HTML fragment.
*/
protected function attempt_navigation_buttons($page, $lastpage) {
$output = '';
$output .= html_writer::start_tag('div', array('class' => 'submitbtns'));
if ($page > 0) {
$output .= html_writer::empty_tag('input', array('type' => 'submit', 'name' => 'previous',
'value' => get_string('navigateprevious', 'quiz'), 'class' => 'mod_quiz-prev-nav'));
}
if ($lastpage) {
$nextlabel = get_string('endtest', 'quiz');
} else {
$nextlabel = get_string('navigatenext', 'quiz');
}
$output .= html_writer::empty_tag('input', array('type' => 'submit', 'name' => 'next',
'value' => $nextlabel, 'class' => 'mod_quiz-next-nav'));
$output .= html_writer::end_tag('div');
return $output;
}
/** /**
* Render a button which allows students to redo a question in the attempt. * Render a button which allows students to redo a question in the attempt.
* *

View File

@ -18,12 +18,20 @@
text-align: left; text-align: left;
padding-top: 1.5em; padding-top: 1.5em;
} }
#page-mod-quiz-attempt.dir-rtl .submitbtns, #page-mod-quiz-attempt.dir-rtl .submitbtns,
#page-mod-quiz-review.dir-rtl .submitbtns { #page-mod-quiz-review.dir-rtl .submitbtns {
text-align: right; text-align: right;
} }
#page-mod-quiz-attempt .submitbtns .mod_quiz-next-nav,
#page-mod-quiz-review .submitbtns .mod_quiz-next-nav {
float: right;
}
#page-mod-quiz-attempt.dir-rtl .submitbtns .mod_quiz-next-nav,
#page-mod-quiz-review.dir-rtl .submitbtns .mod_quiz-next-nav {
float: left;
}
.path-mod-quiz .mod_quiz-redo_question_button { .path-mod-quiz .mod_quiz-redo_question_button {
margin: 0; margin: 0;
} }

View File

@ -37,7 +37,7 @@ Feature: Add a quiz
Then I should see "Question 1" Then I should see "Question 1"
And I should see "Answer the first question" And I should see "Answer the first question"
And I set the field "True" to "1" And I set the field "True" to "1"
And I press "Next" And I press "Finish attempt ..."
And I should see "Answer saved" And I should see "Answer saved"
And I press "Submit all and finish" And I press "Submit all and finish"

View File

@ -37,7 +37,7 @@ Feature: Attemp a quiz where some questions require that the previous question h
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I click on "True" "radio" in the "First question" "question" And I click on "True" "radio" in the "First question" "question"
And I click on "False" "radio" in the "Second question" "question" And I click on "False" "radio" in the "Second question" "question"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue" And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
Then I should see "25.00 out of 100.00" Then I should see "25.00 out of 100.00"
@ -99,3 +99,36 @@ Feature: Attemp a quiz where some questions require that the previous question h
And I should see question "4" in section "Section 2" in the quiz navigation And I should see question "4" in section "Section 2" in the quiz navigation
And I should see question "5" in section "Section 3" in the quiz navigation And I should see question "5" in section "Section 3" in the quiz navigation
And I should see question "6" in section "Section 3" in the quiz navigation And I should see question "6" in section "Section 3" in the quiz navigation
@javascript
Scenario: Next and previous navigation
Given the following "questions" exist:
| questioncategory | qtype | name | questiontext |
| Test questions | truefalse | TF1 | Text of the first question |
| Test questions | truefalse | TF2 | Text of the second question |
And quiz "Quiz 1" contains the following questions:
| question | page |
| TF1 | 1 |
| TF2 | 2 |
When I log in as "student"
And I follow "Course 1"
And I follow "Quiz 1"
And I press "Attempt quiz now"
Then I should see "Text of the first question"
And I press "Next page"
And I should see "Text of the second question"
And I click on "Finish attempt ..." "button" in the "region-main" "region"
And I should see "Summary of attempt"
And I press "Return to attempt"
And I should see "Text of the second question"
And I press "Previous page"
And I should see "Text of the first question"
And I follow "Finish attempt ..."
And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
And I follow "Show one page at a time"
And I should see "Text of the first question"
And I follow "Next page"
And I should see "Text of the second question"
And I follow "Previous page"
And I should see "Text of the first question"

View File

@ -63,7 +63,7 @@ Feature: Allow students to redo questions in a practice quiz, without starting a
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I click on "False" "radio" in the "First question" "question" And I click on "False" "radio" in the "First question" "question"
And I click on "Check" "button" in the "First question" "question" And I click on "Check" "button" in the "First question" "question"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue" And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
Then "Redo question" "button" should not exist Then "Redo question" "button" should not exist
@ -75,7 +75,7 @@ Feature: Allow students to redo questions in a practice quiz, without starting a
And I click on "False" "radio" in the "First question" "question" And I click on "False" "radio" in the "First question" "question"
And I click on "Check" "button" in the "First question" "question" And I click on "Check" "button" in the "First question" "question"
And I press "Redo question" And I press "Redo question"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue" And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
And I log out And I log out

View File

@ -99,7 +99,7 @@ Feature: Attemp a quiz where some questions require that the previous question h
And I follow "Course 1" And I follow "Course 1"
And I follow "Quiz 1" And I follow "Quiz 1"
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue" And I click on "Submit all and finish" "button" in the "Confirmation" "dialogue"
@ -177,7 +177,7 @@ Feature: Attemp a quiz where some questions require that the previous question h
And I follow "Course 1" And I follow "Course 1"
And I follow "Quiz 1" And I follow "Quiz 1"
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I press "Next" And I press "Next page"
Then I should see "Second question" Then I should see "Second question"
And I should not see "This question cannot be attempted until the previous question has been completed." And I should not see "This question cannot be attempted until the previous question has been completed."

View File

@ -38,14 +38,14 @@ Feature: Set a quiz to be marked complete when the student uses all attempts all
And I follow "Test quiz name" And I follow "Test quiz name"
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I set the field "False" to "1" And I set the field "False" to "1"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I follow "C1" And I follow "C1"
And the "Test quiz name" "quiz" activity with "auto" completion should be marked as not complete And the "Test quiz name" "quiz" activity with "auto" completion should be marked as not complete
And I follow "Test quiz name" And I follow "Test quiz name"
And I press "Re-attempt quiz" And I press "Re-attempt quiz"
And I set the field "False" to "1" And I set the field "False" to "1"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I follow "C1" And I follow "C1"
Then "//img[contains(@alt, 'Completed: Test quiz name')]" "xpath_element" should exist in the "li.modtype_quiz" "css_element" Then "//img[contains(@alt, 'Completed: Test quiz name')]" "xpath_element" should exist in the "li.modtype_quiz" "css_element"

View File

@ -38,7 +38,7 @@ Feature: Set a quiz to be marked complete when the student passes
And I follow "Test quiz name" And I follow "Test quiz name"
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I set the field "True" to "1" And I set the field "True" to "1"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I follow "C1" And I follow "C1"
Then "//img[contains(@alt, 'Completed: Test quiz name')]" "xpath_element" should exist in the "li.modtype_quiz" "css_element" Then "//img[contains(@alt, 'Completed: Test quiz name')]" "xpath_element" should exist in the "li.modtype_quiz" "css_element"

View File

@ -39,7 +39,7 @@ Feature: Quiz reset
And I follow "Test quiz name" And I follow "Test quiz name"
And I press "Attempt quiz now" And I press "Attempt quiz now"
And I set the field "True" to "1" And I set the field "True" to "1"
And I press "Next" And I press "Finish attempt ..."
And I press "Submit all and finish" And I press "Submit all and finish"
And I log out And I log out
And I log in as "teacher1" And I log in as "teacher1"