public function simpleExport($orgu_ref_id)
 {
     $nodes = $this->getStructure($orgu_ref_id);
     $writer = new ilXmlWriter();
     $writer->xmlStartTag("OrgUnits");
     foreach ($nodes as $orgu_ref_id) {
         $orgu = new ilObjOrgUnit($orgu_ref_id);
         if ($orgu->getRefId() == ilObjOrgUnit::getRootOrgRefId()) {
             continue;
         }
         $attributes = $this->getAttributesForOrgu($orgu);
         $writer->xmlStartTag("OrgUnit", $attributes);
         $writer->xmlElement("external_id", null, $this->buildExternalId($orgu_ref_id));
         $writer->xmlElement("title", null, $orgu->getTitle());
         $writer->xmlElement("description", null, $orgu->getDescription());
         $writer->xmlEndTag("OrgUnit");
     }
     $writer->xmlEndTag("OrgUnits");
     return $writer;
 }
 /**
  * Get xml of object values
  *
  * @access public
  * @static
  * @param object instance of ilXmlWriter
  * @param int $a_obj_id
  */
 public static function _appendXMLByObjId(ilXmlWriter $xml_writer, $a_obj_id)
 {
     global $ilDB;
     $type = ilObject::_lookupType($a_obj_id);
     // Get active field_definitions
     $query = "SELECT field_id FROM adv_md_record amr " . "JOIN adv_md_record_objs amro ON amr.record_id = amro.record_id " . "JOIN adv_mdf_definition amfd ON amr.record_id = amfd.record_id " . "WHERE active = 1 " . "AND obj_type = " . $ilDB->quote($type, 'text') . " ";
     $xml_writer->xmlStartTag('AdvancedMetaData');
     $res = $ilDB->query($query);
     while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) {
         include_once 'Services/AdvancedMetaData/classes/class.ilAdvancedMDValue.php';
         $value = ilAdvancedMDValue::_getInstance($a_obj_id, $row->field_id);
         $value->appendXML($xml_writer);
     }
     $xml_writer->xmlEndTag('AdvancedMetaData');
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Math/classes/class.EvalMath.php";
     $eval = new EvalMath();
     $eval->suppress_errors = TRUE;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, CLOZE_TEST_IDENTIFIER);
     $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");
     // additional content editing information
     $this->addAdditionalContentEditingModeInformation($a_xml_writer);
     $this->addGeneralMetadata($a_xml_writer);
     $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");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $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());
     // add material with question text to presentation
     for ($i = 0; $i <= $this->object->getGapCount(); $i++) {
         $this->object->addQTIMaterial($a_xml_writer, $text_parts[$i]);
         if ($i < $this->object->getGapCount()) {
             // add gap
             $gap = $this->object->getGap($i);
             switch ($gap->getType()) {
                 case CLOZE_SELECT:
                     // comboboxes
                     $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);
                     // add answers
                     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;
                 case CLOZE_TEXT:
                     // text fields
                     $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;
                 case CLOZE_NUMERIC:
                     // numeric fields
                     $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");
     // PART II: qti resprocessing
     $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");
     // add response conditions
     for ($i = 0; $i < $this->object->getGapCount(); $i++) {
         $gap = $this->object->getGap($i);
         switch ($gap->getType()) {
             case CLOZE_SELECT:
                 foreach ($gap->getItems() as $answer) {
                     $attrs = array("continue" => "Yes");
                     $a_xml_writer->xmlStartTag("respcondition", $attrs);
                     // qti conditionvar
                     $a_xml_writer->xmlStartTag("conditionvar");
                     $attrs = array("respident" => "gap_{$i}");
                     $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
                     $a_xml_writer->xmlEndTag("conditionvar");
                     // qti setvar
                     $attrs = array("action" => "Add");
                     $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
                     // qti displayfeedback
                     $linkrefid = "";
                     $linkrefid = "{$i}" . "_Response_" . $answer->getOrder();
                     $attrs = array("feedbacktype" => "Response", "linkrefid" => $linkrefid);
                     $a_xml_writer->xmlElement("displayfeedback", $attrs);
                     $a_xml_writer->xmlEndTag("respcondition");
                 }
                 break;
             case CLOZE_TEXT:
                 foreach ($gap->getItems() as $answer) {
                     $attrs = array("continue" => "Yes");
                     $a_xml_writer->xmlStartTag("respcondition", $attrs);
                     // qti conditionvar
                     $a_xml_writer->xmlStartTag("conditionvar");
                     $attrs = array("respident" => "gap_{$i}");
                     $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
                     $a_xml_writer->xmlEndTag("conditionvar");
                     // qti setvar
                     $attrs = array("action" => "Add");
                     $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
                     // qti displayfeedback
                     $linkrefid = "{$i}" . "_Response_" . $answer->getOrder();
                     $attrs = array("feedbacktype" => "Response", "linkrefid" => $linkrefid);
                     $a_xml_writer->xmlElement("displayfeedback", $attrs);
                     $a_xml_writer->xmlEndTag("respcondition");
                 }
                 break;
             case CLOZE_NUMERIC:
                 foreach ($gap->getItems() as $answer) {
                     $attrs = array("continue" => "Yes");
                     $a_xml_writer->xmlStartTag("respcondition", $attrs);
                     // qti conditionvar
                     $a_xml_writer->xmlStartTag("conditionvar");
                     $attrs = array("respident" => "gap_{$i}");
                     $a_xml_writer->xmlElement("varequal", $attrs, $answer->getAnswertext());
                     $a_xml_writer->xmlEndTag("conditionvar");
                     // qti setvar
                     $attrs = array("action" => "Add");
                     $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
                     // qti displayfeedback
                     $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);
         // qti conditionvar
         $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()) {
                 case CLOZE_SELECT:
                     $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;
                 case CLOZE_TEXT:
                     $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;
                 case CLOZE_NUMERIC:
                     $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");
         // qti displayfeedback
         $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);
         // qti conditionvar
         $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()) {
                 case CLOZE_SELECT:
                     $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;
                 case CLOZE_TEXT:
                     $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;
                 case CLOZE_NUMERIC:
                     $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");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     // PART III: qti itemfeedback
     for ($i = 0; $i < $this->object->getGapCount(); $i++) {
         $gap = $this->object->getGap($i);
         switch ($gap->getType()) {
             case CLOZE_SELECT:
                 break;
             case CLOZE_TEXT:
                 break;
             case CLOZE_NUMERIC:
                 break;
         }
         /*foreach ($gap->getItems() as $answer)
         			{
         				$linkrefid = "$i" . "_Response_" . $answer->getOrder();
         				$attrs = array(
         					"ident" => $linkrefid,
         					"view" => "All"
         				);
         				$a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         				// qti flow_mat
         				$a_xml_writer->xmlStartTag("flow_mat");
         //				$a_xml_writer->xmlStartTag("material");
         //				$a_xml_writer->xmlElement("mattext");
         //				$a_xml_writer->xmlEndTag("material");
         				$fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation(
         					$this->object->getId(), $index
         				);
         				$this->object->addQTIMaterial($a_xml_writer, $fb);
         				$a_xml_writer->xmlEndTag("flow_mat");
         				$a_xml_writer->xmlEndTag("itemfeedback");
         			}*/
         $attrs = array("ident" => $i, "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $a_xml_writer->xmlStartTag("flow_mat");
         //				$a_xml_writer->xmlStartTag("material");
         //				$a_xml_writer->xmlElement("mattext");
         //				$a_xml_writer->xmlEndTag("material");
         $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);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * To Xml.
  * This method writes only the subset Field
  * Use class.ilAdvancedMDRecordXMLWriter to generate a complete xml presentation.
  *
  * @param ilXmlWriter $a_writer
  */
 public function toXML(ilXmlWriter $a_writer)
 {
     $a_writer->xmlStartTag('Field', array('id' => $this->generateImportId($this->getFieldId()), 'searchable' => $this->isSearchable() ? 'Yes' : 'No', 'fieldType' => self::getTypeString($this->getType())));
     $a_writer->xmlElement('FieldTitle', null, $this->getTitle());
     $a_writer->xmlElement('FieldDescription', null, $this->getDescription());
     $a_writer->xmlElement('FieldPosition', null, $this->getPosition());
     $this->addPropertiesToXML($a_writer);
     $a_writer->xmlEndTag('Field');
 }
 function exportPDF($a_inst, $a_target_dir, &$expLog)
 {
     global $tpl, $lng, $ilCtrl;
     $a_xml_writer = new ilXmlWriter();
     $a_xml_writer->xmlStartTag("ContentObject", array("Type" => "SCORM2004SCO"));
     $this->exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, $expLog, $a_xml_writer);
     $a_xml_writer->xmlEndTag("ContentObject");
     include_once 'Services/Transformation/classes/class.ilXML2FO.php';
     $xml2FO = new ilXML2FO();
     $xml2FO->setXSLTLocation('./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
     $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
     $xml2FO->setXSLTParams(array('target_dir' => $a_target_dir));
     $xml2FO->transform();
     $fo_string = $xml2FO->getFOString();
     $fo_xml = simplexml_load_string($fo_string);
     $fo_ext = $fo_xml->xpath("//fo:declarations");
     $fo_ext = $fo_ext[0];
     $results = array();
     include_once "./Services/Utilities/classes/class.ilFileUtils.php";
     ilFileUtils::recursive_dirscan($a_target_dir . "/objects", $results);
     if (is_array($results["file"])) {
         foreach ($results["file"] as $key => $value) {
             $e = $fo_ext->addChild("fox:embedded-file", "", "http://xml.apache.org/fop/extensions");
             $e->addAttribute("src", $results[path][$key] . $value);
             $e->addAttribute("name", $value);
             $e->addAttribute("desc", "");
         }
     }
     $fo_string = $fo_xml->asXML();
     $a_xml_writer->_XmlWriter;
     return $fo_string;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $a_xml_writer->xmlStartTag("questestinterop");
     $attrs = array("ident" => "il_" . IL_INST_ID . "_qst_" . $this->object->getId(), "title" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("item", $attrs);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, $this->object->getQuestionType());
     $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, "points");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPoints());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "textrating");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getTextRating());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "requestedanswers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getCorrectAnswers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     // removed additional metadata from assFormulaQuestion
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $attrs = array();
     $attrs = array("ident" => "SYNTAX TREE", "rcardinality" => "Multiple");
     $a_xml_writer->xmlStartTag("response_lid", $attrs);
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     // shuffle output
     $attrs = array();
     $a_xml_writer->xmlStartTag("render_choice", $attrs);
     $answers =& $this->object->getAnswers();
     $akeys = array_keys($answers);
     if ($this->object->getShuffle() && $a_shuffle) {
         $akeys = $this->object->pcArrayShuffle($akeys);
     }
     // add answers
     foreach ($akeys as $index) {
         $answer = $answers[$index];
         $attrs = array("ident" => $index);
         $a_xml_writer->xmlStartTag("response_label", $attrs);
         $this->object->addQTIMaterial($a_xml_writer, $answer->getAnswertext());
         $a_xml_writer->xmlEndTag("response_label");
     }
     $a_xml_writer->xmlEndTag("render_choice");
     $a_xml_writer->xmlEndTag("response_lid");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $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");
     // add response conditions
     foreach ($answers as $index => $answer) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $attrs = array();
         $attrs = array("respident" => "SyntaxTree");
         $a_xml_writer->xmlElement("varequal", $attrs, $index);
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti setvar
         $attrs = array("action" => "Add");
         $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
         // qti displayfeedback
         $linkrefid = "response_{$index}";
         $attrs = array("feedbacktype" => "Response", "linkrefid" => $linkrefid);
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $feedback_allcorrect = $this->object->getFeedbackGeneric(1);
     if (strlen($feedback_allcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "SyntaxTree");
         $a_xml_writer->xmlElement("varequal", $attrs, $bestindex);
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_allcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $feedback_onenotcorrect = $this->object->getFeedbackGeneric(0);
     if (strlen($feedback_onenotcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "SyntaxTree");
         $a_xml_writer->xmlStartTag("not");
         $a_xml_writer->xmlElement("varequal", $attrs, $bestindex);
         $a_xml_writer->xmlEndTag("not");
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     if (strlen($feedback_allcorrect)) {
         $attrs = array("ident" => "response_allcorrect", "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * export questions to xml
  */
 function toXML($questions)
 {
     if (!is_array($questions)) {
         $questions =& $this->getQuestions();
     }
     if (count($questions) == 0) {
         $questions =& $this->getQuestions();
     }
     $xml = "";
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $attrs = array("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd");
     $a_xml_writer->xmlStartTag("surveyobject", $attrs);
     $attrs = array("id" => "qpl_" . $this->getId(), "label" => $this->getTitle(), "online" => $this->getOnline());
     $a_xml_writer->xmlStartTag("surveyquestions", $attrs);
     $a_xml_writer->xmlElement("dummy", NULL, "dummy");
     // add ILIAS specific metadata
     $a_xml_writer->xmlStartTag("metadata");
     $a_xml_writer->xmlStartTag("metadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "SCORM");
     include_once "./Services/MetaData/classes/class.ilMD.php";
     $md = new ilMD($this->getId(), 0, $this->getType());
     $writer = new ilXmlWriter();
     $md->toXml($writer);
     $metadata = $writer->xmlDumpMem();
     $a_xml_writer->xmlElement("fieldentry", NULL, $metadata);
     $a_xml_writer->xmlEndTag("metadatafield");
     $a_xml_writer->xmlEndTag("metadata");
     $a_xml_writer->xmlEndTag("surveyquestions");
     $a_xml_writer->xmlEndTag("surveyobject");
     $xml = $a_xml_writer->xmlDumpMem(FALSE);
     $questionxml = "";
     foreach ($questions as $key => $value) {
         $questiontype = $this->getQuestiontype($value);
         include_once "./Modules/SurveyQuestionPool/classes/class.SurveyQuestion.php";
         SurveyQuestion::_includeClass($questiontype);
         $question = new $questiontype();
         $question->loadFromDb($value);
         $questionxml .= $question->toXML(false);
     }
     $xml = str_replace("<dummy>dummy</dummy>", $questionxml, $xml);
     return $xml;
 }
 /**
  * Write link XML
  * @param ilXmlWriter $writer
  * @return 
  */
 public function toXML(ilXmlWriter $writer)
 {
     foreach (self::getAllItemIds($this->getLinkResourceId()) as $link_id) {
         $link = self::lookupItem($this->getLinkResourceId(), $link_id);
         $writer->xmlStartTag('WebLink', array('id' => $link['link_id'], 'active' => $link['active'] ? 1 : 0, 'valid' => $link['valid'] ? 1 : 0, 'disableValidation' => $link['disable_check'] ? 1 : 0));
         $writer->xmlElement('Title', array(), $link['title']);
         $writer->xmlElement('Description', array(), $link['description']);
         $writer->xmlElement('Target', array(), $link['target']);
         // Dynamic parameters
         include_once './Modules/WebResource/classes/class.ilParameterAppender.php';
         foreach (ilParameterAppender::_getParams($link_id) as $param_id => $param) {
             $value = '';
             switch ($param['value']) {
                 case LINKS_USER_ID:
                     $value = 'userId';
                     break;
                 case LINKS_LOGIN:
                     $value = 'userName';
                     break;
                 case LINKS_MATRICULATION:
                     $value = 'matriculation';
                     break;
             }
             if (!$value) {
                 // Fix for deprecated LINKS_SESSION
                 continue;
             }
             $writer->xmlElement('DynamicParameter', array('id' => $param_id, 'name' => $param['name'], 'type' => $value));
         }
         $writer->xmlEndTag('WebLink');
     }
     return true;
 }
Example #9
0
 /**
  * Returns a QTI xml representation of the test
  *
  * @return string The QTI xml representation of the test
  */
 public function toXML()
 {
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $a_xml_writer->xmlSetDtdDef("<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">");
     $a_xml_writer->xmlStartTag("questestinterop");
     $attrs = array("ident" => "il_" . IL_INST_ID . "_tst_" . $this->getTestId(), "title" => $this->getTitle());
     $a_xml_writer->xmlStartTag("assessment", $attrs);
     // add qti comment
     $a_xml_writer->xmlElement("qticomment", NULL, $this->getDescription());
     // add qti duration
     if ($this->enable_processing_time) {
         preg_match("/(\\d+):(\\d+):(\\d+)/", $this->processing_time, $matches);
         $a_xml_writer->xmlElement("duration", NULL, sprintf("P0Y0M0DT%dH%dM%dS", $matches[1], $matches[2], $matches[3]));
     }
     // add the rest of the preferences in qtimetadata tags, because there is no correspondent definition in QTI
     $a_xml_writer->xmlStartTag("qtimetadata");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "ILIAS_VERSION");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->ilias->getSetting("ilias_version"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // anonymity
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "anonymity");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnonymity()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // question set type (fixed, random, dynamic, ...)
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "question_set_type");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getQuestionSetType());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // sequence settings
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "sequence_settings");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getSequenceSettings());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // author
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "author");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAuthor());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // reset processing time
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "reset_processing_time");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getResetProcessingTime());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // count system
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "count_system");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getCountSystem());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mc_scoring");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMCScoring());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "score_cutting");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getScoreCutting());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "password");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getPassword());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // allowed users
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "allowedUsers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAllowedUsers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // allowed users time gap
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "allowedUsersTimeGap");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAllowedUsersTimeGap());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // pass scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "pass_scoring");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getPassScoring());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // score reporting date
     if ($this->getReportingDate()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "reporting_date");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->reporting_date, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     // number of tries
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "nr_of_tries");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getNrOfTries()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // kiosk
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "kiosk");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getKiosk()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     //redirection_mode
     $a_xml_writer->xmlStartTag('qtimetadatafield');
     $a_xml_writer->xmlElement("fieldlabel", NULL, "redirection_mode");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getRedirectionMode());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     //redirection_url
     $a_xml_writer->xmlStartTag('qtimetadatafield');
     $a_xml_writer->xmlElement("fieldlabel", NULL, "redirection_url");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getRedirectionUrl());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // use previous answers
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "use_previous_answers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getUsePreviousAnswers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // hide title points
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "title_output");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getTitleOutput()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // results presentation
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "results_presentation");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getResultsPresentation()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // examid in test pass
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "examid_in_test_pass");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->isShowExamIdInTestPassEnabled()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // examid in kiosk
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "examid_in_test_res");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->isShowExamIdInTestResultsEnabled()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_summary");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getListOfQuestionsSettings()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "score_reporting");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getScoreReporting()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "instant_verification");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getInstantFeedbackSolution()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // answer specific feedback
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "answer_feedback");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnswerFeedback()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // answer specific feedback of reached points
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "answer_feedback_points");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnswerFeedbackPoints()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // highscore
     $highscore_metadata = array('highscore_enabled' => array('value' => $this->getHighscoreEnabled()), 'highscore_anon' => array('value' => $this->getHighscoreAnon()), 'highscore_achieved_ts' => array('value' => $this->getHighscoreAchievedTS()), 'highscore_score' => array('value' => $this->getHighscoreScore()), 'highscore_percentage' => array('value' => $this->getHighscorePercentage()), 'highscore_hints' => array('value' => $this->getHighscoreHints()), 'highscore_wtime' => array('value' => $this->getHighscoreWTime()), 'highscore_own_table' => array('value' => $this->getHighscoreOwnTable()), 'highscore_top_table' => array('value' => $this->getHighscoreTopTable()), 'highscore_top_num' => array('value' => $this->getHighscoreTopNum()));
     foreach ($highscore_metadata as $label => $data) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, $label);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $data['value']));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     // show cancel
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_cancel");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowCancel()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show marker
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_marker");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowMarker()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // fixed participants
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "fixed_participants");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getFixedParticipants()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show final statement
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "showfinalstatement");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowFinalStatement() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show introduction only
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "showinfo");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowInfo() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // mail notification
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mailnotification");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMailNotification());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // mail notification type
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mailnottype");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMailNotificationType());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // export settings
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "exportsettings");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getExportSettings());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // force JavaScript
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "forcejs");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getForceJS() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // custom style
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "customstyle");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getCustomStyle());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // shuffle questions
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "shuffle_questions");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShuffleQuestions()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // processing time
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "processing_time");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getProcessingTime());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // enable_examview
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "enable_examview");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getEnableExamview());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show_examview_html
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_examview_html");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getShowExamviewHtml());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show_examview_pdf
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_examview_pdf");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getShowExamviewPdf());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // enable_archiving
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "enable_archiving");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getEnableArchiving());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // sign_submission
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "sign_submission");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getSignSubmission());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // char_selector_availability
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "char_selector_availability");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getCharSelectorAvailability()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // char_selector_definition
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "char_selector_definition");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getCharSelectorDefinition());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // skill_service
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "skill_service");
     $a_xml_writer->xmlElement("fieldentry", NULL, (int) $this->isSkillServiceEnabled());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // result_tax_filters
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "result_tax_filters");
     $a_xml_writer->xmlElement("fieldentry", NULL, serialize((array) $this->getResultFilterTaxIds()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show_grading_status
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_grading_status");
     $a_xml_writer->xmlElement("fieldentry", NULL, (int) $this->isShowGradingStatusEnabled());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show_grading_mark
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_grading_mark");
     $a_xml_writer->xmlElement("fieldentry", NULL, (int) $this->isShowGradingMarkEnabled());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // starting time
     if ($this->getStartingTime()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "starting_time");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->starting_time, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     // ending time
     if ($this->getEndingTime()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "ending_time");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->ending_time, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     foreach ($this->mark_schema->mark_steps as $index => $mark) {
         // mark steps
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "mark_step_{$index}");
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("<short>%s</short><official>%s</official><percentage>%.2f</percentage><passed>%d</passed>", $mark->getShortName(), $mark->getOfficialName(), $mark->getMinimumLevel(), $mark->getPassed()));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     $a_xml_writer->xmlEndTag("qtimetadata");
     // add qti objectives
     $a_xml_writer->xmlStartTag("objectives");
     $this->addQTIMaterial($a_xml_writer, $this->getIntroduction());
     $a_xml_writer->xmlEndTag("objectives");
     // add qti assessmentcontrol
     if ($this->getInstantFeedbackSolution() == 1) {
         $attrs = array("solutionswitch" => "Yes");
     } else {
         $attrs = NULL;
     }
     $a_xml_writer->xmlElement("assessmentcontrol", $attrs, NULL);
     if (strlen($this->getFinalStatement())) {
         // add qti presentation_material
         $a_xml_writer->xmlStartTag("presentation_material");
         $a_xml_writer->xmlStartTag("flow_mat");
         $this->addQTIMaterial($a_xml_writer, $this->getFinalStatement());
         $a_xml_writer->xmlEndTag("flow_mat");
         $a_xml_writer->xmlEndTag("presentation_material");
     }
     $attrs = array("ident" => "1");
     $a_xml_writer->xmlElement("section", $attrs, NULL);
     $a_xml_writer->xmlEndTag("assessment");
     $a_xml_writer->xmlEndTag("questestinterop");
     $xml = $a_xml_writer->xmlDumpMem(FALSE);
     foreach ($this->questions as $question_id) {
         $question =& ilObjTest::_instanciateQuestion($question_id);
         $qti_question = $question->toXML(false);
         $qti_question = preg_replace("/<questestinterop>/", "", $qti_question);
         $qti_question = preg_replace("/<\\/questestinterop>/", "", $qti_question);
         if (strpos($xml, "</section>") !== false) {
             $xml = str_replace("</section>", "{$qti_question}</section>", $xml);
         } else {
             $xml = str_replace("<section ident=\"1\"/>", "<section ident=\"1\">\n{$qti_question}</section>", $xml);
         }
     }
     return $xml;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, TEXT_QUESTION_IDENTIFIER);
     $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, "textrating");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getTextRating());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     /*
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "keywords");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getKeywords());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     */
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "matchcondition");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->matchcondition);
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "termscoring");
     $scores = serialize($this->object->getAnswers());
     $a_xml_writer->xmlElement("fieldentry", NULL, $scores);
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "termrelation");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getKeywordRelation());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "specificfeedback");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getKeywordRelation());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add information on response rendering
     $attrs = array("ident" => "TEXT", "rcardinality" => "Ordered");
     $a_xml_writer->xmlStartTag("response_str", $attrs);
     $attrs = array("fibtype" => "String", "prompt" => "Box");
     if ($this->object->getMaxNumOfChars() > 0) {
         $attrs["maxchars"] = $this->object->getMaxNumOfChars();
     }
     $a_xml_writer->xmlStartTag("render_fib", $attrs);
     $attrs = array("ident" => "A");
     $a_xml_writer->xmlStartTag("response_label", $attrs);
     $a_xml_writer->xmlEndTag("response_label");
     $a_xml_writer->xmlEndTag("render_fib");
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     $a_xml_writer->xmlEndTag("response_str");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $attrs = array("scoremodel" => "HumanRater");
     $a_xml_writer->xmlStartTag("resprocessing", $attrs);
     $a_xml_writer->xmlStartTag("outcomes");
     $attrs = array("varname" => "WritingScore", "vartype" => "Integer", "minvalue" => "0", "maxvalue" => $this->object->getPoints());
     $a_xml_writer->xmlStartTag("decvar", $attrs);
     $a_xml_writer->xmlEndTag("decvar");
     $a_xml_writer->xmlEndTag("outcomes");
     $feedback_allcorrect = $this->object->getFeedbackGeneric(1);
     $feedback_onenotcorrect = $this->object->getFeedbackGeneric(0);
     if (strlen($feedback_allcorrect . $feedback_onenotcorrect)) {
         if (strlen($feedback_allcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints());
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_allcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
         if (strlen($feedback_onenotcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $a_xml_writer->xmlStartTag("not");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints());
             $a_xml_writer->xmlEndTag("not");
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
     }
     $a_xml_writer->xmlStartTag("respcondition");
     $a_xml_writer->xmlStartTag("conditionvar");
     $a_xml_writer->xmlElement("other", NULL, "tutor_rated");
     $a_xml_writer->xmlEndTag("conditionvar");
     $a_xml_writer->xmlEndTag("respcondition");
     $a_xml_writer->xmlEndTag("resprocessing");
     if (strlen($feedback_allcorrect)) {
         $attrs = array("ident" => "response_allcorrect", "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * Returns a QTI xml representation of the survey
  *
  * @return string The QTI xml representation of the survey
  * @access public
  */
 function toXML()
 {
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $attrs = array("xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:noNamespaceSchemaLocation" => "http://www.ilias.de/download/xsd/ilias_survey_4_2.xsd");
     $a_xml_writer->xmlStartTag("surveyobject", $attrs);
     $attrs = array("id" => $this->getSurveyId(), "title" => $this->getTitle());
     $a_xml_writer->xmlStartTag("survey", $attrs);
     $a_xml_writer->xmlElement("description", NULL, $this->getDescription());
     $a_xml_writer->xmlElement("author", NULL, $this->getAuthor());
     $a_xml_writer->xmlStartTag("objectives");
     $attrs = array("label" => "introduction");
     $this->addMaterialTag($a_xml_writer, $this->getIntroduction(), TRUE, TRUE, $attrs);
     $attrs = array("label" => "outro");
     $this->addMaterialTag($a_xml_writer, $this->getOutro(), TRUE, TRUE, $attrs);
     $a_xml_writer->xmlEndTag("objectives");
     if ($this->getAnonymize()) {
         $attribs = array("enabled" => "1");
     } else {
         $attribs = array("enabled" => "0");
     }
     $a_xml_writer->xmlElement("anonymisation", $attribs);
     $a_xml_writer->xmlStartTag("restrictions");
     if ($this->getAnonymize() == 2) {
         $attribs = array("type" => "free");
     } else {
         $attribs = array("type" => "restricted");
     }
     $a_xml_writer->xmlElement("access", $attribs);
     if ($this->getStartDate()) {
         $attrs = array("type" => "date");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->getStartDate(), $matches);
         $a_xml_writer->xmlElement("startingtime", $attrs, sprintf("%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
     }
     if ($this->getEndDate()) {
         $attrs = array("type" => "date");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->getEndDate(), $matches);
         $a_xml_writer->xmlElement("endingtime", $attrs, sprintf("%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
     }
     $a_xml_writer->xmlEndTag("restrictions");
     // constraints
     $pages =& $this->getSurveyPages();
     $hasconstraints = FALSE;
     foreach ($pages as $question_array) {
         foreach ($question_array as $question) {
             if (count($question["constraints"])) {
                 $hasconstraints = TRUE;
             }
         }
     }
     if ($hasconstraints) {
         $a_xml_writer->xmlStartTag("constraints");
         foreach ($pages as $question_array) {
             foreach ($question_array as $question) {
                 if (count($question["constraints"])) {
                     // found constraints
                     foreach ($question["constraints"] as $constraint) {
                         $attribs = array("sourceref" => $question["question_id"], "destref" => $constraint["question"], "relation" => $constraint["short"], "value" => $constraint["value"], "conjunction" => $constraint["conjunction"]);
                         $a_xml_writer->xmlElement("constraint", $attribs);
                     }
                 }
             }
         }
         $a_xml_writer->xmlEndTag("constraints");
     }
     // add the rest of the preferences in qtimetadata tags, because there is no correspondent definition in QTI
     $a_xml_writer->xmlStartTag("metadata");
     $a_xml_writer->xmlStartTag("metadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "evaluation_access");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getEvaluationAccess());
     $a_xml_writer->xmlEndTag("metadatafield");
     $a_xml_writer->xmlStartTag("metadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "status");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getStatus());
     $a_xml_writer->xmlEndTag("metadatafield");
     $a_xml_writer->xmlStartTag("metadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "display_question_titles");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getShowQuestionTitles());
     $a_xml_writer->xmlEndTag("metadatafield");
     $a_xml_writer->xmlStartTag("metadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "SCORM");
     include_once "./Services/MetaData/classes/class.ilMD.php";
     $md = new ilMD($this->getId(), 0, $this->getType());
     $writer = new ilXmlWriter();
     $md->toXml($writer);
     $metadata = $writer->xmlDumpMem();
     $a_xml_writer->xmlElement("fieldentry", NULL, $metadata);
     $a_xml_writer->xmlEndTag("metadatafield");
     $a_xml_writer->xmlEndTag("metadata");
     $a_xml_writer->xmlEndTag("survey");
     $attribs = array("id" => $this->getId());
     $a_xml_writer->xmlStartTag("surveyquestions", $attribs);
     // add questionblock descriptions
     $obligatory_states =& $this->getObligatoryStates();
     foreach ($pages as $question_array) {
         if (count($question_array) > 1) {
             $attribs = array("id" => $question_array[0]["question_id"]);
             $attribs = array("showQuestiontext" => $question_array[0]["questionblock_show_questiontext"], "showBlocktitle" => $question_array[0]["questionblock_show_blocktitle"]);
             $a_xml_writer->xmlStartTag("questionblock", $attribs);
             if (strlen($question_array[0]["questionblock_title"])) {
                 $a_xml_writer->xmlElement("questionblocktitle", NULL, $question_array[0]["questionblock_title"]);
             }
         }
         foreach ($question_array as $question) {
             if (strlen($question["heading"])) {
                 $a_xml_writer->xmlElement("textblock", NULL, $question["heading"]);
             }
             $questionObject =& $this->_instanciateQuestion($question["question_id"]);
             if ($questionObject !== FALSE) {
                 $questionObject->insertXML($a_xml_writer, FALSE, $obligatory_states[$question["question_id"]]);
             }
         }
         if (count($question_array) > 1) {
             $a_xml_writer->xmlEndTag("questionblock");
         }
     }
     $a_xml_writer->xmlEndTag("surveyquestions");
     $a_xml_writer->xmlEndTag("surveyobject");
     $xml = $a_xml_writer->xmlDumpMem(FALSE);
     return $xml;
 }
Example #12
0
 /**
  * Get xml representation
  * 	<dataset install_id="123" install_url="...">
  * 	<types entity="table_name" version="4.0.1">
  *		<ftype name="field_1" type="text" />
  *		<ftype name="field_2" type="date" />
  *		<ftype name="field_3" type="integer" />
  *	</types>
  *  <types ...>
  *    ...
  *  </types>
  *	<set entity="table_name">
  *		<rec>
  *			<field_1>content</field_1>
  *			<field_2>my_date</field_2>
  *			<field_3>my_number</field_3>
  *		</rec>
  *		...
  *	</set>
  *  </dataset>
  */
 final function getXmlRepresentation($a_entity, $a_schema_version, $a_ids, $a_field = "", $a_omit_header = false, $a_omit_types = false)
 {
     $this->dircnt = 1;
     // step 1: check target release and supported versions
     // step 2: init writer
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $writer = new ilXmlWriter();
     if (!$a_omit_header) {
         $writer->xmlHeader();
     }
     // collect namespaces
     $namespaces = $prefixes = array();
     $this->getNamespaces($namespaces, $a_entity, $a_schema_version);
     $atts = array("InstallationId" => IL_INST_ID, "InstallationUrl" => ILIAS_HTTP_PATH, "TopEntity" => $a_entity);
     $cnt = 1;
     foreach ($namespaces as $entity => $ns) {
         $prefix = "ns" . $cnt;
         $prefixes[$entity] = $prefix;
         //			$atts["xmlns:".$prefix] = $ns;
         $cnt++;
     }
     $writer->xmlStartTag($this->getDSPrefixString() . 'DataSet', $atts);
     // add types
     if (!$a_omit_types) {
         $this->addTypesXml($writer, $a_entity, $a_schema_version);
     }
     // add records
     $this->addRecordsXml($writer, $prefixes, $a_entity, $a_schema_version, $a_ids, $a_field = "");
     $writer->xmlEndTag($this->getDSPrefixString() . "DataSet");
     //if ($a_entity == "mep")
     //{
     //	echo "<pre>".htmlentities($writer->xmlDumpMem(true))."</pre>"; exit;
     //}
     return $writer->xmlDumpMem(false);
 }
 /**
  * Returns a QTI xml representation of the test
  *
  * @return string The QTI xml representation of the test
  * @access public
  */
 function toXML()
 {
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $a_xml_writer->xmlSetDtdDef("<!DOCTYPE questestinterop SYSTEM \"ims_qtiasiv1p2p1.dtd\">");
     $a_xml_writer->xmlStartTag("questestinterop");
     $attrs = array("ident" => "il_" . IL_INST_ID . "_tst_" . $this->getTestId(), "title" => $this->getTitle());
     $a_xml_writer->xmlStartTag("assessment", $attrs);
     // add qti comment
     $a_xml_writer->xmlElement("qticomment", NULL, $this->getDescription());
     // add qti duration
     if ($this->enable_processing_time) {
         preg_match("/(\\d+):(\\d+):(\\d+)/", $this->processing_time, $matches);
         $a_xml_writer->xmlElement("duration", NULL, sprintf("P0Y0M0DT%dH%dM%dS", $matches[1], $matches[2], $matches[3]));
     }
     // add the rest of the preferences in qtimetadata tags, because there is no correspondent definition in QTI
     $a_xml_writer->xmlStartTag("qtimetadata");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "ILIAS_VERSION");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->ilias->getSetting("ilias_version"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // anonymity
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "anonymity");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnonymity()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // random test
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "random_test");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->isRandomTest()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // sequence settings
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "sequence_settings");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getSequenceSettings());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // author
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "author");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAuthor());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // reset processing time
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "reset_processing_time");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getResetProcessingTime());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // count system
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "count_system");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getCountSystem());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mc_scoring");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMCScoring());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "score_cutting");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getScoreCutting());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // multiple choice scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "password");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getPassword());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // allowed users
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "allowedUsers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAllowedUsers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // allowed users time gap
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "allowedUsersTimeGap");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getAllowedUsersTimeGap());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // pass scoring
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "pass_scoring");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getPassScoring());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // score reporting date
     if ($this->getReportingDate()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "reporting_date");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->reporting_date, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     // number of tries
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "nr_of_tries");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getNrOfTries()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // kiosk
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "kiosk");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getKiosk()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // use previous answers
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "use_previous_answers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getUsePreviousAnswers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // hide title points
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "title_output");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getTitleOutput()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // random question count
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "random_question_count");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getRandomQuestionCount()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // results presentation
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "results_presentation");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getResultsPresentation()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_summary");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getListOfQuestionsSettings()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "score_reporting");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getScoreReporting()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // solution details
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "instant_verification");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getInstantFeedbackSolution()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // answer specific feedback
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "answer_feedback");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnswerFeedback()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // answer specific feedback of reached points
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "answer_feedback_points");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getAnswerFeedbackPoints()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show cancel
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_cancel");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowCancel()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show marker
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "show_marker");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowMarker()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // fixed participants
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "fixed_participants");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getFixedParticipants()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show final statement
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "showfinalstatement");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowFinalStatement() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // show introduction only
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "showinfo");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShowInfo() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // mail notification
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mailnotification");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMailNotification());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // mail notification type
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "mailnottype");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getMailNotificationType());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // export settings
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "exportsettings");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getExportSettings());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // force JavaScript
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "forcejs");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getForceJS() ? "1" : "0"));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // custom style
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "customstyle");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getCustomStyle());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // shuffle questions
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "shuffle_questions");
     $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("%d", $this->getShuffleQuestions()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // processing time
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "processing_time");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->getProcessingTime());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     // starting time
     if ($this->getStartingTime()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "starting_time");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->starting_time, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     // ending time
     if ($this->getEndingTime()) {
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "ending_time");
         preg_match("/(\\d{4})(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{2})/", $this->ending_time, $matches);
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("P%dY%dM%dDT%dH%dM%dS", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], $matches[6]));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     foreach ($this->mark_schema->mark_steps as $index => $mark) {
         // mark steps
         $a_xml_writer->xmlStartTag("qtimetadatafield");
         $a_xml_writer->xmlElement("fieldlabel", NULL, "mark_step_{$index}");
         $a_xml_writer->xmlElement("fieldentry", NULL, sprintf("<short>%s</short><official>%s</official><percentage>%.2f</percentage><passed>%d</passed>", $mark->getShortName(), $mark->getOfficialName(), $mark->getMinimumLevel(), $mark->getPassed()));
         $a_xml_writer->xmlEndTag("qtimetadatafield");
     }
     $a_xml_writer->xmlEndTag("qtimetadata");
     // add qti objectives
     $a_xml_writer->xmlStartTag("objectives");
     $this->addQTIMaterial($a_xml_writer, $this->getIntroduction());
     $a_xml_writer->xmlEndTag("objectives");
     // add qti assessmentcontrol
     if ($this->getInstantFeedbackSolution() == 1) {
         $attrs = array("solutionswitch" => "Yes");
     } else {
         $attrs = NULL;
     }
     $a_xml_writer->xmlElement("assessmentcontrol", $attrs, NULL);
     if (strlen($this->getFinalStatement())) {
         // add qti presentation_material
         $a_xml_writer->xmlStartTag("presentation_material");
         $a_xml_writer->xmlStartTag("flow_mat");
         $this->addQTIMaterial($a_xml_writer, $this->getFinalStatement());
         $a_xml_writer->xmlEndTag("flow_mat");
         $a_xml_writer->xmlEndTag("presentation_material");
     }
     $attrs = array("ident" => "1");
     $a_xml_writer->xmlElement("section", $attrs, NULL);
     $a_xml_writer->xmlEndTag("assessment");
     $a_xml_writer->xmlEndTag("questestinterop");
     $xml = $a_xml_writer->xmlDumpMem(FALSE);
     foreach ($this->questions as $question_id) {
         $question =& ilObjTest::_instanciateQuestion($question_id);
         $qti_question = $question->toXML(false);
         $qti_question = preg_replace("/<questestinterop>/", "", $qti_question);
         $qti_question = preg_replace("/<\\/questestinterop>/", "", $qti_question);
         if (strpos($xml, "</section>") !== false) {
             $xml = str_replace("</section>", "{$qti_question}</section>", $xml);
         } else {
             $xml = str_replace("<section ident=\"1\"/>", "<section ident=\"1\">\n{$qti_question}</section>", $xml);
         }
     }
     return $xml;
 }
 /**
  * Write webresource xml
  * @param ilXmlWriter $writer
  * @return 
  */
 public function toXML(ilXmlWriter $writer)
 {
     $attribs = array("obj_id" => "il_" . IL_INST_ID . "_webr_" . $this->getId());
     $writer->xmlStartTag('WebLinks', $attribs);
     // LOM MetaData
     include_once 'Services/MetaData/classes/class.ilMD2XML.php';
     $md2xml = new ilMD2XML($this->getId(), $this->getId(), 'webr');
     $md2xml->startExport();
     $writer->appendXML($md2xml->getXML());
     // Sorting
     include_once './Services/Container/classes/class.ilContainerSortingSettings.php';
     switch (ilContainerSortingSettings::_lookupSortMode($this->getId())) {
         case ilContainer::SORT_MANUAL:
             $writer->xmlElement('Sorting', array('type' => 'Manual'));
             break;
         case ilContainer::SORT_TITLE:
         default:
             $writer->xmlElement('Sorting', array('type' => 'Title'));
             break;
     }
     // All links
     include_once './Modules/WebResource/classes/class.ilLinkResourceItems.php';
     $links = new ilLinkResourceItems($this->getId());
     $links->toXML($writer);
     $writer->xmlEndTag('WebLinks');
     return true;
 }
