Merge branch '42805-26' of git://github.com/samhemelryk/moodle
[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() && $this->is_downloading() != 'xhtml') {
101             return $summary;
102         }
103         $summary = s($summary);
105         if ($this->is_downloading() || $field != 'responsesummary') {
106             return $summary;
107         }
109         return $this->make_review_link($summary, $attempt, $slot);
110     }
112     public function other_cols($colname, $attempt) {
113         if (preg_match('/^question(\d+)$/', $colname, $matches)) {
114             return $this->data_col($matches[1], 'questionsummary', $attempt);
116         } else if (preg_match('/^response(\d+)$/', $colname, $matches)) {
117             return $this->data_col($matches[1], 'responsesummary', $attempt);
119         } else if (preg_match('/^right(\d+)$/', $colname, $matches)) {
120             return $this->data_col($matches[1], 'rightanswer', $attempt);
122         } else {
123             return null;
124         }
125     }
127     protected function requires_latest_steps_loaded() {
128         return true;
129     }
131     protected function is_latest_step_column($column) {
132         if (preg_match('/^(?:question|response|right)([0-9]+)/', $column, $matches)) {
133             return $matches[1];
134         }
135         return false;
136     }
138     /**
139      * Get any fields that might be needed when sorting on date for a particular slot.
140      * @param int $slot the slot for the column we want.
141      * @param string $alias the table alias for latest state information relating to that slot.
142      */
143     protected function get_required_latest_state_fields($slot, $alias) {
144         return "$alias.questionsummary AS question$slot,
145                 $alias.rightanswer AS right$slot,
146                 $alias.responsesummary AS response$slot";
147     }