diff --git a/lang/en/help/quiz/review.html b/lang/en/help/quiz/review.html new file mode 100644 index 00000000000..6376609f602 --- /dev/null +++ b/lang/en/help/quiz/review.html @@ -0,0 +1,6 @@ +

Allow review once quiz is closed

+ +

If you enable this option, then students will be able to + review their past attempts at this quiz.

+ +

This is only enabled once the quiz is closed.

diff --git a/lang/en/quiz.php b/lang/en/quiz.php index e5eb1ace21a..9af28c6c19d 100644 --- a/lang/en/quiz.php +++ b/lang/en/quiz.php @@ -6,6 +6,7 @@ $string['modulenameplural'] = "Quizzes"; #------------------------------------------------------------ $string['addselectedtoquiz'] = "Add selected to quiz"; +$string['allowreview'] = "Allow review"; $string['alwaysavailable'] = "Always available"; $string['alreadysubmitted'] = "It is likely that you have already submitted this attempt"; $string['answer'] = "Answer"; @@ -68,6 +69,8 @@ $string['noanswers'] = "No answers were selected!"; $string['noattempts'] = "No attempts have been made on this quiz"; $string['nomoreattempts'] = "No more attempts are allowed"; $string['noquestions'] = "No questions have been added yet"; +$string['noreview'] = "You are not allowed to review this quiz"; +$string['noreviewuntil'] = "You are not allowed to review this quiz until \$a"; $string['publish'] = "Publish"; $string['question'] = "Question"; $string['questioninuse'] = "The question '\$a' is currently being used:"; diff --git a/mod/quiz/lib.php b/mod/quiz/lib.php index 241d31b54e4..58cc00a3982 100644 --- a/mod/quiz/lib.php +++ b/mod/quiz/lib.php @@ -453,10 +453,10 @@ function quiz_print_question($number, $questionid, $grade, $courseid, $answer = $answers[$answerid]; $qnum = $key + 1; - if ($feedback and $response[$answerid]) { - $checked = "CHECKED"; - } else { + if (empty($feedback) or empty($response[$answerid])) { $checked = ""; + } else { + $checked = "CHECKED"; } echo ""; if ($options->single) { @@ -465,14 +465,14 @@ function quiz_print_question($number, $questionid, $grade, $courseid, echo "id"."a$answer->id VALUE=\"$answer->id\">"; } echo ""; - if ($feedback and $correct[$answer->id]) { - echo "$qnum. $answer->answer"; - } else { + if (empty($feedback) or empty($correct[$answer->id])) { echo "$qnum. $answer->answer"; + } else { + echo "$qnum. $answer->answer"; } - if ($feedback) { + if (!empty($feedback)) { echo " "; - if ($response[$answerid]) { + if (!empty($response[$answerid])) { quiz_print_comment($feedback[$answerid]); } echo ""; @@ -498,7 +498,7 @@ function quiz_print_question($number, $questionid, $grade, $courseid, function quiz_print_quiz_questions($quiz, $results=NULL) { // Prints a whole quiz on one page. - if (!$quiz->questions) { + if (empty($quiz->questions)) { notify("No questions have been defined!", "view.php?id=$cm->id"); return false; } @@ -520,12 +520,20 @@ function quiz_print_quiz_questions($quiz, $results=NULL) { $response = NULL; $actualgrades = NULL; $correct = NULL; - if ($results) { - $feedback = $results->feedback[$questionid]; - $response = $results->response[$questionid]; - $actualgrades = $results->grades[$questionid]; + if (!empty($results)) { + if (!empty($results->feedback[$questionid])) { + $feedback = $results->feedback[$questionid]; + } + if (!empty($results->response[$questionid])) { + $response = $results->response[$questionid]; + } + if (!empty($results->grades[$questionid])) { + $actualgrades = $results->grades[$questionid]; + } if ($quiz->correctanswers) { - $correct = $results->correct[$questionid]; + if (!empty($results->correct[$questionid])) { + $correct = $results->correct[$questionid]; + } } } @@ -536,7 +544,7 @@ function quiz_print_quiz_questions($quiz, $results=NULL) { echo "
"; } - if (!$results) { + if (empty($results)) { echo "
"; } echo ""; diff --git a/mod/quiz/mod.html b/mod/quiz/mod.html index 4617f3ac1c3..b347bca6dbf 100644 --- a/mod/quiz/mod.html +++ b/mod/quiz/mod.html @@ -28,6 +28,9 @@ if (empty($form->correctanswers)) { $form->correctanswers = ""; } + if (empty($form->review)) { + $form->review = ""; + } if (empty($form->grade)) { $form->grade = ""; } @@ -132,6 +135,18 @@ ?> + +