Example #15
0
 public static function _exportContainerSettings(ilXmlWriter $a_xml, $a_obj_id)
 {
     // container settings
     $settings = self::_getContainerSettings($a_obj_id);
     if (sizeof($settings)) {
         $a_xml->xmlStartTag("ContainerSettings");
         foreach ($settings as $keyword => $value) {
             // :TODO: proper custom icon export/import
             if (stristr($keyword, "icon")) {
                 continue;
             }
             $a_xml->xmlStartTag('ContainerSetting', array('id' => $keyword));
             $a_xml->xmlData($value);
             $a_xml->xmlEndTag("ContainerSetting");
         }
         $a_xml->xmlEndTag("ContainerSettings");
     }
 }
 /**
  * Export to xml
  * @param ilXmlWriter $writer
  * @return void
  */
 public function toXml(ilXmlWriter $writer)
 {
     $writer->xmlStartTag('localPolicyAction');
     switch ($this->getFilterType()) {
         case self::FILTER_SOURCE_TITLE:
             $writer->xmlStartTag('roleFilter', array('source' => 'title'));
             break;
         case self::FILTER_SOURCE_OBJ_ID:
             $writer->xmlStartTag('roleFilter', array('source' => 'objId'));
             break;
     }
     foreach ($this->getFilterPattern() as $pattern) {
         $pattern->toXml($writer);
     }
     $writer->xmlEndTag('roleFilter');
     $il_role_id = 'il_' . IL_INST_ID . '_' . ilObject::_lookupType($this->getRoleTemplateId()) . '_' . $this->getRoleTemplateId();
     switch ($this->getRoleTemplateType()) {
         case self::TPL_ACTION_OVERWRITE:
             $writer->xmlStartTag('localPolicyTemplate', array('type' => 'overwrite', 'id' => $il_role_id));
             break;
         case self::TPL_ACTION_INTERSECT:
             $writer->xmlStartTag('localPolicyTemplate', array('type' => 'intersect', 'id' => $il_role_id));
             break;
         case self::TPL_ACTION_UNION:
             $writer->xmlStartTag('localPolicyTemplate', array('type' => 'union', 'id' => $il_role_id));
             break;
     }
     include_once './Services/AccessControl/classes/class.ilRoleXmlExport.php';
     $exp = new ilRoleXmlExport();
     $exp->setMode(ilRoleXmlExport::MODE_DTPL);
     $exp->addRole($this->getRoleTemplateId(), ROLE_FOLDER_ID);
     $exp->write();
     $writer->appendXML($exp->xmlDumpMem(FALSE));
     $writer->xmlEndTag('localPolicyTemplate');
     $writer->xmlEndTag('localPolicyAction');
     return void;
 }
