ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilSCORM2004Asset.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once("./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
5
17{
21 protected $tpl;
22
26 protected $lng;
27
31 protected $ctrl;
32
33 public $q_media = null; // media files in questions
34
38 public function __construct($a_slm_object, $a_id = 0)
39 {
40 global $DIC;
41
42 $this->tpl = $DIC["tpl"];
43 $this->lng = $DIC->language();
44 $this->ctrl = $DIC->ctrl();
45 parent::__construct($a_slm_object, $a_id);
46 $this->setType("ass");
47 }
48
52 public function delete($a_delete_meta_data = true)
53 {
54 $node_data = $this->tree->getNodeData($this->getId());
55 $this->delete_rec($a_delete_meta_data);
56 $this->tree->deleteTree($node_data);
57 parent::deleteSeqInfo();
58 }
59
63 public function create($a_upload = false, $a_template = false)
64 {
65 include_once("./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Item.php");
66 include_once("./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Objective.php");
67 parent::create($a_upload);
68 if (!$a_template) {
70 }
71 }
72
80 {
81 $seq_item = new ilSCORM2004Item($this->getId());
82 $seq_item->insert();
83 }
84
85
89 private function delete_rec($a_delete_meta_data = true)
90 {
91 $childs = $this->tree->getChilds($this->getId());
92 foreach ($childs as $child) {
93 $obj = ilSCORM2004NodeFactory::getInstance($this->slm_object, $child["obj_id"], false);
94 if (is_object($obj)) {
95 if ($obj->getType() == "page") {
96 $obj->delete($a_delete_meta_data);
97 }
98 }
99 unset($obj);
100 }
101 parent::delete($a_delete_meta_data);
102 }
103
107 public function copy($a_target_slm)
108 {
109 $ass = new ilSCORM2004Asset($a_target_slm);
110 $ass->setTitle($this->getTitle());
111 if ($this->getSLMId() != $a_target_slm->getId()) {
112 $ass->setImportId("il__ass_" . $this->getId());
113 }
114 $ass->setSLMId($a_target_slm->getId());
115 $ass->setType($this->getType());
116 $ass->setDescription($this->getDescription());
117 $ass->create(true);
118 $a_copied_nodes[$this->getId()] = $ass->getId();
119
120 // copy meta data
121 include_once("Services/MetaData/classes/class.ilMD.php");
122 $md = new ilMD($this->getSLMId(), $this->getId(), $this->getType());
123 $new_md = $md->cloneMD($a_target_slm->getId(), $ass->getId(), $this->getType());
124
125 return $ass;
126 }
127
128 // @todo: more stuff similar to ilSCORM2004Chapter needed...
129
130 public function exportScorm($a_inst, $a_target_dir, $ver, &$expLog)
131 {
132 copy('./xml/ilias_co_3_7.dtd', $a_target_dir . '/ilias_co_3_7.dtd');
133 copy('./Modules/Scorm2004/templates/xsl/sco.xsl', $a_target_dir . '/sco.xsl');
134
135 $a_xml_writer = new ilXmlWriter;
136 // MetaData
137 //file_put_contents($a_target_dir.'/indexMD.xml','<lom xmlns="http://ltsc.ieee.org/xsd/LOM"><general/><classification/></lom>');
138 $this->exportXMLMetaData($a_xml_writer);
139 $metadata_xml = $a_xml_writer->xmlDumpMem(false);
140 $a_xml_writer->_XmlWriter;
141 $xsl = file_get_contents("./Modules/Scorm2004/templates/xsl/metadata.xsl");
142 $args = array( '/_xml' => $metadata_xml , '/_xsl' => $xsl );
143 $xh = xslt_create();
144 $output = xslt_process($xh, "arg:/_xml", "arg:/_xsl", null, $args, null);
145 xslt_free($xh);
146 file_put_contents($a_target_dir . '/indexMD.xml', $output);
147
148 $a_xml_writer = new ilXmlWriter;
149 // set dtd definition
150 $a_xml_writer->xmlSetDtdDef("<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
151
152 // set generated comment
153 $a_xml_writer->xmlSetGenCmt("Export of ILIAS Content Module " . $this->getId() . " of installation " . $a_inst . ".");
154
155 // set xml header
156 $a_xml_writer->xmlHeader();
157
158 $a_xml_writer->xmlStartTag("ContentObject", array("Type" => "SCORM2004SCO"));
159
160 $this->exportXMLMetaData($a_xml_writer);
161
162 $this->exportXMLPageObjects($a_target_dir, $a_xml_writer, $a_inst, $expLog);
163
164 $this->exportXMLMediaObjects($a_xml_writer, $a_inst, $a_target_dir, $expLog);
165
166 $this->exportHTML($a_inst, $a_target_dir, $expLog);
167
168 //overwrite scorm.js for scrom 1.2
169 if ($ver == "12") {
170 copy('./Modules/Scorm2004/scripts/scorm_12.js', $a_target_dir . '/js/scorm.js');
171 }
172
173 $a_xml_writer->xmlEndTag("ContentObject");
174
175 $a_xml_writer->xmlDumpFile($a_target_dir . '/index.xml', false);
176
177 $a_xml_writer->_XmlWriter;
178
179 // export sco data (currently only objective) to sco.xml
180 if ($this->getType() == "sco") {
181 $objectives_text = "";
182 $a_xml_writer = new ilXmlWriter;
183
184 $tr_data = $this->getObjectives();
185 foreach ($tr_data as $data) {
186 $objectives_text .= $data->getObjectiveID();
187 }
188 $a_xml_writer->xmlStartTag("sco");
189 $a_xml_writer->xmlElement("objective", null, $objectives_text);
190 $a_xml_writer->xmlEndTag("sco");
191 $a_xml_writer->xmlDumpFile($a_target_dir . '/sco.xml', false);
192 $a_xml_writer->_XmlWriter;
193 }
194 }
195
196
197 public function exportHTML(
198 $a_inst,
199 $a_target_dir,
200 &$expLog,
201 $a_asset_type = "sco",
202 $a_one_file = ""
203 ) {
204 $this->slm_object->prepareHTMLExporter($a_target_dir);
206 $a_inst,
207 $a_target_dir,
208 $expLog,
209 'full',
210 $a_asset_type,
211 $a_one_file
212 );
213 }
214
215
216 public function exportHTML4PDF($a_inst, $a_target_dir, &$expLog)
217 {
218 ilUtil::makeDir($a_target_dir . '/css');
219 ilUtil::makeDir($a_target_dir . '/objects');
220 ilUtil::makeDir($a_target_dir . '/images');
221 $this->exportHTMLPageObjects($a_inst, $a_target_dir, $expLog, 'pdf');
222 }
223
224 public function exportPDF($a_inst, $a_target_dir, &$expLog)
225 {
229 $a_xml_writer = new ilXmlWriter;
230 $a_xml_writer->xmlStartTag("ContentObject", array("Type" => "SCORM2004SCO"));
231 $this->exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, $expLog, $a_xml_writer);
232 $a_xml_writer->xmlEndTag("ContentObject");
233 include_once 'Services/Transformation/classes/class.ilXML2FO.php';
234 $xml2FO = new ilXML2FO();
235 $xml2FO->setXSLTLocation('./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
236 $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
237 $xml2FO->setXSLTParams(array('target_dir' => $a_target_dir));
238 $xml2FO->transform();
239 $fo_string = $xml2FO->getFOString();
240 $fo_xml = simplexml_load_string($fo_string);
241 $fo_ext = $fo_xml->xpath("//fo:declarations");
242 $fo_ext = $fo_ext[0];
243 $results = array();
244 include_once "./Services/Utilities/classes/class.ilFileUtils.php";
245 ilFileUtils::recursive_dirscan($a_target_dir . "/objects", $results);
246 if (is_array($results["file"])) {
247 foreach ($results["file"] as $key => $value) {
248 $e = $fo_ext->addChild("fox:embedded-file", "", "http://xml.apache.org/fop/extensions");
249 $e->addAttribute("src", $results[path][$key] . $value);
250 $e->addAttribute("name", $value);
251 $e->addAttribute("desc", "");
252 }
253 }
254 $fo_string = $fo_xml->asXML();
255 $a_xml_writer->_XmlWriter;
256 return $fo_string;
257 }
258
259 public function exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, &$expLog, &$a_xml_writer)
260 {
261 $this->exportHTML4PDF($a_inst, $a_target_dir, $expLog);
265 $this->exportXMLPageObjects($a_target_dir, $a_xml_writer, $a_inst, $expLog);
266 $this->exportXMLMediaObjects($a_xml_writer, $a_inst, $a_target_dir, $expLog);
267 $this->exportFileItems($a_target_dir, $expLog);
268
269 include_once "./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
270 include_once "./Modules/Scorm2004/classes/class.ilSCORM2004Page.php";
271
272 $tree = new ilTree($this->slm_id);
273 $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
274 $tree->setTreeTablePK("slm_id");
275 foreach ($tree->getSubTree($tree->getNodeData($this->getId()), true, 'page') as $page) {
276 $page_obj = new ilSCORM2004Page($page["obj_id"]);
277
278 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
279 $q_ids = ilPCQuestion::_getQuestionIdsForPage("sahs", $page["obj_id"]);
280 if (count($q_ids) > 0) {
281 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
282 foreach ($q_ids as $q_id) {
283 $q_obj = assQuestion::_instanciateQuestion($q_id);
284 $qti_file = fopen($a_target_dir . "/qti_" . $q_id . ".xml", "w");
285 fwrite($qti_file, $q_obj->toXML());
286 fclose($qti_file);
287 $x = file_get_contents($a_target_dir . "/qti_" . $q_id . ".xml");
288 $x = str_replace('<?xml version="1.0" encoding="utf-8"?>', '', $x);
289 $a_xml_writer->appendXML($x);
290 }
291 }
292 unset($page_obj);
293 }
294 }
295
299 public function exportHTMLPageObjects(
300 $a_inst,
301 $a_target_dir,
302 &$expLog,
303 $mode,
304 $a_asset_type = "sco",
305 $a_one_file = "",
306 $a_sco_tpl = null
307 ) {
308 include_once "./Modules/Scorm2004/classes/class.ilSCORM2004PageGUI.php";
309 include_once "./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModuleGUI.php";
310 include_once "./Services/MetaData/classes/class.ilMD.php";
311
312 $tree = new ilTree($this->slm_id);
313 $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
314 $tree->setTreeTablePK("slm_id");
315
316 // @todo
317 // Why is that much HTML code in an application class?
318 // Please extract all this HTML to a tpl.<t_name>.html file and use
319 // placeholders and the template engine to insert data.
320 //
321 // There copy/paste code residenting in ilSCORM2004ScoGUI. This
322 // should be merged.
323 //
324 // alex, 4 Apr 09
325 //
326
327 // if ($a_one_file == "")
328 // {
329 $sco_tpl = new ilTemplate("tpl.sco.html", true, true, "Modules/Scorm2004");
330 // }
331 // else
332 // {
333 // $sco_tpl = $a_sco_tpl;
334 // }
335
336 if ($mode != 'pdf' && $a_one_file == "") {
337 include_once("./Services/COPage/classes/class.ilCOPageHTMLExport.php");
338 $pg_exp = new ilCOPageHTMLExport($a_target_dir);
339 $pg_exp->getPreparedMainTemplate($sco_tpl);
340
341 // init and question lang vars
343 $sco_tpl->setCurrentBlock("init");
344 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
345 $sco_tpl->setVariable(
346 "TXT_INIT_CODE",
348 );
349 $sco_tpl->parseCurrentBlock();
350
351 // (additional) style sheets needed
352 $styles = array("./css/yahoo/container.css",
353 "./css/question_handling.css");
354 foreach ($styles as $style) {
355 $sco_tpl->setCurrentBlock("css_file");
356 $sco_tpl->setVariable("CSS_FILE", $style);
357 $sco_tpl->parseCurrentBlock();
358 }
359
360 // (additional) scripts needed
361 $scripts = array("./js/scorm.js",
362 "./js/pager.js", "./js/pure.js",
363 "./js/questions_" . $this->getId() . ".js");
364 foreach ($scripts as $script) {
365 $sco_tpl->setCurrentBlock("js_file");
366 $sco_tpl->setVariable("JS_FILE", $script);
367 $sco_tpl->parseCurrentBlock();
368 }
369
370 if ($a_asset_type != "entry_asset" && $a_asset_type != "final_asset") {
371 self::renderNavigation($sco_tpl, "./images/spacer.png", $lk);
372 }
373
374 $sco_tpl->touchBlock("finish");
375 }
376 // render head
377 $sco_tpl->setCurrentBlock("head");
378 $sco_tpl->setVariable("SCO_TITLE", $this->getTitle());
379 $sco_tpl->parseCurrentBlock();
380 $sco_tpl->touchBlock("tail");
381
382 // meta page (meta info at SCO beginning)
383 self::renderMetaPage($sco_tpl, $this, $a_asset_type, $mode);
384 if ($a_one_file != "") {
385 fputs($a_one_file, "<a name='sco" . $this->getId() . "'></a>");
386 fputs($a_one_file, $sco_tpl->get("meta_page"));
387 }
388
389 //notify Question Exporter of new SCO
390 require_once './Modules/Scorm2004/classes/class.ilQuestionExporter.php';
392
393 // init export (this initialises glossary template)
395 $terms = array();
396 $terms = $this->getGlossaryTermIds();
397 include_once("./Modules/Scorm2004/classes/class.ilSCORM2004ScoGUI.php");
398 $pages = $tree->getSubTree($tree->getNodeData($this->getId()), true, 'page');
399 $sco_q_ids = array();
400 foreach ($pages as $page) {
401 //echo(print_r($page));
402 $page_obj = new ilSCORM2004PageGUI(
403 $this->getType(),
404 $page["obj_id"],
405 0,
406 $this->slm_object->getId()
407 );
408 $page_obj->setPresentationTitle($page["title"]);
409 $page_obj->setOutputMode(IL_PAGE_OFFLINE);
410 $page_obj->setStyleId($this->slm_object->getStyleSheetId());
411 if (count($terms) > 1) {
412 $page_obj->setGlossaryOverviewInfo(
414 $this
415 );
416 }
417
418 $page_output = $page_obj->showPage("export");
419
420 // collect media objects
421 $mob_ids = $page_obj->getSCORM2004Page()->collectMediaObjects(false);
422 foreach ($mob_ids as $mob_id) {
423 $this->mob_ids[$mob_id] = $mob_id;
424 $media_obj = new ilObjMediaObject($mob_id);
425 if ($media_obj->hasFullscreenItem()) {
426 $media_obj->exportMediaFullscreen($a_target_dir, $page_obj->getPageObject());
427 }
428 }
429
430 // collect glossary items
431 $int_links = $page_obj->getPageObject()->getInternalLinks(true);
432 include_once("./Services/Link/classes/class.ilInternalLink.php");
433 include_once("./Modules/Glossary/classes/class.ilGlossaryDefinition.php");
434 if (is_array($int_links)) {
435 foreach ($int_links as $k => $e) {
436 // glossary link
437 if ($e["Type"] == "GlossaryItem") {
438 $karr = explode(":", $k);
441 foreach ($dids as $did) {
442 include_once("./Modules/Glossary/classes/class.ilGlossaryDefPage.php");
443 $def_pg = new ilGlossaryDefPage($did["id"]);
444 $def_pg->buildDom();
445 $mob_ids = $def_pg->collectMediaObjects(false);
446 foreach ($mob_ids as $mob_id) {
447 $this->mob_ids[$mob_id] = $mob_id;
448 //echo "<br>-$mob_id-";
449 $media_obj = new ilObjMediaObject($mob_id);
450 if ($media_obj->hasFullscreenItem()) {
451 $media_obj->exportMediaFullscreen($a_target_dir, $def_pg);
452 }
453 }
454 include_once("./Services/COPage/classes/class.ilPCFileList.php");
455 $file_ids = ilPCFileList::collectFileItems($def_pg, $def_pg->getDomDoc());
456
457 foreach ($file_ids as $file_id) {
458 $this->file_ids[$file_id] = $file_id;
459 }
460 }
461 }
462 }
463 }
464 //exit;
465 // collect all file items
466 include_once("./Services/COPage/classes/class.ilPCFileList.php");
467 $file_ids = ilPCFileList::collectFileItems($page_obj->getSCORM2004Page(), $page_obj->getSCORM2004Page()->getDomDoc());
468 foreach ($file_ids as $file_id) {
469 $this->file_ids[$file_id] = $file_id;
470 }
471
472 if ($mode == 'pdf') {
473 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
474 $q_ids = ilPCQuestion::_getQuestionIdsForPage("sahs", $page["obj_id"]);
475 foreach ($q_ids as $q_id) {
476 include_once("./Modules/TestQuestionPool/classes/class.assQuestionGUI.php");
477 $q_gui = assQuestionGUI::_getQuestionGUI("", $q_id);
478 $q_gui->setRenderPurpose(assQuestionGUI::RENDER_PURPOSE_PREVIEW);
479 $q_gui->outAdditionalOutput();
480 $html = $q_gui->getPreview(true);
481 $page_output = preg_replace("/{{{{{Question;il__qst_" . $q_id . "}}}}}/i", $html, $page_output);
482 }
483
484 $sco_tpl->touchBlock("pdf_pg_break");
485 }
486
487 $sco_tpl->setCurrentBlock("page");
488 $sco_tpl->setVariable("PAGE", $page_output);
489 $sco_tpl->parseCurrentBlock();
490
491 // get all question ids of the sco
492 if ($a_one_file != "") {
493 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
494 $q_ids = ilPCQuestion::_getQuestionIdsForPage("sahs", $page["obj_id"]);
495 foreach ($q_ids as $i) {
496 if (!in_array($i, $sco_q_ids)) {
497 $sco_q_ids[] = $i;
498 }
499 }
500 }
501 }
502
503 // glossary
504 if ($mode != 'pdf') {
505 $sco_tpl->setVariable(
506 "GLOSSARY_HTML",
508 );
509 }
510
511 if ($a_one_file == "") {
512 $output = $sco_tpl->get();
513 } else {
514 $output = $sco_tpl->get("page");
515 }
516
517 if ($mode == 'pdf') {
518 $output = preg_replace("/<div class=\"ilc_page_title_PageTitle\">(.*?)<\/div>/i", "<h2>$1</h2>", $output);
519 }
520
521 $output = preg_replace("/mobs\/mm_(\d+)\/([^\"]+)/i", "./objects/il_" . IL_INST_ID . "_mob_$1/$2", $output);
522 $output = preg_replace("/\.\/files\/file_(\d+)\/([^\"]+)/i", "./objects/il_" . IL_INST_ID . "_file_$1/$2", $output);
523 $output = preg_replace("/\.\/Services\/MediaObjects\/flash_mp3_player/i", "./players", $output);
524 $output = preg_replace("/file=..\/..\/..\/.\//i", "file=../", $output);
525
526 if ($mode != 'pdf') {
527 $output = preg_replace_callback("/href=\"&mob_id=(\d+)&pg_id=(\d+)\"/", array(get_class($this), 'fixFullscreeenLink'), $output);
528 // this one is for fullscreen in glossary entries
529 $output = preg_replace_callback("/href=\"fullscreen_(\d+)\.html\"/", array(get_class($this), 'fixFullscreeenLink'), $output);
530 $output = preg_replace_callback("/{{{{{(Question;)(il__qst_[0-9]+)}}}}}/", array(get_class($this), 'insertQuestion'), $output);
531 $q_handling = file_get_contents('./Modules/Scorm2004/scripts/questions/question_handling.js');
532 fputs(fopen($a_target_dir . '/js/questions_' . $this->getId() . '.js', 'w+'), ilQuestionExporter::questionsJS() . $q_handling);
533 copy(
534 "./Modules/Scorm2004/templates/default/question_handling.css",
535 $a_target_dir . '/css/question_handling.css'
536 );
537
538 // hack to get the question js into the file and to display the correct answers
539 if ($a_one_file != "") {
540 $output = '<script type="text/javascript">' . ilQuestionExporter::questionsJS() . '</script>' . $output;
541 if (count($sco_q_ids) > 0) {
542 $output .= '<script type="text/javascript">';
543 foreach ($sco_q_ids as $i) {
544 if ($i > 0) {
545 $output .= "ilias.questions.showCorrectAnswers(" . $i . "); \n";
546 }
547 }
548 $output .= '</script>';
549 }
550 }
551
552 foreach (ilQuestionExporter::getMobs() as $mob_id) {
553 $this->mob_ids[$mob_id] = $mob_id;
554 }
555 }
556 $this->q_media = ilQuestionExporter::getFiles();
557 //questions export end
558
559 if ($a_one_file != "") {
560 fputs($a_one_file, $output);
561 } else {
562 fputs(fopen($a_target_dir . '/index.html', 'w+'), $output);
563 }
564
565 $this->exportFileItems($a_target_dir, $expLog);
566 }
567
574 public static function renderNavigation($a_tpl, $a_spacer_img = "", $a_lang = "")
575 {
576 global $DIC;
577
578 $lng = $DIC->language();
579
580 if ($a_spacer_img == "") {
581 $a_spacer_img = ilUtil::getImagePath("spacer.png");
582 }
583 if ($a_lang == "") {
584 $a_lang = $lng->getLangKey();
585 }
586 // previous/next navigation
587 $a_tpl->setCurrentBlock("ilLMNavigation");
588 $a_tpl->setVariable("TXT_PREVIOUS", $lng->txtlng("content", 'scplayer_previous', $a_lang));
589 $a_tpl->setVariable("SRC_SPACER", $a_spacer_img);
590 $a_tpl->setVariable("TXT_NEXT", $lng->txtlng("content", 'scplayer_next', $a_lang));
591 $a_tpl->parseCurrentBlock();
592 $a_tpl->setCurrentBlock("ilLMNavigation2");
593 $a_tpl->setVariable("TXT_PREVIOUS", $lng->txtlng("content", 'scplayer_previous', $a_lang));
594 $a_tpl->setVariable("SRC_SPACER", $a_spacer_img);
595 $a_tpl->setVariable("TXT_NEXT", $lng->txtlng("content", 'scplayer_next', $a_lang));
596 $a_tpl->parseCurrentBlock();
597 }
598
607 public static function renderMetaPage($a_tpl, $a_sco, $a_asset_type = "", $mode = "")
608 {
609 global $DIC;
610
611 $lng = $DIC->language();
612
613 if ($a_sco->getType() != "sco" || $a_sco->getHideObjectivePage()) {
614 return;
615 }
616
617 if ($a_asset_type != "entry_asset" && $a_asset_type != "final_asset") {
618 $meta = new ilMD($a_sco->getSLMId(), $a_sco->getId(), $a_sco->getType());
619 $desc_ids = $meta->getGeneral()->getDescriptionIds();
620 $sco_description = $meta->getGeneral()->getDescription($desc_ids[0])->getDescription();
621 }
622
623 if ($mode != 'pdf') {
624 // title
625 if ($a_asset_type != "entry_asset" && $a_asset_type != "final_asset") {
626 $a_tpl->setCurrentBlock("title");
627 $a_tpl->setVariable("SCO_TITLE", $a_sco->getTitle());
628 $a_tpl->parseCurrentBlock();
629 }
630 } else {
631 // title
632 $a_tpl->setCurrentBlock("pdf_title");
633 $a_tpl->setVariable("SCO_TITLE", $a_sco->getTitle());
634 $a_tpl->parseCurrentBlock();
635 $a_tpl->touchBlock("pdf_break");
636 }
637
638 // sco description
639 if (trim($sco_description) != "") {
640 $a_tpl->setCurrentBlock("sco_desc");
641 $a_tpl->setVariable("TXT_DESC", $lng->txt("description"));
642 include_once("./Services/COPage/classes/class.ilPCParagraph.php");
643 $a_tpl->setVariable("VAL_DESC", self::convertLists($sco_description));
644 $a_tpl->parseCurrentBlock();
645 }
646
647 if ($a_asset_type == "sco") {
648 // sco objective(s)
649 $objs = $a_sco->getObjectives();
650 if (count($objs) > 0) {
651 foreach ($objs as $objective) {
652 $a_tpl->setCurrentBlock("sco_obj");
653 $a_tpl->setVariable("VAL_OBJECTIVE", self::convertLists($objective->getObjectiveID()));
654 $a_tpl->parseCurrentBlock();
655 }
656 $a_tpl->setCurrentBlock("sco_objs");
657 $a_tpl->setVariable("TXT_OBJECTIVES", $lng->txt("sahs_objectives"));
658 $a_tpl->parseCurrentBlock();
659 }
660 }
661 $a_tpl->setCurrentBlock("meta_page");
662 $a_tpl->parseCurrentBlock();
663 }
664
665
672 public static function convertLists($a_text)
673 {
674 include_once("./Services/COPage/classes/class.ilPCParagraph.php");
675 $a_text = nl2br($a_text);
676 $a_text = str_replace(array("\n", "\r"), "", $a_text);
677 $a_text = str_replace("<br>", "<br />", $a_text);
678 $a_text = ilPCParagraph::input2xmlReplaceLists($a_text);
679 $a_text = str_replace(
680 array("<SimpleBulletList>", "</SimpleBulletList>",
681 "<SimpleListItem>", "</SimpleListItem>",
682 "<SimpleNumberedList>", "</SimpleNumberedList>"
683 ),
684 array("<ul class='ilc_list_u_BulletedList'>", "</ul>",
685 "<li class='ilc_list_item_StandardListItem'>", "</li>",
686 "<ol class='ilc_list_o_NumberedList'>", "</ol>"
687 ),
688 $a_text
689 );
690 return $a_text;
691 }
692
693 private static function fixFullscreeenLink($matches)
694 {
695 $media_obj = new ilObjMediaObject($matches[1]);
696 if ($media_obj->hasFullscreenItem()) {
697 return "href=\"./objects/il_" . IL_INST_ID . "_mob_" . $matches[1] . "/fullscreen.html\"";
698 //return "href=\"./objects/il_".IL_INST_ID."_mob_".$matches[1]."/".$media_obj->getMediaItem("Fullscreen")->getLocation()."\"";
699 }
700 }
701
702 //callback function for question export
703 private static function insertQuestion($matches)
704 {
705 $q_exporter = new ilQuestionExporter();
706
707 $ret = $q_exporter->exportQuestion($matches[2], "./objects/", "offline");
708
709 return $ret;
710 }
711
712 public function exportXMLPageObjects($a_target_dir, &$a_xml_writer, $a_inst, &$expLog)
713 {
714 include_once "./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
715 include_once "./Modules/Scorm2004/classes/class.ilSCORM2004Page.php";
716
717 $tree = new ilTree($this->slm_id);
718 $tree->setTableNames('sahs_sc13_tree', 'sahs_sc13_tree_node');
719 $tree->setTreeTablePK("slm_id");
720
721 $pages = $tree->getSubTree($tree->getNodeData($this->getId()), true, 'page');
722 foreach ($pages as $page) {
723 $expLog->write(date("[y-m-d H:i:s] ") . "Page Object " . $page["obj_id"]);
724
725 // export xml to writer object
726 $page_obj = new ilSCORM2004Page($page["obj_id"]);
727 $page_obj->exportXML($a_xml_writer, "normal", $a_inst);
728
729 //collect media objects
730 $mob_ids = $page_obj->getMediaObjectIds();
731 foreach ($mob_ids as $mob_id) {
732 $this->mob_ids[$mob_id] = $mob_id;
733 }
734
735 // collect all file items
736 $file_ids = $page_obj->getFileItemIds();
737 foreach ($file_ids as $file_id) {
738 $this->file_ids[$file_id] = $file_id;
739 }
740
741 include_once("./Services/COPage/classes/class.ilPCQuestion.php");
742 $q_ids = ilPCQuestion::_getQuestionIdsForPage("sahs", $page["obj_id"]);
743 if (count($q_ids) > 0) {
744 include_once("./Modules/TestQuestionPool/classes/class.assQuestion.php");
745 foreach ($q_ids as $q_id) {
746 $q_obj = assQuestion::_instantiateQuestion($q_id);
747 // see #16557
748 if (is_object($q_obj)) {
749 $qti_file = fopen($a_target_dir . "/qti_" . $q_id . ".xml", "w");
750 fwrite($qti_file, $q_obj->toXML());
751 fclose($qti_file);
752 }
753 }
754 }
755
756 unset($page_obj);
757 }
758 }
759
760 public function exportXMLMediaObjects(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
761 {
762 include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
763 include_once("./Modules/File/classes/class.ilObjFile.php");
764 $linked_mobs = array();
765 if (is_array($this->mob_ids)) {
766 // mobs directly embedded into pages
767 foreach ($this->mob_ids as $mob_id) {
768 if ($mob_id > 0) {
769 $expLog->write(date("[y-m-d H:i:s] ") . "Media Object " . $mob_id);
770 $media_obj = new ilObjMediaObject($mob_id);
771 $media_obj->exportXML($a_xml_writer, $a_inst);
772 $lmobs = $media_obj->getLinkedMediaObjects($this->mob_ids);
773 $linked_mobs = array_merge($linked_mobs, $lmobs);
774 unset($media_obj);
775 }
776 }
777
778 // linked mobs (in map areas)
779 foreach ($linked_mobs as $mob_id) {
780 if ($mob_id > 0) {
781 $expLog->write(date("[y-m-d H:i:s] ") . "Media Object " . $mob_id);
782 $media_obj = new ilObjMediaObject($mob_id);
783 $media_obj->exportXML($a_xml_writer, $a_inst);
784 unset($media_obj);
785 }
786 }
787 }
788 if (is_array($this->file_ids)) {
789 foreach ($this->file_ids as $file_id) {
790 if (ilObject::_lookupType($file_id) == "file") {
791 $expLog->write(date("[y-m-d H:i:s] ") . "File Item " . $file_id);
792 $file_obj = new ilObjFile($file_id, false);
793 $file_obj->export($a_target_dir);
794 unset($file_obj);
795 }
796 }
797 }
798 }
799
804 public function exportFileItems($a_target_dir, &$expLog)
805 {
806 include_once("./Modules/File/classes/class.ilObjFile.php");
807 if (is_array($this->file_ids)) {
808 foreach ($this->file_ids as $file_id) {
809 $expLog->write(date("[y-m-d H:i:s] ") . "File Item " . $file_id);
810 if (ilObject::_lookupType($file_id) == "file") {
811 $file_obj = new ilObjFile($file_id, false);
812 $file_obj->export($a_target_dir);
813 unset($file_obj);
814 } else {
815 $expLog->write(date("[y-m-d H:i:s] ") . "File Item not found, ID: " . $file_id);
816 }
817 }
818 }
819
820 include_once("./Services/MediaObjects/classes/class.ilObjMediaObject.php");
821 $linked_mobs = array();
822 if (is_array($this->mob_ids)) {
823 // mobs directly embedded into pages
824 foreach ($this->mob_ids as $mob_id) {
825 if ($mob_id > 0 && ilObject::_exists($mob_id)) {
826 $expLog->write(date("[y-m-d H:i:s] ") . "Media Object " . $mob_id);
827 $media_obj = new ilObjMediaObject($mob_id);
828 $media_obj->exportFiles($a_target_dir, $expLog);
829 $lmobs = $media_obj->getLinkedMediaObjects($this->mob_ids);
830 $linked_mobs = array_merge($linked_mobs, $lmobs);
831
832 unset($media_obj);
833 }
834 }
835
836 // linked mobs (in map areas)
837 foreach ($linked_mobs as $mob_id) {
838 if ($mob_id > 0 && ilObject::_exists($mob_id)) {
839 $expLog->write(date("[y-m-d H:i:s] ") . "Media Object " . $mob_id);
840 $media_obj = new ilObjMediaObject($mob_id);
841 $media_obj->exportFiles($a_target_dir);
842 unset($media_obj);
843 }
844 }
845 }
846
847 //media files in questions
848 foreach ($this->q_media as $media) {
849 if ($media != "") {
850 error_log($media);
851 if (is_file($media)) {
852 copy($media, $a_target_dir . "/objects/" . basename($media));
853 }
854 }
855 }
856 }
857
858 /* export content objects meta data to xml (see ilias_co.dtd)
859 *
860 * @param object $a_xml_writer ilXmlWriter object that receives the
861 * xml data
862 */
863 public function exportXMLMetaData(&$a_xml_writer)
864 {
865 include_once("Services/MetaData/classes/class.ilMD2XML.php");
866 $md2xml = new ilMD2XML($this->getSLMId(), $this->getId(), $this->getType());
867 $md2xml->setExportMode(true);
868 $md2xml->startExport();
869 $a_xml_writer->appendXML($md2xml->getXML());
870 }
871
872 public function getExportFiles()
873 {
874 $file = array();
875
876 require_once("./Modules/Scorm2004/classes/class.ilSCORM2004Export.php");
877
878 $export = new ilSCORM2004Export($this);
879 foreach ($export->getSupportedExportTypes() as $type) {
880 $dir = $export->getExportDirectoryForType($type);
881 // quit if import dir not available
882 if (!@is_dir($dir) or !is_writeable($dir)) {
883 continue;
884 }
885 // open directory
886 $cdir = dir($dir);
887
888 // get files and save the in the array
889 while ($entry = $cdir->read()) {
890 if ($entry != "." and
891 $entry != ".." and
892 (
893 preg_match("~^[0-9]{10}_{2}[0-9]+_{2}(" . $this->getType() . "_)" . $this->getId() . "+\.zip\$~", $entry) or
894 preg_match("~^[0-9]{10}_{2}[0-9]+_{2}(" . $this->getType() . "_)" . $this->getId() . "+\.pdf\$~", $entry) or
895 preg_match("~^[0-9]{10}_{2}[0-9]+_{2}(" . $this->getType() . "_)" . $this->getId() . "+\.iso\$~", $entry)
896 )) {
897 $file[$entry . $type] = array("type" => $type, "file" => $entry,
898 "size" => filesize($dir . "/" . $entry));
899 }
900 }
901
902 // close import directory
903 $cdir->close();
904 }
905
906 // sort files
907 ksort($file);
908 reset($file);
909 return $file;
910 }
911
918 public function getGlossaryTermIds()
919 {
920 include_once("./Modules/Glossary/classes/class.ilGlossaryTerm.php");
921 $childs = $this->tree->getChilds($this->getId());
922 $ids = array();
923 foreach ($childs as $c) {
925 "sahs" . ":pg",
926 $c["child"]
927 );
928 foreach ($links as $l) {
929 if ($l["type"] == "git" && (int) $l["inst"] == 0 && !isset($ids[$l["id"]])) {
930 $ids[$l["id"]] = ilGlossaryTerm::_lookGlossaryTerm($l["id"]);
931 }
932 }
933 }
934 asort($ids);
935 return $ids;
936 }
937}
global $l
Definition: afr.php:30
An exception for terminatinating execution or to throw for unit testing.
const IL_PAGE_OFFLINE
static _getQuestionGUI($question_type, $question_id=-1)
Creates a question gui representation and returns the alias to the question gui note: please do not u...
static _instantiateQuestion($question_id)
static _instanciateQuestion($question_id)
Creates an instance of a question with a given question id.
HTML export class for pages.
static recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
Glossary definition page object.
static getDefinitionList($a_term_id)
static
static _lookGlossaryTerm($term_id)
get glossary term
Class ilObjFile.
Class ilObjMediaObject.
static getAffectiveLocalization($a_id)
Get affective localization.
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
static _lookupType($a_id, $a_reference=false)
lookup object type
static collectFileItems($a_page, $a_domdoc)
Get all file items that are used within the page.
static input2xmlReplaceLists($a_text)
Converts xml from DB to output in edit textarea.
static getJSTextInitCode($a_lang)
Get js txt init code.
static _getQuestionIdsForPage($a_parent_type, $a_page_id, $a_lang="-")
Get all questions of a page.
Scorm 2004 Question Exporter.
static questionsJS(array $a_qids=null)
Class ilSCORM2004Asset.
__construct($a_slm_object, $a_id=0)
Constructor.
getGlossaryTermIds()
Get glossary term ids in sco.
exportXMLMediaObjects(&$a_xml_writer, $a_inst, $a_target_dir, &$expLog)
copy($a_target_slm)
Copy sco.
static convertLists($a_text)
Convert * and # to lists.
exportXMLPageObjects($a_target_dir, &$a_xml_writer, $a_inst, &$expLog)
exportPDF($a_inst, $a_target_dir, &$expLog)
exportHTML( $a_inst, $a_target_dir, &$expLog, $a_asset_type="sco", $a_one_file="")
static renderMetaPage($a_tpl, $a_sco, $a_asset_type="", $mode="")
Render meta page (description/objectives at beginning)
exportXMLMetaData(&$a_xml_writer)
static fixFullscreeenLink($matches)
exportHTMLPageObjects( $a_inst, $a_target_dir, &$expLog, $mode, $a_asset_type="sco", $a_one_file="", $a_sco_tpl=null)
Export HTML pages of SCO.
insertDefaultSequencingItem()
Insert default sequencing item.
static renderNavigation($a_tpl, $a_spacer_img="", $a_lang="")
Render navigation.
exportHTML4PDF($a_inst, $a_target_dir, &$expLog)
static insertQuestion($matches)
delete_rec($a_delete_meta_data=true)
Delete Nested Page Objects.
create($a_upload=false, $a_template=false)
Create asset.
exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, &$expLog, &$a_xml_writer)
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
exportScorm($a_inst, $a_target_dir, $ver, &$expLog)
Class ilSCORM2004Condition.
static getInstance($a_slm_object, $a_id=0, $a_halt=true)
getSLMId()
Get ID of parent Scorm Learning Module Object.
setType($a_type)
Set type.
getDescription()
Get description.
Class ilSCORM2004Page GUI class.
static initExport()
Init export.
static getGlossaryHTML($a_sco)
Get glossary html (only in export mode)
Class ilSCORM2004Page.
static getGlossaryOverviewId()
Get sco glossary overlay id.
special template class to simplify handling of ITX/PEAR
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
XML writer class.
xmlStartTag($tag, $attrs=null, $empty=false, $encode=true, $escape=true)
Writes a starttag.
xmlSetDtdDef($dtdDef)
Sets dtd definition.
$x
Definition: complexTest.php:9
$key
Definition: croninfo.php:18
$i
Definition: disco.tpl.php:19
$html
Definition: example_001.php:87
$style
Definition: example_012.php:70
$links
global $ilCtrl
Definition: ilias.php:18
xslt_free(&$proc)
xslt_create()
$ret
Definition: parser.php:6
global $DIC
Definition: saml.php:7
$results
Definition: svg-scanner.php:47
$data
Definition: bench.php:6