4 require_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
32 function delete($a_delete_meta_data =
true)
34 $node_data = $this->tree->getNodeData($this->
getId());
36 $this->tree->deleteTree($node_data);
43 function create($a_upload =
false, $a_template =
false)
45 include_once(
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Item.php");
46 include_once(
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Objective.php");
59 $childs = $this->tree->getChilds($this->
getId());
60 foreach ($childs as $child)
65 if ($obj->getType() ==
"page")
67 $obj->delete($a_delete_meta_data);
78 function copy($a_target_slm)
82 if ($this->
getSLMId() != $a_target_slm->getId())
84 $ass->setImportId(
"il__ass_".$this->
getId());
86 $ass->setSLMId($a_target_slm->getId());
87 $ass->setType($this->
getType());
90 $a_copied_nodes[$this->
getId()] = $ass->getId();
93 include_once(
"Services/MetaData/classes/class.ilMD.php");
95 $new_md = $md->cloneMD($a_target_slm->getId(), $ass->getId(), $this->
getType());
104 copy(
'./xml/ilias_co_3_7.dtd',$a_target_dir.
'/ilias_co_3_7.dtd');
105 copy(
'./Modules/Scorm2004/templates/xsl/sco.xsl',$a_target_dir.
'/sco.xsl');
111 $metadata_xml = $a_xml_writer->xmlDumpMem(
false);
112 $a_xml_writer->_XmlWriter;
113 $xsl = file_get_contents(
"./Modules/Scorm2004/templates/xsl/metadata.xsl");
114 $args = array(
'/_xml' => $metadata_xml ,
'/_xsl' => $xsl );
116 $output =
xslt_process($xh,
"arg:/_xml",
"arg:/_xsl",NULL,$args,NULL);
118 file_put_contents($a_target_dir.
'/indexMD.xml',$output);
122 $a_xml_writer->
xmlSetDtdDef(
"<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
125 $a_xml_writer->xmlSetGenCmt(
"Export of ILIAS Content Module ". $this->
getId().
" of installation ".$a_inst.
".");
128 $a_xml_writer->xmlHeader();
132 $a_xml_writer->xmlStartTag(
"ContentObject", array(
"Type"=>
"SCORM2004SCO"));
140 $this->
exportHTML($a_inst, $a_target_dir, $expLog);
144 copy(
'./Modules/Scorm2004/scripts/scorm_12.js',$a_target_dir.
'/js/scorm.js');
146 $a_xml_writer->xmlEndTag(
"ContentObject");
148 $a_xml_writer->xmlDumpFile($a_target_dir.
'/index.xml',
false);
150 $a_xml_writer->_XmlWriter;
155 $objectives_text =
"";
159 foreach ($tr_data as
$data)
161 $objectives_text.= $data->getObjectiveID();
163 $a_xml_writer->xmlStartTag(
"sco");
164 $a_xml_writer->xmlElement(
"objective", null, $objectives_text);
165 $a_xml_writer->xmlEndTag(
"sco");
166 $a_xml_writer->xmlDumpFile($a_target_dir.
'/sco.xml',
false);
167 $a_xml_writer->_XmlWriter;
172 function exportHTML($a_inst, $a_target_dir, &$expLog, $a_asset_type =
"sco",
176 $this->slm_object->prepareHTMLExporter($a_target_dir);
178 $a_asset_type, $a_one_file);
195 $a_xml_writer->
xmlStartTag(
"ContentObject", array(
"Type"=>
"SCORM2004SCO"));
197 $a_xml_writer->xmlEndTag(
"ContentObject");
198 copy(
'./templates/default/images/icon_attachment_s.png',$a_target_dir.
"/icon_attachment_s.png");
199 include_once
'Services/Transformation/classes/class.ilXML2FO.php';
201 $xml2FO->setXSLTLocation(
'./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
202 $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
203 $xml2FO->setXSLTParams(array (
'target_dir' => $a_target_dir));
204 $xml2FO->transform();
205 $fo_string = $xml2FO->getFOString();
206 $fo_xml = simplexml_load_string($fo_string);
207 $fo_ext = $fo_xml->xpath(
"//fo:declarations");
208 $fo_ext = $fo_ext[0];
210 include_once
"./Services/Utilities/classes/class.ilFileUtils.php";
214 foreach (
$results[
"file"] as $key => $value)
216 $e = $fo_ext->addChild(
"fox:embedded-file",
"",
"http://xml.apache.org/fop/extensions");
217 $e->addAttribute(
"src",
$results[path][$key].$value);
218 $e->addAttribute(
"name",$value);
219 $e->addAttribute(
"desc",
"");
222 $fo_string = $fo_xml->asXML();
223 $a_xml_writer->_XmlWriter;
236 include_once
"./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
237 include_once
"./Modules/Scorm2004/classes/class.ilSCORM2004Page.php";
239 $tree =
new ilTree($this->slm_id);
240 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
241 $tree->setTreeTablePK(
"slm_id");
242 foreach($tree->getSubTree($tree->getNodeData($this->getId()),
true,
'page') as $page)
246 if (count($q_ids) > 0)
248 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
249 foreach ($q_ids as $q_id)
252 $qti_file = fopen($a_target_dir.
"/qti_".$q_id.
".xml",
"w");
253 fwrite($qti_file, $q_obj->toXML());
255 $x = file_get_contents($a_target_dir.
"/qti_".$q_id.
".xml");
256 $x = str_replace(
'<?xml version="1.0" encoding="utf-8"?>',
'', $x);
257 $a_xml_writer->appendXML($x);
268 $a_asset_type =
"sco", $a_one_file =
"", $a_sco_tpl = null)
272 include_once
"./Modules/Scorm2004/classes/class.ilSCORM2004PageGUI.php";
273 include_once
"./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModuleGUI.php";
274 include_once
"./Services/MetaData/classes/class.ilMD.php";
277 $tree =
new ilTree($this->slm_id);
278 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
279 $tree->setTreeTablePK(
"slm_id");
294 $sco_tpl =
new ilTemplate(
"tpl.sco.html",
true,
true,
"Modules/Scorm2004");
301 if ($mode !=
'pdf' && $a_one_file ==
"")
303 include_once(
"./Services/COPage/classes/class.ilCOPageHTMLExport.php");
305 $pg_exp->getPreparedMainTemplate($sco_tpl);
309 $sco_tpl->setCurrentBlock(
"init");
310 $sco_tpl->setVariable(
"TXT_INIT_CODE",
312 $sco_tpl->parseCurrentBlock();
315 $styles = array(
"./css/yahoo/container.css",
316 "./css/question_handling.css");
317 foreach ($styles as $style)
319 $sco_tpl->setCurrentBlock(
"css_file");
320 $sco_tpl->setVariable(
"CSS_FILE", $style);
321 $sco_tpl->parseCurrentBlock();
325 $scripts = array(
"./js/scorm.js",
326 "./js/pager.js",
"./js/pure.js",
327 "./js/questions_".$this->
getId().
".js");
328 foreach ($scripts as $script)
330 $sco_tpl->setCurrentBlock(
"js_file");
331 $sco_tpl->setVariable(
"JS_FILE", $script);
332 $sco_tpl->parseCurrentBlock();
335 if ($a_asset_type !=
"entry_asset" && $a_asset_type !=
"final_asset")
340 $sco_tpl->touchBlock(
"finish");
343 $sco_tpl->setCurrentBlock(
"head");
344 $sco_tpl->setVariable(
"SCO_TITLE", $this->
getTitle());
345 $sco_tpl->parseCurrentBlock();
346 $sco_tpl->touchBlock(
"tail");
350 if ($a_one_file !=
"")
352 fputs($a_one_file,
"<a name='sco".$this->
getId().
"'></a>");
353 fputs($a_one_file, $sco_tpl->get(
"meta_page"));
357 require_once
'./Modules/Scorm2004/classes/class.ilQuestionExporter.php';
364 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004ScoGUI.php");
365 $pages = $tree->getSubTree($tree->getNodeData($this->getId()),
true,
'page');
366 $sco_q_ids = array();
367 foreach($pages as $page)
371 $this->slm_object->getId());
374 $page_obj->setStyleId($this->slm_object->getStyleSheetId());
375 if (count($terms) > 1)
377 $page_obj->setGlossaryOverviewInfo(
381 $page_output = $page_obj->showPage(
"export");
384 $mob_ids = $page_obj->getSCORM2004Page()->collectMediaObjects(
false);
385 foreach($mob_ids as $mob_id)
387 $this->mob_ids[$mob_id] = $mob_id;
389 if($media_obj->hasFullscreenItem())
390 $media_obj->exportMediaFullscreen($a_target_dir, $page_obj->getPageObject());
394 $int_links = $page_obj->getPageObject()->getInternalLinks(
true);
395 include_once(
"./Services/COPage/classes/class.ilInternalLink.php");
396 include_once(
"./Modules/Glossary/classes/class.ilGlossaryDefinition.php");
397 include_once(
"./Services/COPage/classes/class.ilPageObject.php");
398 if (is_array($int_links))
400 foreach ($int_links as $k => $e)
403 if ($e[
"Type"] ==
"GlossaryItem")
405 $karr = explode(
":", $k);
408 foreach ($dids as $did)
412 $mob_ids = $def_pg->collectMediaObjects(
false);
413 foreach($mob_ids as $mob_id)
415 $this->mob_ids[$mob_id] = $mob_id;
418 if($media_obj->hasFullscreenItem())
419 $media_obj->exportMediaFullscreen($a_target_dir, $def_pg);
421 $file_ids = $def_pg->collectFileItems();
422 foreach($file_ids as $file_id)
424 $this->file_ids[$file_id] = $file_id;
432 $file_ids = $page_obj->getSCORM2004Page()->collectFileItems();
433 foreach($file_ids as $file_id)
435 $this->file_ids[$file_id] = $file_id;
441 foreach ($q_ids as $q_id)
443 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestionGUI.php");
445 $q_gui->outAdditionalOutput();
446 $html = $q_gui->getPreview(TRUE);
447 $page_output = preg_replace(
"/{{{{{Question;il__qst_".$q_id.
"}}}}}/i",$html,$page_output);
450 $sco_tpl->touchBlock(
"pdf_pg_break");
453 $sco_tpl->setCurrentBlock(
"page");
454 $sco_tpl->setVariable(
"PAGE", $page_output);
455 $sco_tpl->parseCurrentBlock();
458 if ($a_one_file !=
"")
461 foreach ($q_ids as $i)
463 if (!in_array($i, $sco_q_ids))
474 $sco_tpl->setVariable(
"GLOSSARY_HTML",
478 if ($a_one_file ==
"")
480 $output = $sco_tpl->get();
484 $output = $sco_tpl->get(
"page");
488 $output = preg_replace(
"/<div class=\"ilc_page_title_PageTitle\">(.*?)<\/div>/i",
"<h2>$1</h2>",$output);
491 $output = preg_replace(
"/mobs\/mm_(\d+)\/([^\"]+)/i",
"./objects/il_".IL_INST_ID.
"_mob_$1/$2",$output);
492 $output = preg_replace(
"/\.\/files\/file_(\d+)\/([^\"]+)/i",
"./objects/il_".IL_INST_ID.
"_file_$1/$2",$output);
493 $output = preg_replace(
"/\.\/Services\/MediaObjects\/flash_mp3_player/i",
"./players",$output);
495 $output = preg_replace(
"/file=..\/..\/..\/.\//i",
"file=../",$output);
499 $output = preg_replace_callback(
"/href=\"&mob_id=(\d+)&pg_id=(\d+)\"/",array(get_class($this),
'fixFullscreeenLink'),$output);
501 $output = preg_replace_callback(
"/href=\"fullscreen_(\d+)\.html\"/",array(get_class($this),
'fixFullscreeenLink'),$output);
502 $output = preg_replace_callback(
"/{{{{{(Question;)(il__qst_[0-9]+)}}}}}/",array(get_class($this),
'insertQuestion'),$output);
505 $q_handling = file_get_contents(
'./Modules/Scorm2004/scripts/questions/question_handling.js');
507 copy(
"./Modules/Scorm2004/templates/default/question_handling.css",
508 $a_target_dir.
'/css/question_handling.css');
511 if ($a_one_file !=
"")
513 $output =
'<script type="text/javascript">'.ilQuestionExporter::questionsJS().
'</script>'.$output;
514 if (count($sco_q_ids) > 0)
516 $output.=
'<script type="text/javascript">';
517 foreach ($sco_q_ids as $i)
521 $output.=
"ilias.questions.showCorrectAnswers(".$i.
"); \n";
524 $output.=
'</script>';
530 $this->mob_ids[$mob_id] = $mob_id;
536 if ($a_one_file !=
"")
538 fputs($a_one_file, $output);
542 fputs(fopen($a_target_dir.
'/index.html',
'w+'),$output);
559 if ($a_spacer_img ==
"")
565 $a_lang = $lng->getLangKey();
568 $a_tpl->setCurrentBlock(
"ilLMNavigation");
569 $a_tpl->setVariable(
"TXT_PREVIOUS", $lng->txtlng(
"content",
'scplayer_previous', $a_lang));
570 $a_tpl->setVariable(
"SRC_SPACER", $a_spacer_img);
571 $a_tpl->setVariable(
"TXT_NEXT", $lng->txtlng(
"content",
'scplayer_next', $a_lang));
572 $a_tpl->parseCurrentBlock();
573 $a_tpl->setCurrentBlock(
"ilLMNavigation2");
574 $a_tpl->setVariable(
"TXT_PREVIOUS", $lng->txtlng(
"content",
'scplayer_previous', $a_lang));
575 $a_tpl->setVariable(
"SRC_SPACER", $a_spacer_img);
576 $a_tpl->setVariable(
"TXT_NEXT", $lng->txtlng(
"content",
'scplayer_next', $a_lang));
577 $a_tpl->parseCurrentBlock();
592 if ($a_sco->getType() !=
"sco" || $a_sco->getHideObjectivePage())
597 if ($a_asset_type !=
"entry_asset" && $a_asset_type !=
"final_asset")
599 $meta =
new ilMD($a_sco->getSLMId(), $a_sco->getId(), $a_sco->getType());
600 $desc_ids = $meta->
getGeneral()->getDescriptionIds();
601 $sco_description = $meta->getGeneral()->getDescription($desc_ids[0])->getDescription();
607 if ($a_asset_type !=
"entry_asset" && $a_asset_type !=
"final_asset")
609 $a_tpl->setCurrentBlock(
"title");
610 $a_tpl->setVariable(
"SCO_TITLE", $a_sco->getTitle());
611 $a_tpl->parseCurrentBlock();
617 $a_tpl->setCurrentBlock(
"pdf_title");
618 $a_tpl->setVariable(
"SCO_TITLE", $a_sco->getTitle());
619 $a_tpl->parseCurrentBlock();
620 $a_tpl->touchBlock(
"pdf_break");
624 if (trim($sco_description) !=
"")
626 $a_tpl->setCurrentBlock(
"sco_desc");
627 $a_tpl->setVariable(
"TXT_DESC", $lng->txt(
"description"));
628 include_once(
"./Services/COPage/classes/class.ilPCParagraph.php");
629 $a_tpl->setVariable(
"VAL_DESC", self::convertLists($sco_description));
630 $a_tpl->parseCurrentBlock();
633 if ($a_asset_type ==
"sco")
636 $objs = $a_sco->getObjectives();
637 if (count($objs) > 0)
639 foreach ($objs as $objective)
641 $a_tpl->setCurrentBlock(
"sco_obj");
642 $a_tpl->setVariable(
"VAL_OBJECTIVE", self::convertLists($objective->getObjectiveID()));
643 $a_tpl->parseCurrentBlock();
645 $a_tpl->setCurrentBlock(
"sco_objs");
646 $a_tpl->setVariable(
"TXT_OBJECTIVES", $lng->txt(
"sahs_objectives"));
647 $a_tpl->parseCurrentBlock();
650 $a_tpl->setCurrentBlock(
"meta_page");
651 $a_tpl->parseCurrentBlock();
663 include_once(
"./Services/COPage/classes/class.ilPCParagraph.php");
664 $a_text = nl2br($a_text);
665 $a_text = str_replace(array(
"\n",
"\r"),
"", $a_text);
666 $a_text = str_replace(
"<br>",
"<br />", $a_text);
668 $a_text = str_replace(
669 array(
"<SimpleBulletList>",
"</SimpleBulletList>",
670 "<SimpleListItem>",
"</SimpleListItem>",
671 "<SimpleNumberedList>",
"</SimpleNumberedList>"
673 array(
"<ul class='ilc_list_u_BulletedList'>",
"</ul>",
674 "<li class='ilc_list_item_StandardListItem'>",
"</li>",
675 "<ol class='ilc_list_o_NumberedList'>",
"</ol>"
684 if($media_obj->hasFullscreenItem())
686 return "href=\"./objects/il_".IL_INST_ID.
"_mob_".$matches[1].
"/fullscreen.html\"";
695 $ret = $q_exporter->exportQuestion($matches[2],
"./objects/");
704 include_once
"./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
705 include_once
"./Modules/Scorm2004/classes/class.ilSCORM2004Page.php";
707 $tree =
new ilTree($this->slm_id);
708 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
709 $tree->setTreeTablePK(
"slm_id");
711 $pages = $tree->getSubTree($tree->getNodeData($this->getId()),
true,
'page');
712 foreach($pages as $page)
714 $expLog->write(date(
"[y-m-d H:i:s] ").
"Page Object ".$page[
"obj_id"]);
718 $page_obj->exportXML($a_xml_writer,
"normal", $a_inst);
721 $mob_ids = $page_obj->getMediaObjectIds();
722 foreach($mob_ids as $mob_id)
724 $this->mob_ids[$mob_id] = $mob_id;
728 $file_ids = $page_obj->getFileItemIds();
729 foreach($file_ids as $file_id)
731 $this->file_ids[$file_id] = $file_id;
735 if (count($q_ids) > 0)
737 include_once(
"./Modules/TestQuestionPool/classes/class.assQuestion.php");
738 foreach ($q_ids as $q_id)
741 $qti_file = fopen($a_target_dir.
"/qti_".$q_id.
".xml",
"w");
742 fwrite($qti_file, $q_obj->toXML());
754 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
755 include_once(
"./Modules/File/classes/class.ilObjFile.php");
756 $linked_mobs = array();
757 if(is_array($this->mob_ids ))
760 foreach ($this->mob_ids as $mob_id)
764 $expLog->write(date(
"[y-m-d H:i:s] ").
"Media Object ".$mob_id);
766 $media_obj->exportXML($a_xml_writer, $a_inst);
767 $lmobs = $media_obj->getLinkedMediaObjects($this->mob_ids);
768 $linked_mobs = array_merge($linked_mobs, $lmobs);
774 foreach ($linked_mobs as $mob_id)
778 $expLog->write(date(
"[y-m-d H:i:s] ").
"Media Object ".$mob_id);
780 $media_obj->exportXML($a_xml_writer, $a_inst);
785 if(is_array($this->file_ids))
786 foreach ($this->file_ids as $file_id)
788 $expLog->write(date(
"[y-m-d H:i:s] ").
"File Item ".$file_id);
789 $file_obj =
new ilObjFile($file_id,
false);
790 $file_obj->export($a_target_dir);
802 include_once(
"./Modules/File/classes/class.ilObjFile.php");
803 if(is_array($this->file_ids))
804 foreach ($this->file_ids as $file_id)
806 $expLog->write(date(
"[y-m-d H:i:s] ").
"File Item ".$file_id);
809 $file_obj =
new ilObjFile($file_id,
false);
810 $file_obj->export($a_target_dir);
815 $expLog->write(date(
"[y-m-d H:i:s] ").
"File Item not found, ID: ".$file_id);
819 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
820 $linked_mobs = array();
821 if(is_array($this->mob_ids ))
824 foreach ($this->mob_ids as $mob_id)
828 $expLog->write(date(
"[y-m-d H:i:s] ").
"Media Object ".$mob_id);
830 $media_obj->exportFiles($a_target_dir, $expLog);
831 $lmobs = $media_obj->getLinkedMediaObjects($this->mob_ids);
832 $linked_mobs = array_merge($linked_mobs, $lmobs);
839 foreach ($linked_mobs as $mob_id)
843 $expLog->write(date(
"[y-m-d H:i:s] ").
"Media Object ".$mob_id);
845 $media_obj->exportFiles($a_target_dir);
852 foreach ($this->q_media as $media) {
855 copy($media, $a_target_dir.
"/objects/".basename($media));
867 include_once(
"Services/MetaData/classes/class.ilMD2XML.php");
869 $md2xml->setExportMode(
true);
870 $md2xml->startExport();
871 $a_xml_writer->appendXML($md2xml->getXML());
878 require_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Export.php");
880 $export =
new ilSCORM2004Export($this);
881 foreach ($export->getSupportedExportTypes() as
$type)
883 $dir = $export->getExportDirectoryForType(
$type);
885 if (!@is_dir($dir) or !is_writeable($dir))
893 while ($entry = $cdir->read())
895 if ($entry !=
"." and
898 ereg(
"^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)".$this->
getId().
"+\.zip\$", $entry) or
899 ereg(
"^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)".$this->
getId().
"+\.pdf\$", $entry) or
900 ereg(
"^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)".$this->
getId().
"+\.iso\$", $entry)
903 $file[$entry.$type] = array(
"type" =>
$type,
"file" => $entry,
904 "size" => filesize($dir.
"/".$entry));
926 include_once(
"./Modules/Glossary/classes/class.ilGlossaryTerm.php");
927 $childs = $this->tree->getChilds($this->
getId());
929 foreach ($childs as $c)
933 foreach ($links as $l)
935 if ($l[
"type"] ==
"git" && (
int) $l[
"inst"] == 0 && !isset($ids[$l[
"id"]]))