Example #17
0
 /**
  * 
  * @param object $a_table
  * @param object $a_file [optional]
  * @return 
  */
 function buildInsertStatementsXML($a_table, $a_basedir)
 {
     global $ilLog;
     include_once './Services/Xml/classes/class.ilXmlWriter.php';
     $w = new ilXmlWriter();
     $w->xmlStartTag('Table', array('name' => $a_table));
     $set = $this->il_db->query("SELECT * FROM `" . $a_table . "`");
     $ins_st = "";
     $first = true;
     while ($rec = $this->il_db->fetchAssoc($set)) {
         #$ilLog->write('Num: '.$num++);
         $w->xmlStartTag('Row');
         $fields = array();
         $types = array();
         $values = array();
         foreach ($rec as $f => $v) {
             if ($this->fields[$f]['type'] == 'text' and $this->fields[$f]['length'] >= 1000) {
                 $v = $this->shortenText($a_table, $f, $v, $this->fields[$f]['length']);
             }
             $w->xmlElement('Value', array('name' => $f, 'type' => $this->fields[$f]['type']), $v);
         }
         $w->xmlEndTag('Row');
     }
     $w->xmlEndTag('Table');
     $w->xmlDumpFile($a_basedir . '/' . $a_table . '.xml', FALSE);
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, JAVAAPPLET_QUESTION_IDENTIFIER);
     $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->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     $a_xml_writer->xmlStartTag("material");
     $attrs = array("label" => "applet data", "uri" => $this->object->getJavaAppletFilename(), "height" => $this->object->getJavaHeight(), "width" => $this->object->getJavaWidth(), "embedded" => "base64");
     $javapath = $this->object->getJavaPath() . $this->object->getJavaAppletFilename();
     $fh = @fopen($javapath, "rb");
     if ($fh == false) {
         return;
     }
     $javafile = fread($fh, filesize($javapath));
     fclose($fh);
     $base64 = base64_encode($javafile);
     $a_xml_writer->xmlElement("matapplet", $attrs, $base64);
     if ($this->object->buildParamsOnly()) {
         if ($this->object->getJavaCode()) {
             $attrs = array("label" => "java_code");
             $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaCode());
         }
         if ($this->object->getJavaCodebase()) {
             $attrs = array("label" => "java_codebase");
             $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaCodebase());
         }
         if ($this->object->getJavaArchive()) {
             $attrs = array("label" => "java_archive");
             $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getJavaArchive());
         }
         for ($i = 0; $i < $this->object->getParameterCount(); $i++) {
             $param = $this->object->getParameter($i);
             $attrs = array("label" => $param["name"]);
             $a_xml_writer->xmlElement("mattext", $attrs, $param["value"]);
         }
     }
     $a_xml_writer->xmlEndTag("material");
     $a_xml_writer->xmlStartTag("material");
     $attrs = array("label" => "points");
     $a_xml_writer->xmlElement("mattext", $attrs, $this->object->getPoints());
     $a_xml_writer->xmlEndTag("material");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $feedback_allcorrect = $this->object->getFeedbackGeneric(1);
     $feedback_onenotcorrect = $this->object->getFeedbackGeneric(0);
     if (strlen($feedback_allcorrect . $feedback_onenotcorrect)) {
         $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");
         if (strlen($feedback_allcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints());
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_allcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
         if (strlen($feedback_onenotcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $a_xml_writer->xmlStartTag("not");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varequal", $attrs, $this->object->getPoints());
             $a_xml_writer->xmlEndTag("not");
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
         $a_xml_writer->xmlEndTag("resprocessing");
     }
     if (strlen($feedback_allcorrect)) {
         $attrs = array("ident" => "response_allcorrect", "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, MATCHING_QUESTION_IDENTIFIER);
     $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");
     // additional content editing information
     $this->addAdditionalContentEditingModeInformation($a_xml_writer);
     $this->addGeneralMetadata($a_xml_writer);
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "shuffle");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getShuffle());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "thumb_geometry");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getThumbGeometry());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, 'matching_mode');
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getMatchingMode());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $attrs = array("ident" => "MQ", "rcardinality" => "Multiple");
     $a_xml_writer->xmlStartTag("response_grp", $attrs);
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     // shuffle output
     $attrs = array();
     if ($this->object->getShuffle()) {
         $attrs = array("shuffle" => "Yes");
     } else {
         $attrs = array("shuffle" => "No");
     }
     $a_xml_writer->xmlStartTag("render_choice", $attrs);
     // add answertext
     $matchingtext_orders = array();
     foreach ($this->object->getMatchingPairs() as $index => $matchingpair) {
         array_push($matchingtext_orders, $matchingpair->term->identifier);
     }
     $termids = array();
     foreach ($this->object->getTerms() as $term) {
         array_push($termids, $term->identifier);
     }
     // add answers
     foreach ($this->object->getDefinitions() as $definition) {
         $attrs = array("ident" => $definition->identifier, "match_max" => "1", "match_group" => join($termids, ","));
         $a_xml_writer->xmlStartTag("response_label", $attrs);
         $a_xml_writer->xmlStartTag("material");
         if (strlen($definition->picture)) {
             if ($force_image_references) {
                 $attrs = array("imagtype" => "image/jpeg", "label" => $definition->picture, "uri" => $this->object->getImagePathWeb() . $definition->picture);
                 $a_xml_writer->xmlElement("matimage", $attrs);
             } else {
                 $imagepath = $this->object->getImagePath() . $definition->picture;
                 $fh = @fopen($imagepath, "rb");
                 if ($fh != false) {
                     $imagefile = fread($fh, filesize($imagepath));
                     fclose($fh);
                     $base64 = base64_encode($imagefile);
                     $attrs = array("imagtype" => "image/jpeg", "label" => $definition->picture, "embedded" => "base64");
                     $a_xml_writer->xmlElement("matimage", $attrs, $base64, FALSE, FALSE);
                 }
             }
         }
         if (strlen($definition->text)) {
             $attrs = array("texttype" => "text/plain");
             if ($this->object->isHTML($definition->text)) {
                 $attrs["texttype"] = "text/xhtml";
             }
             $a_xml_writer->xmlElement("mattext", $attrs, $definition->text);
         }
         $a_xml_writer->xmlEndTag("material");
         $a_xml_writer->xmlEndTag("response_label");
     }
     // add matchingtext
     foreach ($this->object->getTerms() as $term) {
         $attrs = array("ident" => $term->identifier);
         $a_xml_writer->xmlStartTag("response_label", $attrs);
         $a_xml_writer->xmlStartTag("material");
         if (strlen($term->picture)) {
             if ($force_image_references) {
                 $attrs = array("imagtype" => "image/jpeg", "label" => $term->picture, "uri" => $this->object->getImagePathWeb() . $term->picture);
                 $a_xml_writer->xmlElement("matimage", $attrs);
             } else {
                 $imagepath = $this->object->getImagePath() . $term->picture;
                 $fh = @fopen($imagepath, "rb");
                 if ($fh != false) {
                     $imagefile = fread($fh, filesize($imagepath));
                     fclose($fh);
                     $base64 = base64_encode($imagefile);
                     $attrs = array("imagtype" => "image/jpeg", "label" => $term->picture, "embedded" => "base64");
                     $a_xml_writer->xmlElement("matimage", $attrs, $base64, FALSE, FALSE);
                 }
             }
         }
         if (strlen($term->text)) {
             $attrs = array("texttype" => "text/plain");
             if ($this->object->isHTML($term->text)) {
                 $attrs["texttype"] = "text/xhtml";
             }
             $a_xml_writer->xmlElement("mattext", $attrs, $term->text);
         }
         $a_xml_writer->xmlEndTag("material");
         $a_xml_writer->xmlEndTag("response_label");
     }
     $a_xml_writer->xmlEndTag("render_choice");
     $a_xml_writer->xmlEndTag("response_grp");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $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");
     // add response conditions
     foreach ($this->object->getMatchingPairs() as $matchingpair) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $attrs = array("respident" => "MQ");
         $a_xml_writer->xmlElement("varsubset", $attrs, $matchingpair->term->identifier . "," . $matchingpair->definition->identifier);
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti setvar
         $attrs = array("action" => "Add");
         $a_xml_writer->xmlElement("setvar", $attrs, $matchingpair->points);
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "correct_" . $matchingpair->term->identifier . "_" . $matchingpair->definition_identifier);
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation($this->object->getId(), true);
     if (strlen($feedback_allcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         foreach ($this->object->getMatchingPairs() as $matchingpair) {
             $attrs = array("respident" => "MQ");
             $a_xml_writer->xmlElement("varsubset", $attrs, $matchingpair->term->identifier . "," . $matchingpair->definition->identifier);
         }
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $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);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $a_xml_writer->xmlStartTag("not");
         foreach ($this->object->getMatchingPairs() as $matchingpair) {
             $attrs = array("respident" => "MQ");
             $a_xml_writer->xmlElement("varsubset", $attrs, $matchingpair->term->identifier . "," . $matchingpair->definition->identifier);
         }
         $a_xml_writer->xmlEndTag("not");
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     // PART III: qti itemfeedback
     foreach ($this->object->getMatchingPairs() as $matchingpair) {
         $attrs = array("ident" => "correct_" . $matchingpair->term->identifier . "_" . $matchingpair->definition->identifier, "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $a_xml_writer->xmlStartTag("flow_mat");
         $a_xml_writer->xmlStartTag("material");
         $a_xml_writer->xmlElement("mattext");
         $a_xml_writer->xmlEndTag("material");
         $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);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, $this->object->getQuestionType());
     $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");
     // additional content editing information
     $this->addAdditionalContentEditingModeInformation($a_xml_writer);
     $this->addGeneralMetadata($a_xml_writer);
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "points");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPoints());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "width");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getWidth());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "height");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getHeight());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "applet");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getApplet());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "swf");
     $flashpath = $this->object->getFlashPath() . $this->object->getApplet();
     $fh = @fopen($flashpath, "rb");
     $base64 = "";
     if ($fh != FALSE) {
         $flashfile = fread($fh, filesize($flashpath));
         fclose($fh);
         $base64 = base64_encode($flashfile);
     }
     $a_xml_writer->xmlElement("fieldentry", NULL, $base64);
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "params");
     $a_xml_writer->xmlElement("fieldentry", NULL, serialize($this->object->getParameters()));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     $this->exportFeedbackOnly($a_xml_writer);
     $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;
 }
 /**
  * Returns a QTI xml representation of the question and sets the internal
  * domxml variable with the DOM XML representation of the QTI xml representation
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, $this->object->getQuestionType());
     $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");
     // additional content editing information
     $this->addAdditionalContentEditingModeInformation($a_xml_writer);
     $this->addGeneralMetadata($a_xml_writer);
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "points_wrong");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPointsWrong());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "errortext");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getErrorText());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "textsize");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getTextSize());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "errordata");
     $serialized = array();
     foreach ($this->object->getErrorData() as $data) {
         array_push($serialized, array($data->text_correct, $data->text_wrong, $data->points));
     }
     $a_xml_writer->xmlElement("fieldentry", NULL, serialize($serialized));
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     $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;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, SINGLE_CHOICE_QUESTION_IDENTIFIER);
     $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");
     // additional content editing information
     $this->addAdditionalContentEditingModeInformation($a_xml_writer);
     $this->addGeneralMetadata($a_xml_writer);
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "thumb_size");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getThumbSize());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $attrs = array();
     $attrs = array("ident" => "MCSR", "rcardinality" => "Single");
     $a_xml_writer->xmlStartTag("response_lid", $attrs);
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     // shuffle output
     $attrs = array();
     if ($this->object->getShuffle()) {
         $attrs = array("shuffle" => "Yes");
     } else {
         $attrs = array("shuffle" => "No");
     }
     $a_xml_writer->xmlStartTag("render_choice", $attrs);
     $answers =& $this->object->getAnswers();
     $akeys = array_keys($answers);
     if ($this->object->getShuffle() && $a_shuffle) {
         $akeys = $this->object->pcArrayShuffle($akeys);
     }
     // add answers
     foreach ($akeys as $index) {
         $answer = $answers[$index];
         $attrs = array("ident" => $index);
         $a_xml_writer->xmlStartTag("response_label", $attrs);
         if (strlen($answer->getImage())) {
             $this->object->addQTIMaterial($a_xml_writer, $answer->getAnswertext(), FALSE, FALSE);
             $imagetype = "image/jpeg";
             if (preg_match("/.*\\.(png|gif)\$/", $answer->getImage(), $matches)) {
                 $imagetype = "image/" . $matches[1];
             }
             if ($force_image_references) {
                 $attrs = array("imagtype" => $imagetype, "label" => $answer->getImage(), "uri" => $this->object->getImagePathWeb() . $answer->getImage());
                 $a_xml_writer->xmlElement("matimage", $attrs);
             } else {
                 $imagepath = $this->object->getImagePath() . $answer->getImage();
                 $fh = @fopen($imagepath, "rb");
                 if ($fh != false) {
                     $imagefile = fread($fh, filesize($imagepath));
                     fclose($fh);
                     $base64 = base64_encode($imagefile);
                     $attrs = array("imagtype" => $imagetype, "label" => $answer->getImage(), "embedded" => "base64");
                     $a_xml_writer->xmlElement("matimage", $attrs, $base64, FALSE, FALSE);
                 }
             }
             $a_xml_writer->xmlEndTag("material");
         } else {
             $this->object->addQTIMaterial($a_xml_writer, $answer->getAnswertext());
         }
         $a_xml_writer->xmlEndTag("response_label");
     }
     $a_xml_writer->xmlEndTag("render_choice");
     $a_xml_writer->xmlEndTag("response_lid");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $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");
     // add response conditions
     foreach ($answers as $index => $answer) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $attrs = array();
         $attrs = array("respident" => "MCSR");
         $a_xml_writer->xmlElement("varequal", $attrs, $index);
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti setvar
         $attrs = array("action" => "Add");
         $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
         // qti displayfeedback
         $linkrefid = "response_{$index}";
         $attrs = array("feedbacktype" => "Response", "linkrefid" => $linkrefid);
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $feedback_allcorrect = $this->object->feedbackOBJ->getGenericFeedbackExportPresentation($this->object->getId(), true);
     if (strlen($feedback_allcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "MCSR");
         $a_xml_writer->xmlElement("varequal", $attrs, $bestindex);
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $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);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "MCSR");
         $a_xml_writer->xmlStartTag("not");
         $a_xml_writer->xmlElement("varequal", $attrs, $bestindex);
         $a_xml_writer->xmlEndTag("not");
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     // PART III: qti itemfeedback
     foreach ($answers as $index => $answer) {
         $linkrefid = "response_{$index}";
         $attrs = array("ident" => $linkrefid, "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $a_xml_writer->xmlStartTag("flow_mat");
         $fb = $this->object->feedbackOBJ->getSpecificAnswerFeedbackExportPresentation($this->object->getId(), $index);
         $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);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * adds a qti meta data field with given name and value to the passed xml writer
  * (xml writer must be in context of opened "qtimetadata" tag)
  * 
  * @final
  * @access protected
  * @param ilXmlWriter $a_xml_writer
  * @param string $fieldLabel
  * @param string $fieldValue
  */
 protected final function addQtiMetaDataField(ilXmlWriter $a_xml_writer, $fieldLabel, $fieldValue)
 {
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, $fieldLabel);
     $a_xml_writer->xmlElement("fieldentry", NULL, $fieldValue);
     $a_xml_writer->xmlEndTag("qtimetadatafield");
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, $this->object->getQuestionType());
     $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, "points");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPoints());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "maxsize");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getMaxSize());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "allowedextensions");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getAllowedExtensions());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     $this->exportFeedbackOnly($a_xml_writer);
     $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;
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, IMAGEMAP_QUESTION_IDENTIFIER);
     $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->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     $attrs = array("ident" => "IM", "rcardinality" => "Single");
     $a_xml_writer->xmlStartTag("response_xy", $attrs);
     $solution = $this->object->getSuggestedSolution(0);
     if (count($solution)) {
         if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
             $a_xml_writer->xmlStartTag("material");
             $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
             if (strcmp($matches[1], "") != 0) {
                 $intlink = $solution["internal_link"];
             }
             $attrs = array("label" => "suggested_solution");
             $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
             $a_xml_writer->xmlEndTag("material");
         }
     }
     $a_xml_writer->xmlStartTag("render_hotspot");
     $a_xml_writer->xmlStartTag("material");
     $imagetype = "image/jpeg";
     if (preg_match("/.*\\.(png|gif)\$/", $this->object->getImageFilename(), $matches)) {
         $imagetype = "image/" . $matches[1];
     }
     $attrs = array("imagtype" => $imagetype, "label" => $this->object->getImageFilename());
     if ($a_include_binary) {
         if ($force_image_references) {
             $attrs["uri"] = $this->object->getImagePathWeb() . $this->object->getImageFilename();
             $a_xml_writer->xmlElement("matimage", $attrs);
         } else {
             $attrs["embedded"] = "base64";
             $imagepath = $this->object->getImagePath() . $this->object->getImageFilename();
             $fh = fopen($imagepath, "rb");
             if ($fh == false) {
                 global $ilErr;
                 $ilErr->raiseError($this->object->lng->txt("error_open_image_file"), $ilErr->MESSAGE);
                 return;
             }
             $imagefile = fread($fh, filesize($imagepath));
             fclose($fh);
             $base64 = base64_encode($imagefile);
             $a_xml_writer->xmlElement("matimage", $attrs, $base64, FALSE, FALSE);
         }
     } else {
         $a_xml_writer->xmlElement("matimage", $attrs);
     }
     $a_xml_writer->xmlEndTag("material");
     // add answers
     foreach ($this->object->getAnswers() as $index => $answer) {
         $rared = "";
         switch ($answer->getArea()) {
             case "rect":
                 $rarea = "Rectangle";
                 break;
             case "circle":
                 $rarea = "Ellipse";
                 break;
             case "poly":
                 $rarea = "Bounded";
                 break;
         }
         $attrs = array("ident" => $index, "rarea" => $rarea);
         $a_xml_writer->xmlStartTag("response_label", $attrs);
         $a_xml_writer->xmlData($answer->getCoords());
         $a_xml_writer->xmlStartTag("material");
         $a_xml_writer->xmlElement("mattext", NULL, $answer->getAnswertext());
         $a_xml_writer->xmlEndTag("material");
         $a_xml_writer->xmlEndTag("response_label");
     }
     $a_xml_writer->xmlEndTag("render_hotspot");
     $a_xml_writer->xmlEndTag("response_xy");
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $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");
     // add response conditions
     foreach ($this->object->getAnswers() as $index => $answer) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         if (!$answer->isStateSet()) {
             $a_xml_writer->xmlStartTag("not");
         }
         $areatype = "";
         switch ($answer->getArea()) {
             case "rect":
                 $areatype = "Rectangle";
                 break;
             case "circle":
                 $areatype = "Ellipse";
                 break;
             case "poly":
                 $areatype = "Bounded";
                 break;
         }
         $attrs = array("respident" => "IM", "areatype" => $areatype);
         $a_xml_writer->xmlElement("varinside", $attrs, $answer->getCoords());
         if (!$answer->isStateSet()) {
             $a_xml_writer->xmlEndTag("not");
         }
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti setvar
         $attrs = array("action" => "Add");
         $a_xml_writer->xmlElement("setvar", $attrs, $answer->getPoints());
         $linkrefid = "response_{$index}";
         $attrs = array("feedbacktype" => "Response", "linkrefid" => $linkrefid);
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $answers = $this->object->getAnswers();
     $feedback_allcorrect = $this->object->getFeedbackGeneric(1);
     if (strlen($feedback_allcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "IM");
         $areatype = "";
         $answer = $answers[$bestindex];
         switch ($answer->getArea()) {
             case "rect":
                 $areatype = "Rectangle";
                 break;
             case "circle":
                 $areatype = "Ellipse";
                 break;
             case "poly":
                 $areatype = "Bounded";
                 break;
         }
         $attrs = array("respident" => "IM", "areatype" => $areatype);
         $a_xml_writer->xmlElement("varinside", $attrs, $answer->getCoords());
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_allcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $feedback_onenotcorrect = $this->object->getFeedbackGeneric(0);
     if (strlen($feedback_onenotcorrect)) {
         $attrs = array("continue" => "Yes");
         $a_xml_writer->xmlStartTag("respcondition", $attrs);
         // qti conditionvar
         $a_xml_writer->xmlStartTag("conditionvar");
         $bestindex = 0;
         $maxpoints = 0;
         foreach ($answers as $index => $answer) {
             if ($answer->getPoints() > $maxpoints) {
                 $maxpoints = $answer->getPoints();
                 $bestindex = $index;
             }
         }
         $attrs = array("respident" => "IM");
         $a_xml_writer->xmlStartTag("not");
         $areatype = "";
         $answer = $answers[$bestindex];
         switch ($answer->getArea()) {
             case "rect":
                 $areatype = "Rectangle";
                 break;
             case "circle":
                 $areatype = "Ellipse";
                 break;
             case "poly":
                 $areatype = "Bounded";
                 break;
         }
         $attrs = array("respident" => "IM", "areatype" => $areatype);
         $a_xml_writer->xmlElement("varinside", $attrs, $answer->getCoords());
         $a_xml_writer->xmlEndTag("not");
         $a_xml_writer->xmlEndTag("conditionvar");
         // qti displayfeedback
         $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
         $a_xml_writer->xmlElement("displayfeedback", $attrs);
         $a_xml_writer->xmlEndTag("respcondition");
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     // PART III: qti itemfeedback
     foreach ($this->object->getAnswers() as $index => $answer) {
         $linkrefid = "";
         $linkrefid = "response_{$index}";
         $attrs = array("ident" => $linkrefid, "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $a_xml_writer->xmlStartTag("flow_mat");
         $this->object->addQTIMaterial($a_xml_writer, $this->object->getFeedbackSingleAnswer($index));
         $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);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 function exportPDF($a_inst, $a_target_dir, &$expLog)
 {
     global $ilBench;
     $a_xml_writer = new ilXmlWriter();
     $a_xml_writer->xmlStartTag("ContentObject", array("Type" => "SCORM2004SCO"));
     $this->exportXMLMetaData($a_xml_writer);
     $tree = new ilTree($this->getId());
     $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
     $tree->setTreeTablePK("slm_id");
     foreach ($tree->getSubTree($tree->getNodeData($tree->getRootId()), true, 'sco') as $sco) {
         include_once "./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php";
         $sco_folder = $a_target_dir . "/" . $sco['obj_id'];
         ilUtil::makeDir($sco_folder);
         $node = new ilSCORM2004Sco($this, $sco['obj_id']);
         $node->exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, $expLog, $a_xml_writer);
     }
     if ($this->getAssignedGlossary() != 0) {
         ilUtil::makeDir($a_target_dir . "/glossary");
         include_once "./Modules/Glossary/classes/class.ilObjGlossary.php";
         include_once "./Modules/Glossary/classes/class.ilGlossaryExport.php";
         $glos = new ilObjGlossary($this->getAssignedGlossary(), false);
         $glos_export = new ilGlossaryExport($glos, "xml");
         $glos->exportXML($a_xml_writer, $glos_export->getInstId(), $a_target_dir . "/glossary", $expLog);
     }
     copy('./templates/default/images/icon_attachment_s.png', $a_target_dir . "/icon_attachment_s.png");
     $a_xml_writer->xmlEndTag("ContentObject");
     include_once 'Services/Transformation/classes/class.ilXML2FO.php';
     $xml2FO = new ilXML2FO();
     $xml2FO->setXSLTLocation('./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
     $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
     $xml2FO->setXSLTParams(array('target_dir' => $a_target_dir));
     $xml2FO->transform();
     $fo_string = $xml2FO->getFOString();
     $fo_xml = simplexml_load_string($fo_string);
     $fo_ext = $fo_xml->xpath("//fo:declarations");
     $fo_ext = $fo_ext[0];
     $results = array();
     include_once "./Services/Utilities/classes/class.ilFileUtils.php";
     ilFileUtils::recursive_dirscan($a_target_dir . "/objects", $results);
     if (is_array($results["file"])) {
         foreach ($results["file"] as $key => $value) {
             $e = $fo_ext->addChild("fox:embedded-file", "", "http://xml.apache.org/fop/extensions");
             $e->addAttribute("src", $results[path][$key] . $value);
             $e->addAttribute("name", $value);
             $e->addAttribute("desc", "");
         }
     }
     $fo_string = $fo_xml->asXML();
     $a_xml_writer->_XmlWriter;
     return $fo_string;
 }
 /**
  * To Xml.
  * This method writes only the subset Record (including all fields)
  * Use class.ilAdvancedMDRecordXMLWriter to generate a complete xml presentation.
  *
  * @access public
  * @param object ilXmlWriter
  * 
  */
 public function toXML(ilXmlWriter $writer)
 {
     $writer->xmlStartTag('Record', array('active' => $this->isActive() ? 1 : 0, 'id' => $this->generateImportId()));
     $writer->xmlElement('Title', null, $this->getTitle());
     $writer->xmlElement('Description', null, $this->getDescription());
     foreach ($this->getAssignedObjectTypes() as $obj_type) {
         $writer->xmlElement('ObjectType', null, $obj_type);
     }
     include_once 'Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php';
     foreach (ilAdvancedMDFieldDefinition::_getDefinitionsByRecordId($this->getRecordId()) as $definition) {
         $definition->toXML($writer);
     }
     $writer->xmlEndTag('Record');
 }
 /**
  * Get xml of object values
  *
  * @param ilXmlWriter $a_xml_writer 
  * @param int $a_obj_id
  */
 public static function _appendXMLByObjId(ilXmlWriter $a_xml_writer, $a_obj_id)
 {
     $a_xml_writer->xmlStartTag('AdvancedMetaData');
     self::preloadByObjIds(array($a_obj_id));
     $values_records = self::preloadedRead(ilObject::_lookupType($a_obj_id), $a_obj_id);
     foreach ($values_records as $values_record) {
         $defs = $values_record->getDefinitions();
         foreach ($values_record->getADTGroup()->getElements() as $element_id => $element) {
             $def = $defs[$element_id];
             $value = null;
             if (!$element->isNull()) {
                 $value = $def->getValueForXML($element);
             }
             $a_xml_writer->xmlElement('Value', array('id' => $def->getImportId()), $value);
         }
     }
     $a_xml_writer->xmlEndTag('AdvancedMetaData');
 }
 /**
  * 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
  *
  * @return string The QTI xml representation of the question
  * @access public
  */
 function toXML($a_include_header = true, $a_include_binary = true, $a_shuffle = false, $test_output = false, $force_image_references = false)
 {
     global $ilias;
     include_once "./Services/Xml/classes/class.ilXmlWriter.php";
     $a_xml_writer = new ilXmlWriter();
     // set xml header
     $a_xml_writer->xmlHeader();
     $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);
     // add question description
     $a_xml_writer->xmlElement("qticomment", NULL, $this->object->getComment());
     // add estimated working time
     $workingtime = $this->object->getEstimatedWorkingTime();
     $duration = sprintf("P0Y0M0DT%dH%dM%dS", $workingtime["h"], $workingtime["m"], $workingtime["s"]);
     $a_xml_writer->xmlElement("duration", NULL, $duration);
     // add ILIAS specific metadata
     $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->xmlElement("fieldentry", NULL, TEXTSUBSET_QUESTION_IDENTIFIER);
     $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, "textrating");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getTextRating());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "correctanswers");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getCorrectAnswers());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlStartTag("qtimetadatafield");
     $a_xml_writer->xmlElement("fieldlabel", NULL, "points");
     $a_xml_writer->xmlElement("fieldentry", NULL, $this->object->getPoints());
     $a_xml_writer->xmlEndTag("qtimetadatafield");
     $a_xml_writer->xmlEndTag("qtimetadata");
     $a_xml_writer->xmlEndTag("itemmetadata");
     // PART I: qti presentation
     $attrs = array("label" => $this->object->getTitle());
     $a_xml_writer->xmlStartTag("presentation", $attrs);
     // add flow to presentation
     $a_xml_writer->xmlStartTag("flow");
     // add material with question text to presentation
     $this->object->addQTIMaterial($a_xml_writer, $this->object->getQuestion());
     // add answers to presentation
     for ($counter = 1; $counter <= $this->object->getCorrectAnswers(); $counter++) {
         $attrs = array("ident" => "TEXTSUBSET_" . sprintf("%02d", $counter), "rcardinality" => "Single");
         $a_xml_writer->xmlStartTag("response_str", $attrs);
         $solution = $this->object->getSuggestedSolution(0);
         if (count($solution)) {
             if (preg_match("/il_(\\d*?)_(\\w+)_(\\d+)/", $solution["internal_link"], $matches)) {
                 $a_xml_writer->xmlStartTag("material");
                 $intlink = "il_" . IL_INST_ID . "_" . $matches[2] . "_" . $matches[3];
                 if (strcmp($matches[1], "") != 0) {
                     $intlink = $solution["internal_link"];
                 }
                 $attrs = array("label" => "suggested_solution");
                 $a_xml_writer->xmlElement("mattext", $attrs, $intlink);
                 $a_xml_writer->xmlEndTag("material");
             }
         }
         // shuffle output
         $attrs = array("fibtype" => "String", "columns" => $this->object->getMaxTextboxWidth());
         $a_xml_writer->xmlStartTag("render_fib", $attrs);
         $a_xml_writer->xmlEndTag("render_fib");
         $a_xml_writer->xmlEndTag("response_str");
     }
     $a_xml_writer->xmlEndTag("flow");
     $a_xml_writer->xmlEndTag("presentation");
     // PART II: qti resprocessing
     $a_xml_writer->xmlStartTag("resprocessing");
     $a_xml_writer->xmlStartTag("outcomes");
     $a_xml_writer->xmlStartTag("decvar");
     $a_xml_writer->xmlEndTag("decvar");
     $attribs = array("varname" => "matches", "defaultval" => "0");
     $a_xml_writer->xmlElement("decvar", $attribs, NULL);
     $a_xml_writer->xmlEndTag("outcomes");
     // add response conditions
     for ($counter = 1; $counter <= $this->object->getCorrectAnswers(); $counter++) {
         $scoregroups =& $this->object->joinAnswers();
         foreach ($scoregroups as $points => $scoreanswers) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $attrs = array("respident" => "TEXTSUBSET_" . sprintf("%02d", $counter));
             $a_xml_writer->xmlElement("varsubset", $attrs, join(",", $scoreanswers));
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti setvar
             $attrs = array("varname" => "matches", "action" => "Add");
             $a_xml_writer->xmlElement("setvar", $attrs, $points);
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "Matches_" . sprintf("%02d", $counter));
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
     }
     $feedback_allcorrect = $this->object->getFeedbackGeneric(1);
     $feedback_onenotcorrect = $this->object->getFeedbackGeneric(0);
     if (strlen($feedback_allcorrect . $feedback_onenotcorrect)) {
         if (strlen($feedback_allcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varsubset", $attrs, $this->object->getMaximumPoints());
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_allcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
         if (strlen($feedback_onenotcorrect)) {
             $attrs = array("continue" => "Yes");
             $a_xml_writer->xmlStartTag("respcondition", $attrs);
             // qti conditionvar
             $a_xml_writer->xmlStartTag("conditionvar");
             $a_xml_writer->xmlStartTag("not");
             $attrs = array("respident" => "points");
             $a_xml_writer->xmlElement("varsubset", $attrs, $this->object->getMaximumPoints());
             $a_xml_writer->xmlEndTag("not");
             $a_xml_writer->xmlEndTag("conditionvar");
             // qti displayfeedback
             $attrs = array("feedbacktype" => "Response", "linkrefid" => "response_onenotcorrect");
             $a_xml_writer->xmlElement("displayfeedback", $attrs);
             $a_xml_writer->xmlEndTag("respcondition");
         }
     }
     $a_xml_writer->xmlEndTag("resprocessing");
     // PART III: qti itemfeedback
     for ($counter = 1; $counter <= $this->object->getCorrectAnswers(); $counter++) {
         $attrs = array("ident" => "Matches_" . sprintf("%02d", $counter), "view" => "All");
         $a_xml_writer->xmlStartTag("itemfeedback", $attrs);
         // qti flow_mat
         $a_xml_writer->xmlStartTag("flow_mat");
         $a_xml_writer->xmlStartTag("material");
         $a_xml_writer->xmlElement("mattext");
         $a_xml_writer->xmlEndTag("material");
         $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);
         // qti flow_mat
         $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);
         // qti flow_mat
         $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;
 }
 /**
  * Export to xml
  * @param ilXmlWriter $writer
  * @return void
  */
 public function toXml(ilXmlWriter $writer)
 {
     $writer->xmlStartTag('blockRoleAction');
     switch ($this->getFilterType()) {
         case self::FILTER_SOURCE_OBJ_ID:
             $writer->xmlStartTag('roleFilter', array('source' => 'objId'));
             break;
         default:
         case self::FILTER_SOURCE_TITLE:
             $writer->xmlStartTag('roleFilter', array('source' => 'title'));
             break;
     }
     foreach ($this->getFilterPattern() as $pattern) {
         $pattern->toXml($writer);
     }
     $writer->xmlEndTag('roleFilter');
     $writer->xmlEndTag('blockRoleAction');
     return;
 }