moodle/mod/quiz/reviewquestion.php
tjhunt cd06115fa7 Convert mod/quiz/view.php to roles, and further tidy up the code flow in there. This touches other files because I had to change a function in locallib that had an $isteacher parameter.
I have not converted the rest of the quiz, and I don't intend to. I am hoping Moodle.com will do it.

I hope this does not introduce any bugs, but view.php is so complicate (at least it is less complicated than it was) and the quiz has so many options, that it is hard to be sure. This needs lots of testing before 1.7 is released.
2006-08-25 16:03:54 +00:00

153 lines
6.4 KiB
PHP

<?php // $Id$
/**
* This page prints a review of a particular question attempt
*
* @version $Id$
* @author Martin Dougiamas and many others. This has recently been completely
* rewritten by Alex Smith, Julian Sedding and Gustav Delius as part of
* the Serving Mathematics project
* {@link http://maths.york.ac.uk/serving_maths}
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package quiz
*/
require_once('../../config.php');
require_once('locallib.php');
// Either stateid or (attemptid AND questionid) must be given
$stateid = optional_param('state', 0, PARAM_INT); // state id
$attemptid = optional_param('attempt', 0, PARAM_INT); // attempt id
$questionid = optional_param('question', 0, PARAM_INT); // attempt id
$number = optional_param('number', 0, PARAM_INT); // question number
if ($stateid) {
if (! $state = get_record('question_states', 'id', $stateid)) {
error('Invalid state id');
}
if (! $attempt = get_record('quiz_attempts', 'uniqueid', $state->attempt)) {
error('No such attempt ID exists');
}
} elseif ($attemptid) {
if (! $attempt = get_record('quiz_attempts', 'id', $attemptid)) {
error('No such attempt ID exists');
}
if (! $neweststateid = get_field('question_sessions', 'newest', 'attemptid', $attempt->uniqueid, 'questionid', $questionid)) {
// newest_state not set, probably because this is an old attempt from the old quiz module code
if (! $state = get_record('question_states', 'question', $questionid, 'attempt', $attempt->uniqueid)) {
error('Invalid question id');
}
} else {
if (! $state = get_record('question_states', 'id', $neweststateid)) {
error('Invalid state id');
}
}
} else {
error('Parameter missing');
}
if (! $question = get_record('question', 'id', $state->question)) {
error('Question for this state is missing');
}
if (! $quiz = get_record('quiz', 'id', $attempt->quiz)) {
error('Course module is incorrect');
}
if (! $course = get_record('course', 'id', $quiz->course)) {
error('Course is misconfigured');
}
if (! $cm = get_coursemodule_from_instance('quiz', $quiz->id, $course->id)) {
error('Course Module ID was incorrect');
}
require_login($course->id, false, $cm);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
if (!has_capability('mod/quiz:viewreports', $context)) {
if (!$attempt->timefinish) {
redirect('attempt.php?q='.$quiz->id);
}
// If not even responses are to be shown in review then we
// don't allow any review
if (!($quiz->review & QUIZ_REVIEW_RESPONSES)) {
error(get_string("noreview", "quiz"));
}
if ((time() - $attempt->timefinish) > 120) { // always allow review right after attempt
if ((!$quiz->timeclose or time() < $quiz->timeclose) and !($quiz->review & QUIZ_REVIEW_OPEN)) {
error(get_string("noreviewuntil", "quiz", userdate($quiz->timeclose)));
}
if ($quiz->timeclose and time() >= $quiz->timeclose and !($quiz->review & QUIZ_REVIEW_CLOSED)) {
error(get_string("noreview", "quiz"));
}
}
if ($attempt->userid != $USER->id) {
error('This is not your attempt!');
}
}
//add_to_log($course->id, 'quiz', 'review', "review.php?id=$cm->id&amp;attempt=$attempt->id", "$quiz->id", "$cm->id");
/// Print the page header
$strquizzes = get_string('modulenameplural', 'quiz');
$strreviewquestion = get_string('reviewquestion', 'quiz');
print_header();
echo '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:1000;"></div>'; // for overlib
/// Print heading
print_heading(format_string($question->name));
$question->maxgrade = get_field('quiz_question_instances', 'grade', 'quiz', $quiz->id, 'question', $question->id);
// Some of the questions code is optimised to work with several questions
// at once so it wants the question to be in an array.
$key = $question->id;
$questions[$key] = &$question;
// Add additional questiontype specific information to the question objects.
if (!get_question_options($questions)) {
error("Unable to load questiontype specific question information");
}
$session = get_record('question_sessions', 'attemptid', $attempt->uniqueid, 'questionid', $question->id);
$state->sumpenalty = $session->sumpenalty;
$state->manualcomment = $session->manualcomment;
restore_question_state($question, $state);
$state->last_graded = $state;
$options = quiz_get_reviewoptions($quiz, $attempt, $context);
$options->validation = ($state->event == QUESTION_EVENTVALIDATE);
$options->history = (has_capability('mod/quiz:viewreports', $context) and !$attempt->preview) ? 'all' : 'graded';
/// Print infobox
$table->align = array("right", "left");
if ($attempt->userid <> $USER->id) {
// Print user picture and name
$student = get_record('user', 'id', $attempt->userid);
$picture = print_user_picture($student->id, $course->id, $student->picture, false, true);
$table->data[] = array($picture, fullname($student, true));
}
// print quiz name
$table->data[] = array(get_string('modulename', 'quiz').':', format_string($quiz->name));
if (has_capability('mod/quiz:viewreports', $context) and count($attempts = get_records_select('quiz_attempts', "quiz = '$quiz->id' AND userid = '$attempt->userid'", 'attempt ASC')) > 1) {
// print list of attempts
$attemptlist = '';
foreach ($attempts as $at) {
$attemptlist .= ($at->id == $attempt->id)
? '<b>'.$at->attempt.'</b>, '
: '<a href="reviewquestion.php?attempt='.$at->id.'&amp;question='.$question->id.'&amp;number='.$number.'">'.$at->attempt.'</a>, ';
}
$table->data[] = array(get_string('attempts', 'quiz').':', trim($attemptlist, ' ,'));
}
if ($state->timestamp) {
// print time stamp
$table->data[] = array(get_string("completedon", "quiz").':', userdate($state->timestamp));
}
// Print info box unless it is empty
if ($table->data) {
print_table($table);
}
print_question($question, $state, $number, $quiz, $options);
print_footer();
?>