:

+ + review", ""); + helpbutton("review", get_string("allowreview","quiz"), "quiz"); + ?> + +

:

diff --git a/mod/quiz/report.php b/mod/quiz/report.php index e3f08233529..3a2364f87dc 100644 --- a/mod/quiz/report.php +++ b/mod/quiz/report.php @@ -9,6 +9,7 @@ optional_variable($q); // quiz ID optional_variable($attempt); // A particular attempt ID + optional_variable($review); // A particular attempt ID for review by student optional_variable($regrade); // Regrade all attempts if ($id) { @@ -38,8 +39,21 @@ require_login($course->id); + if (!isteacher($course->id)) { - error("Only teachers can see this page"); + if (!$quiz->review) { + error(get_string("noreview", "quiz")); + } + if (time() < $quiz->timeclose) { + error(get_string("noreviewuntil", "quiz", userdate($quiz->timeclose))); + } + if (empty($review)) { + error("You are using this script wrongly."); + } + } + + if (!empty($review)) { + $attempt = $review; } add_to_log($course->id, "quiz", "report", "report.php?id=$cm->id", "$quiz->id"); @@ -68,12 +82,18 @@ print_heading($quiz->name); - if ($attempt) { // Show a particular attempt + if (!empty($attempt)) { // Show a particular attempt if (! $attempt = get_record("quiz_attempts", "id", $attempt)) { error("No such attempt ID exists"); } + if (!isteacher($course->id)) { + if ($attempt->userid != $USER->id) { + error("This is not your attempt!"); + } + } + if (! $questions = quiz_get_attempt_responses($attempt)) { error("Could not reconstruct quiz results for attempt $attempt->id!"); } @@ -95,18 +115,26 @@ $table->data[] = array("$strgrade:", "$result->grade/$quiz->grade"); print_table($table); - print_continue("report.php?q=$quiz->id"); + if (empty($review)) { + print_continue("report.php?q=$quiz->id"); + } else { + print_continue("view.php?q=$quiz->id"); + } $quiz->feedback = true; $quiz->correctanswers = true; quiz_print_quiz_questions($quiz, $result); - print_continue("report.php?q=$quiz->id"); + if (empty($review)) { + print_continue("report.php?q=$quiz->id"); + } else { + print_continue("view.php?q=$quiz->id"); + } print_footer($course); exit; } - if ($regrade) { + if (!empty($regrade)) { if (!$attempts = get_records("quiz_attempts", "quiz", $quiz->id)) { print_header(get_string("noattempts", "quiz")); print_continue("report.php?id=$cm->id"); diff --git a/mod/quiz/view.php b/mod/quiz/view.php index cd8c68132ba..7ecb933c5d0 100644 --- a/mod/quiz/view.php +++ b/mod/quiz/view.php @@ -96,6 +96,8 @@ $strgrade = get_string("grade"); $strbestgrade = get_string("bestgrade", "quiz"); + $mygrade = quiz_get_best_grade($quiz->id, $USER->id); + if ($numattempts) { $table->head = array($strattempt, $strtimetaken, $strtimecompleted, "$strgrade / $quiz->grade"); $table->align = array("CENTER", "CENTER", "LEFT", "RIGHT"); @@ -106,10 +108,17 @@ } else { $timetaken = "-"; } + $attemptgrade = format_float(($attempt->sumgrades/$quiz->sumgrades)*$quiz->grade); + if ($attemptgrade == $mygrade) { + $attemptgrade = "$attemptgrade"; + } + if (!$available and $quiz->review) { + $attemptgrade = "id&review=$attempt->id\">$attemptgrade"; + } $table->data[] = array( $attempt->attempt, format_time($attempt->timefinish - $attempt->timestart), userdate($attempt->timefinish), - format_float(($attempt->sumgrades/$quiz->sumgrades)*$quiz->grade) ); + $attemptgrade); } print_table($table); } @@ -122,7 +131,6 @@ echo "

".get_string("quizclosed", "quiz", userdate($quiz->timeclose)); } - $mygrade = quiz_get_best_grade($quiz->id, $USER->id); if (!$quiz->questions) { print_heading(get_string("noquestions", "quiz"));