31 public function toXML($a_include_header =
true, $a_include_binary =
true, $a_shuffle =
false, $test_output =
false, $force_image_references =
false): string
34 $ilias = $DIC[
'ilias'];
38 $a_xml_writer->xmlHeader();
39 $a_xml_writer->xmlStartTag(
"questestinterop");
41 "ident" =>
"il_" .
IL_INST_ID .
"_qst_" . $this->
object->getId(),
42 "title" => $this->
object->getTitle(),
43 "maxattempts" => $this->
object->getNrOfTries()
45 $a_xml_writer->xmlStartTag(
"item", $attrs);
47 $a_xml_writer->xmlElement(
"qticomment",
null, $this->
object->getComment());
48 $a_xml_writer->xmlStartTag(
"itemmetadata");
49 $a_xml_writer->xmlStartTag(
"qtimetadata");
50 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
51 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"ILIAS_VERSION");
52 $a_xml_writer->xmlElement(
"fieldentry",
null, $ilias->getSetting(
"ilias_version"));
53 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
54 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
55 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"QUESTIONTYPE");
56 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getQuestionType());
57 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
58 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
59 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"AUTHOR");
60 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getAuthor());
61 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
67 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
68 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"answer_type");
69 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getAnswerType());
70 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
72 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
73 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"thumb_size");
74 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getThumbSize());
75 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
77 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
78 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"option_label_setting");
79 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getOptionLabel());
80 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
81 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
82 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"custom_true_option_label");
83 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getCustomTrueOptionLabel());
84 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
85 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
86 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"custom_false_option_label");
87 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getCustomFalseOptionLabel());
88 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
90 $a_xml_writer->xmlStartTag(
"qtimetadatafield");
91 $a_xml_writer->xmlElement(
"fieldlabel",
null,
"feedback_setting");
92 $a_xml_writer->xmlElement(
"fieldentry",
null, $this->
object->getSpecificFeedbackSetting());
93 $a_xml_writer->xmlEndTag(
"qtimetadatafield");
95 $a_xml_writer->xmlEndTag(
"qtimetadata");
96 $a_xml_writer->xmlEndTag(
"itemmetadata");
100 "label" => $this->
object->getTitle()
102 $a_xml_writer->xmlStartTag(
"presentation", $attrs);
104 $a_xml_writer->xmlStartTag(
"flow");
110 "rcardinality" =>
"Multiple" 112 $a_xml_writer->xmlStartTag(
"response_lid", $attrs);
116 if ($this->
object->isShuffleAnswersEnabled()) {
125 $a_xml_writer->xmlStartTag(
"render_choice", $attrs);
128 $answers = $this->
object->getAnswers();
129 $akeys = array_keys($answers);
130 foreach ($akeys as $index) {
131 $answer = $this->
object->getAnswer($index);
133 $a_xml_writer->xmlStartTag(
'response_label', [
'ident' => $answer->getPosition()]);
135 $image_file = $answer->getImageFile() ??
'';
136 if ($image_file !==
'') {
137 $this->
addQTIMaterial($a_xml_writer, $answer->getAnswertext(),
false,
false);
138 $imagetype =
"image/jpeg";
139 if (preg_match(
"/.*\.(png|gif)$/", $image_file, $matches)) {
140 $imagetype =
"image/" . $matches[1];
142 if ($force_image_references) {
144 "imagtype" => $imagetype,
145 "label" => $image_file,
146 "uri" => $answer->getImageWebPath()
148 $a_xml_writer->xmlElement(
"matimage", $attrs);
150 $imagepath = $answer->getImageFsPath();
151 $fh = @fopen($imagepath,
"rb");
153 $imagefile = fread($fh, filesize($imagepath));
155 $base64 = base64_encode($imagefile);
157 "imagtype" => $imagetype,
158 "label" => $image_file,
159 "embedded" =>
"base64" 161 $a_xml_writer->xmlElement(
"matimage", $attrs, $base64,
false,
false);
164 $a_xml_writer->xmlEndTag(
"material");
168 $a_xml_writer->xmlEndTag(
"response_label");
170 $a_xml_writer->xmlEndTag(
"render_choice");
171 $a_xml_writer->xmlEndTag(
"response_lid");
172 $a_xml_writer->xmlEndTag(
"flow");
173 $a_xml_writer->xmlEndTag(
"presentation");
177 $a_xml_writer->xmlStartTag(
'resprocessing');
179 $a_xml_writer->xmlStartTag(
'outcomes');
180 $a_xml_writer->xmlElement(
'decvar', [
181 'varname' =>
'SCORE',
'vartype' =>
'Decimal',
'defaultval' =>
'0',
184 $a_xml_writer->xmlEndTag(
'outcomes');
187 foreach ($answers as $answer) {
188 $a_xml_writer->xmlStartTag(
'respcondition', [
'continue' =>
'Yes']);
190 $a_xml_writer->xmlStartTag(
'conditionvar');
191 $a_xml_writer->xmlElement(
'varequal', [
'respident' => $answer->getPosition()], $answer->getCorrectness());
192 $a_xml_writer->xmlEndTag(
'conditionvar');
194 $a_xml_writer->xmlElement(
'displayfeedback', [
195 'feedbacktype' =>
'Response',
'linkrefid' =>
"response_{$answer->getPosition()}" 198 $a_xml_writer->xmlEndTag(
'respcondition');
201 $feedback_allcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
206 $a_xml_writer->xmlStartTag(
'respcondition', [
'continue' =>
'Yes']);
208 $a_xml_writer->xmlStartTag(
'conditionvar');
209 $a_xml_writer->xmlStartTag(
'and');
210 foreach ($answers as $answer) {
211 $a_xml_writer->xmlElement(
'varequal', [
'respident' => $answer->getPosition()], $answer->getCorrectness());
213 $a_xml_writer->xmlEndTag(
'and');
214 $a_xml_writer->xmlEndTag(
'conditionvar');
216 $a_xml_writer->xmlElement(
'setvar', [
'action' =>
'Add'], $this->
object->getPoints());
218 if (strlen($feedback_allcorrect)) {
219 $a_xml_writer->xmlElement(
'displayfeedback', [
'feedbacktype' =>
'Response',
'linkrefid' =>
'response_allcorrect']);
222 $a_xml_writer->xmlEndTag(
'respcondition');
224 $feedback_onenotcorrect = $this->
object->feedbackOBJ->getGenericFeedbackExportPresentation(
229 $a_xml_writer->xmlStartTag(
'respcondition', [
'continue' =>
'Yes']);
231 $a_xml_writer->xmlStartTag(
'conditionvar');
232 $a_xml_writer->xmlStartTag(
'or');
233 foreach ($answers as $answer) {
234 $a_xml_writer->xmlStartTag(
'not');
235 $a_xml_writer->xmlElement(
'varequal', [
'respident' => $answer->getPosition()], $answer->getCorrectness());
236 $a_xml_writer->xmlEndTag(
'not');
238 $a_xml_writer->xmlEndTag(
'or');
239 $a_xml_writer->xmlEndTag(
'conditionvar');
241 $a_xml_writer->xmlElement(
'setvar', [
'action' =>
'Add'], 0);
243 if (strlen($feedback_onenotcorrect)) {
244 $a_xml_writer->xmlElement(
'displayfeedback', [
'feedbacktype' =>
'Response',
'linkrefid' =>
'response_onenotcorrect']);
247 $a_xml_writer->xmlEndTag(
'respcondition');
249 $a_xml_writer->xmlEndTag(
'resprocessing');
251 foreach ($answers as $answer) {
252 $a_xml_writer->xmlStartTag(
'itemfeedback', [
'ident' =>
"response_{$answer->getPosition()}",
'view' =>
'All']);
253 $a_xml_writer->xmlStartTag(
'flow_mat');
255 $this->
addQTIMaterial($a_xml_writer, $this->
object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
256 $this->object->getId(),
258 $answer->getPosition()
261 $a_xml_writer->xmlEndTag(
'flow_mat');
262 $a_xml_writer->xmlEndTag(
'itemfeedback');
264 if (strlen($feedback_allcorrect)) {
265 $a_xml_writer->xmlStartTag(
'itemfeedback', [
'ident' =>
'response_allcorrect',
'view' =>
'All']);
266 $a_xml_writer->xmlStartTag(
'flow_mat');
270 $a_xml_writer->xmlEndTag(
'flow_mat');
271 $a_xml_writer->xmlEndTag(
'itemfeedback');
273 if (strlen($feedback_onenotcorrect)) {
274 $a_xml_writer->xmlStartTag(
'itemfeedback', [
'ident' =>
'response_onenotcorrect',
'view' =>
'All']);
275 $a_xml_writer->xmlStartTag(
'flow_mat');
279 $a_xml_writer->xmlEndTag(
'flow_mat');
280 $a_xml_writer->xmlEndTag(
'itemfeedback');
285 $a_xml_writer->xmlEndTag(
"item");
286 $a_xml_writer->xmlEndTag(
"questestinterop");
288 $a_xml_writer = $a_xml_writer->xmlDumpMem(
false);
289 if (!$a_include_header) {
290 $pos = strpos($a_xml_writer,
"?>");
291 $a_xml_writer = substr($a_xml_writer, $pos + 2);
293 return $a_xml_writer;
298 if ($this->
object->isScorePartialSolutionEnabled()) {
299 return ($this->
object->getPoints() / 2);
307 return $this->
object->getPoints();
addQTIMaterial(ilXmlWriter $a_xml_writer, string $a_material, bool $close_material_tag=true, bool $add_mobs=true)
Class for question exports.
addGeneralMetadata(ilXmlWriter $xmlwriter)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
addAdditionalContentEditingModeInformation(ilXmlWriter $a_xml_writer)
adds a qti meta data field for ilias specific information of "additional content editing mode" (xml w...
addSuggestedSolution(ilXmlWriter $writer)
toXML($a_include_header=true, $a_include_binary=true, $a_shuffle=false, $test_output=false, $force_image_references=false)
addSolutionHints(ilXmlWriter $writer)