MDL-20636 Can now display the attachments to an essay question that has attachments.
[moodle.git] / question / type / essay / renderer.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Essay question renderer class.
20  *
21  * @package    qtype
22  * @subpackage essay
23  * @copyright  2009 The Open University
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
28 defined('MOODLE_INTERNAL') || die();
31 /**
32  * Generates the output for essay questions.
33  *
34  * @copyright  2009 The Open University
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class qtype_essay_renderer extends qtype_renderer {
38     public function formulation_and_controls(question_attempt $qa,
39             question_display_options $options) {
41         $question = $qa->get_question();
42         $responseoutput = $question->get_format_renderer($this->page);
44         // Answer field.
45         $inputname = $qa->get_qt_field_name('answer');
46         $response = $qa->get_last_qt_var('answer', '');
47         if (empty($options->readonly)) {
48             $answer = $responseoutput->response_area_input($inputname,
49                     $response, $question->responsefieldlines);
51         } else {
52             $answer =$responseoutput->response_area_read_only($inputname,
53                     $response, $question->responsefieldlines);
54         }
56         $files = '';
57         if (empty($options->readonly)) {
58             if ($question->attachments == 1) {
59                 $files = $this->filepicker_input($qa, $options);
60             } else if ($question->attachments != 0) {
61                 $files = $this->filemanager_input($qa, $options);
62             }
64         } else if ($question->attachments != 0) {
65             $files = $this->files_read_only($qa, $options);
66         }
68         $result = '';
69         $result .= html_writer::tag('div', $question->format_questiontext($qa),
70                 array('class' => 'qtext'));
72         $result .= html_writer::start_tag('div', array('class' => 'ablock'));
73         $result .= html_writer::tag('div', $answer, array('class' => 'answer'));
74         $result .= html_writer::tag('div', $files, array('class' => 'attachments'));
75         $result .= html_writer::end_tag('div');
77         return $result;
78     }
80     /**
81      * Displays any attached files when the question is in read-only mode.
82      */
83     public function files_read_only(question_attempt $qa, question_display_options $options) {
84         $files = $qa->get_last_qt_files('attachments', $options->contextid);
85         $output = array();
87         foreach ($files as $file) {
88             $mimetype = $file->get_mimetype();
89             $output[] = html_writer::tag('p', html_writer::link($qa->get_response_file_url($file),
90                     $this->output->pix_icon(file_mimetype_icon($mimetype), $mimetype,
91                     'moodle', array('class' => 'icon')) . ' ' . s($file->get_filename())));
92         }
93         return implode($output);
94     }
96     /**
97      * Displays the input control for when the student should upload a single file.
98      */
99     public function filepicker_input(question_attempt $qa, question_display_options $options) {
100         return '';
101     }
103     /**
104      * Displays the input control for when the student should upload a number of files.
105      */
106     public function filemanager_input(question_attempt $qa, question_display_options $options) {
107         return '';
108     }
112 /**
113  * A base class to abstract out the differences between different type of
114  * response format.
115  *
116  * @copyright  2011 The Open University
117  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
118  */
119 abstract class qtype_essay_format_renderer_base extends plugin_renderer_base {
120     /**
121      * Render the students respone when the question is in read-only mode.
122      * @param string $inputname the field name to use for this input.
123      * @param string $response the student's current response.
124      * @param int $lines approximate size of input box to display.
125      */
126     public abstract function response_area_read_only($inputname, $response, $lines);
128     /**
129      * Render the students respone when the question is in read-only mode.
130      * @param string $inputname the field name to use for this input.
131      * @param string $response the student's current response.
132      * @param int $lines approximate size of input box to display.
133      */
134     public abstract function response_area_input($inputname, $response, $lines);
138 /**
139  * An essay format renderer for essays where the student should use the HTML
140  * editor without the file picker.
141  *
142  * @copyright  2011 The Open University
143  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
144  */
145 class qtype_essay_format_editor_renderer extends plugin_renderer_base {
146     public function response_area_read_only($inputname, $response, $lines) {
147         $formatoptions = new stdClass();
148         $formatoptions->para = false;
149         return html_writer::tag('div', format_text($response, FORMAT_HTML, $formatoptions),
150                 array('class' => 'qtype_essay_editor qtype_essay_response'));
151     }
153     public function response_area_input($inputname, $response, $lines) {
154         return print_textarea(can_use_html_editor(), 18, 80, 630, 400, $inputname, $response, 0, true);
155     }
159 /**
160  * An essay format renderer for essays where the student should use the HTML
161  * editor with the file picker.
162  *
163  * @copyright  2011 The Open University
164  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
165  */
166 class qtype_essay_format_editorfilepicker_renderer extends plugin_renderer_base {
167     public function response_area_read_only($inputname, $response, $lines) {
168         return 'Not yet implemented.';
169     }
171     public function response_area_input($inputname, $response, $lines) {
172         return 'Not yet implemented.';
173     }
177 /**
178  * An essay format renderer for essays where the student should use a plain
179  * input box, but with a normal, proportional font.
180  *
181  * @copyright  2011 The Open University
182  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
183  */
184 class qtype_essay_format_plain_renderer extends plugin_renderer_base {
185     /**
186      * @return string the HTML for the textarea.
187      */
188     protected function textarea($response, $lines, $attributes) {
189         $attributes['class'] = $this->class_name() . ' qtype_essay_response';
190         $attributes['rows'] = $lines;
191         return html_writer::tag('textarea', s($response), $attributes);
192     }
194     protected function class_name() {
195         return 'qtype_essay_plain';
196     }
198     public function response_area_read_only($inputname, $response, $lines) {
199         return $this->textarea($response, $lines, array('readonly' => 'readonly'));
200     }
202     public function response_area_input($inputname, $response, $lines) {
203         return $this->textarea($response, $lines, array('name' => $inputname));
204     }
208 /**
209  * An essay format renderer for essays where the student should use a plain
210  * input box with a monospaced font. You might use this, for example, for a
211  * question where the students should type computer code.
212  *
213  * @copyright  2011 The Open University
214  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
215  */
216 class qtype_essay_format_monospaced_renderer extends qtype_essay_format_plain_renderer {
217     protected function class_name() {
218         return 'qtype_essay_monospaced';
219     }