a5a0c094d83aed5e2c5a0299bf6d0c4138ba2cc8
[moodle.git] / mod / quiz / report / responses / responses_table.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * This file defines the quiz responses table.
19  *
20  * @package   quiz_responses
21  * @copyright 2008 Jean-Michel Vedrine
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
26 defined('MOODLE_INTERNAL') || die();
28 require_once($CFG->dirroot . '/mod/quiz/report/attemptsreport_table.php');
31 /**
32  * This is a table subclass for displaying the quiz responses report.
33  *
34  * @copyright 2008 Jean-Michel Vedrine
35  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class quiz_responses_table extends quiz_attempts_report_table {
39     /**
40      * Constructor
41      * @param object $quiz
42      * @param context $context
43      * @param string $qmsubselect
44      * @param quiz_responses_options $options
45      * @param array $groupstudents
46      * @param array $students
47      * @param array $questions
48      * @param moodle_url $reporturl
49      */
50     public function __construct($quiz, $context, $qmsubselect, quiz_responses_options $options,
51             $groupstudents, $students, $questions, $reporturl) {
52         parent::__construct('mod-quiz-report-responses-report', $quiz, $context,
53                 $qmsubselect, $options, $groupstudents, $students, $questions, $reporturl);
54     }
56     public function build_table() {
57         if (!$this->rawdata) {
58             return;
59         }
61         $this->strtimeformat = str_replace(',', ' ', get_string('strftimedatetime'));
62         parent::build_table();
63     }
65     public function col_sumgrades($attempt) {
66         if ($attempt->state != quiz_attempt::FINISHED) {
67             return '-';
68         }
70         $grade = quiz_rescale_grade($attempt->sumgrades, $this->quiz);
71         if ($this->is_downloading()) {
72             return $grade;
73         }
75         $gradehtml = '<a href="review.php?q=' . $this->quiz->id . '&amp;attempt=' .
76                 $attempt->attempt . '">' . $grade . '</a>';
77         return $gradehtml;
78     }
80     public function data_col($slot, $field, $attempt) {
81         global $CFG;
83         if ($attempt->usageid == 0) {
84             return '-';
85         }
87         $question = $this->questions[$slot];
88         if (!isset($this->lateststeps[$attempt->usageid][$slot])) {
89             return '-';
90         }
92         $stepdata = $this->lateststeps[$attempt->usageid][$slot];
94         if (is_null($stepdata->$field)) {
95             $summary = '-';
96         } else {
97             $summary = trim($stepdata->$field);
98         }
100         if ($this->is_downloading() || $field != 'responsesummary') {
101             return $summary;
102         }
104         return $this->make_review_link($summary, $attempt, $slot);
105     }
107     public function other_cols($colname, $attempt) {
108         if (preg_match('/^question(\d+)$/', $colname, $matches)) {
109             return $this->data_col($matches[1], 'questionsummary', $attempt);
111         } else if (preg_match('/^response(\d+)$/', $colname, $matches)) {
112             return $this->data_col($matches[1], 'responsesummary', $attempt);
114         } else if (preg_match('/^right(\d+)$/', $colname, $matches)) {
115             return $this->data_col($matches[1], 'rightanswer', $attempt);
117         } else {
118             return null;
119         }
120     }
122     protected function requires_latest_steps_loaded() {
123         return true;
124     }
126     protected function is_latest_step_column($column) {
127         if (preg_match('/^(?:question|response|right)([0-9]+)/', $column, $matches)) {
128             return $matches[1];
129         }
130         return false;
131     }
133     /**
134      * Get any fields that might be needed when sorting on date for a particular slot.
135      * @param int $slot the slot for the column we want.
136      * @param string $alias the table alias for latest state information relating to that slot.
137      */
138     protected function get_required_latest_state_fields($slot, $alias) {
139         return "$alias.questionsummary AS question$slot,
140                 $alias.rightanswer AS right$slot,
141                 $alias.responsesummary AS response$slot";
142     }