quiz)) { error("The quiz with id $attempt->quiz belonging to attempt $attempt is missing"); } if (! $course = get_record("course", "id", $quiz->course)) { error("The course with id $quiz->course that the quiz with id $quiz->id belongs to is missing"); } if (! $cm = get_coursemodule_from_instance("quiz", $quiz->id, $course->id)) { error("The course module for the quiz with id $quiz->id is missing"); } $grade = quiz_rescale_grade($attempt->sumgrades, $quiz); $feedback = quiz_feedback_for_grade($grade, $attempt->quiz); if (!count_records('question_sessions', 'attemptid', $attempt->uniqueid)) { // this question has not yet been upgraded to the new model quiz_upgrade_states($attempt); } require_login($course->id, false, $cm); $context = get_context_instance(CONTEXT_MODULE, $cm->id); $coursecontext = get_context_instance(CONTEXT_COURSE, $cm->course); $isteacher = has_capability('mod/quiz:preview', get_context_instance(CONTEXT_MODULE, $cm->id)); $options = quiz_get_reviewoptions($quiz, $attempt, $context); $popup = $isteacher ? 0 : $quiz->popup; // Controls whether this is shown in a javascript-protected window. $timenow = time(); if (!has_capability('mod/quiz:viewreports', $context)) { // Can't review during the attempt. if (!$attempt->timefinish) { redirect('attempt.php?q=' . $quiz->id); } // Can't review other student's attempts. if ($attempt->userid != $USER->id) { error("This is not your attempt!", 'view.php?q=' . $quiz->id); } // Can't review if Student's may review ... Responses is turned on. if (!$options->responses) { if ($options->quizstate == QUIZ_STATE_IMMEDIATELY) { $message = ''; } else if ($options->quizstate == QUIZ_STATE_OPEN && $quiz->timeclose && ($quiz->review & QUIZ_REVIEW_CLOSED & QUIZ_REVIEW_RESPONSES)) { $message = get_string('noreviewuntil', 'quiz', userdate($quiz->timeclose)); } else { $message = get_string('noreview', 'quiz'); } if (empty($popup)) { redirect('view.php?q=' . $quiz->id, $message); } else { ?>id, "quiz", "review", "review.php?id=$cm->id&attempt=$attempt->id", "$quiz->id", "$cm->id"); /// Load all the questions and states needed by this script // load the questions needed by page $pagelist = $showall ? quiz_questions_in_quiz($attempt->layout) : quiz_questions_on_page($attempt->layout, $page); $sql = "SELECT q.*, i.grade AS maxgrade, i.id AS instance". " FROM {$CFG->prefix}question q,". " {$CFG->prefix}quiz_question_instances i". " WHERE i.quiz = '$quiz->id' AND q.id = i.question". " AND q.id IN ($pagelist)"; if (!$questions = get_records_sql($sql)) { error('No questions found'); } // Load the question type specific information if (!get_question_options($questions)) { error('Could not load question options'); } // Restore the question sessions to their most recent states // creating new sessions where required if (!$states = get_question_states($questions, $quiz, $attempt)) { error('Could not restore question sessions'); } /// Print the page header $strquizzes = get_string("modulenameplural", "quiz"); $strreview = get_string("review", "quiz"); $strscore = get_string("score", "quiz"); $strgrade = get_string("grade"); $strbestgrade = get_string("bestgrade", "quiz"); $strtimetaken = get_string("timetaken", "quiz"); $strtimecompleted = get_string("completedon", "quiz"); $stroverdue = get_string("overdue", "quiz"); $pagequestions = explode(',', $pagelist); $headtags = get_html_head_contributions($pagequestions, $questions, $states); if (!empty($popup)) { define('MESSAGE_WINDOW', true); // This prevents the message window coming up print_header($course->shortname.': '.format_string($quiz->name), '', '', '', $headtags, false, '', '', false, ''); /// Include Javascript protection for this page include('protect_js.php'); } else { $strupdatemodule = has_capability('moodle/course:manageactivities', $coursecontext) ? update_module_button($cm->id, $course->id, get_string('modulename', 'quiz')) : ""; $navlinks = array(); $navlinks[] = array('name' => $strquizzes, 'link' => "index.php?id=$course->id", 'type' => 'activity'); $navlinks[] = array('name' => format_string($quiz->name), 'link' => "view.php?id=$cm->id", 'type' => 'activityinstance'); $navlinks[] = array('name' => $strreview, 'link' => '', 'type' => 'title'); $navigation = build_navigation($navlinks); print_header_simple(format_string($quiz->name), "", $navigation, "", $headtags, true, $strupdatemodule); } echo '
'; // for overlib /// Print heading and tabs if this is part of a preview if (has_capability('mod/quiz:preview', $context)) { if ($attempt->userid == $USER->id) { // this is the report on a preview $currenttab = 'preview'; } else { $currenttab = 'reports'; $mode = ''; } include('tabs.php'); } else { print_heading(format_string($quiz->name)); } if ($isteacher and $attempt->userid == $USER->id) { // the teacher is at the end of a preview. Print button to start new preview unset($buttonoptions); $buttonoptions['q'] = $quiz->id; $buttonoptions['forcenew'] = true; echo '', $picture, ' | ', fullname($student, true), ' |
---|---|
', get_string('attempts', 'quiz'), ' | ', trim($attemptlist, ' ,'), ' |
', get_string('startedon', 'quiz'), ' | ', userdate($attempt->timestart), ' |
', $strtimecompleted, ' | ', userdate($attempt->timefinish), ' |
', $strtimetaken, ' | ', $timetaken, ' |
', $stroverdue, ' | ',$overtime, ' |
', $strscore, ' | ', "$rawscore/$quiz->sumgrades ($percentage%)", ' |
', $strgrade, ' | ', get_string('outof', 'quiz', $a), ' |
', get_string('feedback', 'quiz'), ' | ', $feedback, ' |