a8c9a97250f11ea03521668c459dd7db9a2c9b63
[moodle.git] / question / format / xhtml / format.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  * XHTML question exporter.
19  *
20  * @package    qformat
21  * @subpackage xhtml
22  * @copyright  2005 Howard Miller
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
27 defined('MOODLE_INTERNAL') || die();
30 /**
31  * XHTML question exporter.
32  *
33  * Exports questions as static HTML.
34  *
35  * @copyright  2005 Howard Miller
36  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37  */
38 class qformat_xhtml extends qformat_default {
40     public function provide_export() {
41         return true;
42     }
44     protected function repchar($text) {
45         return $text;
46     }
48     protected function writequestion($question) {
49         global $OUTPUT;
50         // turns question into string
51         // question reflects database fields for general question and specific to type
53         // if a category switch, just ignore
54         if ($question->qtype=='category') {
55             return '';
56         }
58         // initial string;
59         $expout = "";
60         $id = $question->id;
62         // add comment and div tags
63         $expout .= "<!-- question: $id  name: $question->name -->\n";
64         $expout .= "<div class=\"question\">\n";
66         // add header
67         $expout .= "<h3>$question->name</h3>\n";
69         // Format and add the question text
70         $expout .= '<p class="questiontext">' . format_text($question->questiontext,
71                 $question->questiontextformat) . "</p>\n";
73         // selection depends on question type
74         switch($question->qtype) {
75         case 'truefalse':
76             $st_true = get_string('true', 'qtype_truefalse');
77             $st_false = get_string('false', 'qtype_truefalse');
78             $expout .= "<ul class=\"truefalse\">\n";
79             $expout .= "  <li><input name=\"quest_$id\" type=\"radio\" value=\"$st_true\" />$st_true</li>\n";
80             $expout .= "  <li><input name=\"quest_$id\" type=\"radio\" value=\"$st_false\" />$st_false</li>\n";
81             $expout .= "</ul>\n";
82             break;
83         case 'multichoice':
84             $expout .= "<ul class=\"multichoice\">\n";
85             foreach($question->options->answers as $answer) {
86                 $ans_text = $this->repchar( $answer->answer );
87                 if ($question->options->single) {
88                     $expout .= "  <li><input name=\"quest_$id\" type=\"radio\" value=\"" . s($ans_text) . "\" />$ans_text</li>\n";
89                 }
90                 else {
91                     $expout .= "  <li><input name=\"quest_$id\" type=\"checkbox\" value=\"" . s($ans_text) . "\" />$ans_text</li>\n";
92                 }
93             }
94             $expout .= "</ul>\n";
95             break;
96         case SHORTANSWER:
97             $expout .= html_writer::start_tag('ul', array('class' => 'shortanswer'));
98             $expout .= html_writer::start_tag('li');
99             $expout .= html_writer::label(get_string('answer'), 'quest_'.$id, false, array('class' => 'accesshide'));
100             $expout .= html_writer::empty_tag('input', array('id' => "quest_$id", 'name' => "quest_$id", 'type' => 'text'));
101             $expout .= html_writer::end_tag('li');
102             $expout .= html_writer::end_tag('ul');
103             break;
104         case NUMERICAL:
105             $expout .= html_writer::start_tag('ul', array('class' => 'numerical'));
106             $expout .= html_writer::start_tag('li');
107             $expout .= html_writer::label(get_string('answer'), 'quest_'.$id, false, array('class' => 'accesshide'));
108             $expout .= html_writer::empty_tag('input', array('id' => "quest_$id", 'name' => "quest_$id", 'type' => 'text'));
109             $expout .= html_writer::end_tag('li');
110             $expout .= html_writer::end_tag('ul');
111             break;
112         case MATCH:
113             $expout .= html_writer::start_tag('ul', array('class' => 'match'));
115             // build answer list
116             $ans_list = array();
117             foreach($question->options->subquestions as $subquestion) {
118                $ans_list[] = $this->repchar( $subquestion->answertext );
119             }
120             shuffle( $ans_list ); // random display order
122             // Build select options.
123             $selectoptions = array();
124             foreach($ans_list as $ans) {
125                 $selectoptions[s($ans)] = s($ans);
126             }
128             // display
129             $option = 0;
130             foreach($question->options->subquestions as $subquestion) {
131                 // build drop down for answers
132                 $quest_text = $this->repchar( $subquestion->questiontext );
133                 $dropdown = html_writer::label(get_string('answer', 'qtype_match', $option+1), 'quest_'.$id.'_'.$option, false, array('class' => 'accesshide'));
134                 $dropdown .= html_writer::select($selectoptions, "quest_{$id}_{$option}", '', false, array('id' => "quest_{$id}_{$option}"));
135                 $expout .= html_writer::tag('li', $quest_text);
136                 $expout .= $dropdown;
137                 $option++;
138             }
139             $expout .= html_writer::end_tag('ul');
140             break;
141         case 'description':
142             break;
143         case 'multichoice':
144             $expout .= "<!-- CLOZE type is not supported  -->\n";
145             break;
146         default:
147             echo $OUTPUT->notification("No handler for qtype $question->qtype for GIFT export" );
148         }
149         // close off div
150         $expout .= "</div>\n\n\n";
151         return $expout;
152     }
155     protected function presave_process($content) {
156         // override method to allow us to add xhtml headers and footers
158         global $CFG;
160         // get css bit
161         $css_lines = file( "$CFG->dirroot/question/format/xhtml/xhtml.css" );
162         $css = implode( ' ',$css_lines );
164         $xp =  "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n";
165         $xp .= "  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
166         $xp .= "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
167         $xp .= "<head>\n";
168         $xp .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n";
169         $xp .= "<title>Moodle Quiz XHTML Export</title>\n";
170         $xp .= $css;
171         $xp .= "</head>\n";
172         $xp .= "<body>\n";
173         $xp .= "<form action=\"...REPLACE ME...\" method=\"post\">\n\n";
174         $xp .= $content;
175         $xp .= "<p class=\"submit\">\n";
176         $xp .= "  <input type=\"submit\" />\n";
177         $xp .= "</p>\n";
178         $xp .= "</form>\n";
179         $xp .= "</body>\n";
180         $xp .= "</html>\n";
182         return $xp;
183     }
185     public function export_file_extension() {
186         return '.html';
187     }