Returns a QTI xml representation of the question.
Returns a QTI xml representation of the question and sets the internal domxml variable with the DOM XML representation of the QTI xml representation
{
global $ilias;
include_once "./Services/Math/classes/class.EvalMath.php";
$eval->suppress_errors = TRUE;
include_once("./Services/Xml/classes/class.ilXmlWriter.php");
$a_xml_writer->xmlStartTag("questestinterop");
$attrs = array(
"ident" => "il_".IL_INST_ID."_qst_".$this->object->getId(),
"title" => $this->object->getTitle(),
"maxattempts" => $this->object->getNrOfTries()
);
$a_xml_writer->xmlStartTag("item", $attrs);
$a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
$workingtime = $this->object->getEstimatedWorkingTime();
$duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
$a_xml_writer->xmlElement("duration", NULL, $duration);
$a_xml_writer->xmlStartTag("itemmetadata");
$a_xml_writer->xmlStartTag("qtimetadata");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "ILIAS_VERSION");
$a_xml_writer->xmlElement("fieldentry", NULL, $ilias->getSetting("ilias_version"));
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "QUESTIONTYPE");
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "AUTHOR");
$a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getAuthor());
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "textgaprating");
$a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getTextgapRating());
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "fixedTextLength");
$a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getFixedTextLength());
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "identicalScoring");
$a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getIdenticalScoring());
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlStartTag("qtimetadatafield");
$a_xml_writer->xmlElement("fieldlabel", NULL, "combinations");
$a_xml_writer->xmlElement("fieldentry", NULL, base64_encode(json_encode($this->object->getGapCombinations())));
$a_xml_writer->xmlEndTag("qtimetadatafield");
$a_xml_writer->xmlEndTag("qtimetadata");
$a_xml_writer->xmlEndTag("itemmetadata");
$attrs = array(
"label" => $this->object->getTitle()
);
$a_xml_writer->xmlStartTag("presentation", $attrs);
$a_xml_writer->xmlStartTag("flow");
$questionText = $this->object->getQuestion() ? $this->object->getQuestion() : ' ';
$this->object->addQTIMaterial($a_xml_writer, $questionText);
$text_parts = preg_split("/\[gap.*?\[\/gap\]/", $this->object->getClozeText());
for ($i = 0; $i <= $this->object->getGapCount(); $i++)
{
$this->object->addQTIMaterial($a_xml_writer, $text_parts[$i]);
if ($i < $this->object->getGapCount())
{
$gap = $this->object->getGap($i);
switch ($gap->getType())
{
$attrs = array(
"ident" => "gap_$i",
"rcardinality" => "Single"
);
$a_xml_writer->xmlStartTag("response_str", $attrs);
$solution = $this->object->getSuggestedSolution($i);
if (count($solution))
{
if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches))
{
$attrs = array(
"label" => "suggested_solution"
);
$a_xml_writer->xmlStartTag("material", $attrs);
$intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
if (strcmp($matches[1], "") != 0)
{
$intlink = $solution["internal_link"];
}
$a_xml_writer->xmlElement("mattext", NULL, $intlink);
$a_xml_writer->xmlEndTag("material");
}
}
$attrs = array("shuffle" => ($gap->getShuffle() ? "Yes" : "No"));
$a_xml_writer->xmlStartTag("render_choice", $attrs);
foreach ($gap->getItems() as $answeritem)
{
$attrs = array(
"ident" => $answeritem->getOrder()
);
$a_xml_writer->xmlStartTag("response_label", $attrs);
$a_xml_writer->xmlStartTag("material");
$a_xml_writer->xmlElement("mattext", NULL, $answeritem->getAnswertext());
$a_xml_writer->xmlEndTag("material");
$a_xml_writer->xmlEndTag("response_label");
}
$a_xml_writer->xmlEndTag("render_choice");
$a_xml_writer->xmlEndTag("response_str");
break;
$attrs = array(
"ident" => "gap_$i",
"rcardinality" => "Single"
);
$a_xml_writer->xmlStartTag("response_str", $attrs);
$solution = $this->object->getSuggestedSolution($i);
if (count($solution))
{
if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches))
{
$attrs = array(
"label" => "suggested_solution"
);
$a_xml_writer->xmlStartTag("material", $attrs);
$intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
if (strcmp($matches[1], "") != 0)
{
$intlink = $solution["internal_link"];
}
$a_xml_writer->xmlElement("mattext", NULL, $intlink);
$a_xml_writer->xmlEndTag("material");
}
}
$attrs = array(
"fibtype" => "String",
"prompt" => "Box",
"columns" => $gap->getGapSize()
);
$a_xml_writer->xmlStartTag("render_fib", $attrs);
$a_xml_writer->xmlEndTag("render_fib");
$a_xml_writer->xmlEndTag("response_str");
break;
$attrs = array(
"ident" => "gap_$i",
"numtype" => "Decimal",
"rcardinality" => "Single"
);
$a_xml_writer->xmlStartTag("response_num", $attrs);
$solution = $this->object->getSuggestedSolution($i);
if (count($solution))
{
if (preg_match("/il_(\d*?)_(\w+)_(\d+)/", $solution["internal_link"], $matches))
{
$attrs = array(
"label" => "suggested_solution"
);
$a_xml_writer->xmlStartTag("material", $attrs);
$intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
if (strcmp($matches[1], "") != 0)
{
$intlink = $solution["internal_link"];
}
$a_xml_writer->xmlElement("mattext", NULL, $intlink);
$a_xml_writer->xmlEndTag("material");
}
}
$answeritem = $gap->getItem(0);
$attrs = array(
"fibtype" => "Decimal",
"prompt" => "Box",
"columns" => $gap->getGapSize()
);
if (is_object($answeritem))
{
if ($eval->e($answeritem->getLowerBound()) !== FALSE)
{
$attrs["minnumber"] = $answeritem->getLowerBound();
}
if ($eval->e($answeritem->getUpperBound()) !== FALSE)
{
$attrs["maxnumber"] = $answeritem->getUpperBound();
}
}
$a_xml_writer->xmlStartTag("render_fib", $attrs);
$a_xml_writer->xmlEndTag("render_fib");
$a_xml_writer->xmlEndTag("response_num");
break;
}
}
}
$a_xml_writer->xmlEndTag("flow");
$a_xml_writer->xmlEndTag("presentation");
$a_xml_writer->xmlStartTag("resprocessing");
$a_xml_writer->xmlStartTag("outcomes");
$a_xml_writer->xmlStartTag("decvar");
$a_xml_writer->xmlEndTag("decvar");
$a_xml_writer->xmlEndTag("outcomes");
for ($i = 0; $i < $this->object->getGapCount(); $i++)
{
$gap = $this->object->getGap($i);
switch ($gap->getType())
{
foreach ($gap->getItems() as $answer)
{
$attrs = array(
"continue" => "Yes"
);
$a_xml_writer->xmlStartTag("respcondition", $attrs);
$a_xml_writer->xmlStartTag("conditionvar");
$attrs = array(
"respident" => "gap_$i"
);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
$a_xml_writer->xmlEndTag("conditionvar");
$attrs = array(
"action" => "Add"
);
$a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
$linkrefid = "";
$linkrefid = "$i" . "_Response_" . $answer->getOrder();
$attrs = array(
"feedbacktype" => "Response",
"linkrefid" => $linkrefid
);
$a_xml_writer->xmlElement("displayfeedback", $attrs);
$a_xml_writer->xmlEndTag("respcondition");
}
break;
foreach ($gap->getItems() as $answer)
{
$attrs = array(
"continue" => "Yes"
);
$a_xml_writer->xmlStartTag("respcondition", $attrs);
$a_xml_writer->xmlStartTag("conditionvar");
$attrs = array(
"respident" => "gap_$i"
);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
$a_xml_writer->xmlEndTag("conditionvar");
$attrs = array(
"action" => "Add"
);
$a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
$linkrefid = "$i" . "_Response_" . $answer->getOrder();
$attrs = array(
"feedbacktype" => "Response",
"linkrefid" => $linkrefid
);
$a_xml_writer->xmlElement("displayfeedback", $attrs);
$a_xml_writer->xmlEndTag("respcondition");
}
break;
foreach ($gap->getItems() as $answer)
{
$attrs = array(
"continue" => "Yes"
);
$a_xml_writer->xmlStartTag("respcondition", $attrs);
$a_xml_writer->xmlStartTag("conditionvar");
$attrs = array(
"respident" => "gap_$i"
);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
$a_xml_writer->xmlEndTag("conditionvar");
$attrs = array(
"action" => "Add"
);
$a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
$linkrefid = "$i" . "_Response_" . $answer->getOrder();
$attrs = array(
"feedbacktype" => "Response",
"linkrefid" => $linkrefid
);
$a_xml_writer->xmlElement("displayfeedback", $attrs);
$a_xml_writer->xmlEndTag("respcondition");
}
break;
}
}
$feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
$this->object->getId(), true
);
if (strlen($feedback_allcorrect))
{
$attrs = array(
"continue" => "Yes"
);
$a_xml_writer->xmlStartTag("respcondition", $attrs);
$a_xml_writer->xmlStartTag("conditionvar");
for ($i = 0; $i < $this->object->getGapCount(); $i++)
{
$gap = $this->object->getGap($i);
$indexes = $gap->getBestSolutionIndexes();
if ($i > 0)
{
$a_xml_writer->xmlStartTag("and");
}
switch ($gap->getType())
{
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
}
if ($i > 0)
{
$a_xml_writer->xmlEndTag("and");
}
}
$a_xml_writer->xmlEndTag("conditionvar");
$attrs = array(
"feedbacktype" => "Response",
"linkrefid" => "response_allcorrect"
);
$a_xml_writer->xmlElement("displayfeedback", $attrs);
$a_xml_writer->xmlEndTag("respcondition");
}
$feedback_onenotcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation(
$this->object->getId(), false
);
if (strlen($feedback_onenotcorrect))
{
$attrs = array(
"continue" => "Yes"
);
$a_xml_writer->xmlStartTag("respcondition", $attrs);
$a_xml_writer->xmlStartTag("conditionvar");
$a_xml_writer->xmlStartTag("not");
for ($i = 0; $i < $this->object->getGapCount(); $i++)
{
$gap = $this->object->getGap($i);
$indexes = $gap->getBestSolutionIndexes();
if ($i > 0)
{
$a_xml_writer->xmlStartTag("and");
}
switch ($gap->getType())
{
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
$k = 0;
foreach ($indexes as $key)
{
if ($k > 0)
{
$a_xml_writer->xmlStartTag("or");
}
$attrs = array(
"respident" => "gap_$i"
);
$answer = $gap->getItem($key);
$a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
if ($k > 0)
{
$a_xml_writer->xmlEndTag("or");
}
$k++;
}
break;
}
if ($i > 0)
{
$a_xml_writer->xmlEndTag("and");
}
}
$a_xml_writer->xmlEndTag("not");
$a_xml_writer->xmlEndTag("conditionvar");
$attrs = array(
"feedbacktype" => "Response",
"linkrefid" => "response_onenotcorrect"
);
$a_xml_writer->xmlElement("displayfeedback", $attrs);
$a_xml_writer->xmlEndTag("respcondition");
}
$a_xml_writer->xmlEndTag("resprocessing");
for ($i = 0; $i < $this->object->getGapCount(); $i++)
{
$gap = $this->object->getGap($i);
switch ($gap->getType())
{
break;
break;
break;
}
$attrs = array(
"ident" => $i,
"view" => "All"
);
$a_xml_writer->xmlStartTag("itemfeedback", $attrs);
$a_xml_writer->xmlStartTag("flow_mat");
$fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
$this->object->getId(), $i
);
$this->object->addQTIMaterial($a_xml_writer, $fb);
$a_xml_writer->xmlEndTag("flow_mat");
$a_xml_writer->xmlEndTag("itemfeedback");
}
if (strlen($feedback_allcorrect))
{
$attrs = array(
"ident" => "response_allcorrect",
"view" => "All"
);
$a_xml_writer->xmlStartTag("itemfeedback", $attrs);
$a_xml_writer->xmlStartTag("flow_mat");
$this->object->addQTIMaterial($a_xml_writer, $feedback_allcorrect);
$a_xml_writer->xmlEndTag("flow_mat");
$a_xml_writer->xmlEndTag("itemfeedback");
}
if (strlen($feedback_onenotcorrect))
{
$attrs = array(
"ident" => "response_onenotcorrect",
"view" => "All"
);
$a_xml_writer->xmlStartTag("itemfeedback", $attrs);
$a_xml_writer->xmlStartTag("flow_mat");
$this->object->addQTIMaterial($a_xml_writer, $feedback_onenotcorrect);
$a_xml_writer->xmlEndTag("flow_mat");
$a_xml_writer->xmlEndTag("itemfeedback");
}
$a_xml_writer->xmlEndTag("item");
$a_xml_writer->xmlEndTag("questestinterop");
$xml = $a_xml_writer->xmlDumpMem(FALSE);
if (!$a_include_header)
{
$pos = strpos($xml, "?>");
$xml = substr($xml, $pos + 2);
}
return $xml;
}