11 require_once
"./Modules/Scorm2004/classes/ilSCORM13Package.php";
12 require_once
"./Modules/Scorm2004/classes/class.ilSCORM2004Chapter.php";
13 require_once
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php";
14 require_once
"./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
15 require_once
"./Modules/Scorm2004/classes/adlparser/SeqTreeBuilder.php";
16 require_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMTree.php");
20 const DB_ENCODE_XSL =
'./Modules/Scorm2004/templates/xsl/op/op-scorm13.xsl';
21 const CONVERT_XSL =
'./Modules/Scorm2004/templates/xsl/op/scorm12To2004.xsl';
22 const DB_DECODE_XSL =
'./Modules/Scorm2004/templates/xsl/op/op-scorm13-revert.xsl';
23 const VALIDATE_XSD =
'./libs/ilias/Scorm2004/xsd/op/op-scorm13.xsd';
25 const WRAPPER_HTML =
'./Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/GenericRunTimeWrapper.htm';
26 const WRAPPER_JS =
'./Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/SCOPlayerWrapper.js';
75 $this->packagesFolder =
'';
91 $pg_set =
$ilDB->queryF(
'SELECT * FROM cp_package WHERE obj_id = %s', array(
'integer'), array(
$packageId));
94 $this->packageData = array_merge($lm_data, $pg_data);
96 $this->packageFolder = $this->packagesFolder .
'/' .
$packageId;
97 $this->packageFile = $this->packageFolder .
'.zip';
98 $this->imsmanifestFile = $this->packageFolder .
'/' .
'imsmanifest.xml';
106 if (is_dir($this->packageFolder)) {
107 dir_delete($this->packageFolder);
109 if (is_file($this->packageFile)) {
110 @unlink($this->packageFile);
122 $ilDB = $DIC[
'ilDB'];
124 header(
'content-type: text/xml');
125 header(
'content-disposition: attachment; filename="manifest.xml"');
128 'SELECT xmldata FROM cp_package WHERE obj_id = %s',
130 array($this->packageId)
134 print($row[
'xmldata']);
147 $ilDB = $DIC[
'ilDB'];
148 $ilLog = $DIC[
'ilLog'];
153 if ($reimport ===
true) {
160 $this->imsmanifestFile = $this->packageFolder .
'/' .
'imsmanifest.xml';
162 $this->imsmanifest =
new DOMDocument;
163 $this->imsmanifest->async =
false;
164 if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
165 $this->diagnostic[] =
'XML not wellformed';
170 $this->manifest = $this->
transform($this->imsmanifest, self::DB_ENCODE_XSL);
172 if (!$this->manifest) {
173 $this->diagnostic[] =
'Cannot transform into normalized manifest';
177 $path =
new DOMXpath($this->manifest);
178 $path->registerNamespace(
"scorm",
"http://www.openpalms.net/scorm/scorm13");
179 $items = $path->query(
"//scorm:item");
180 if ($items->length == 1) {
181 $n = $items->item(0);
182 $resource = $path->query(
"//scorm:resource");
183 foreach ($resource as
$res) {
184 if ($res->getAttribute(
'id') ==
$n->getAttribute(
"resourceId")) {
185 $res->setAttribute(
'scormType',
'sco');
191 if ($validate ==
"y") {
192 if (!$this->
validate($this->manifest, self::VALIDATE_XSD)) {
194 "<b>The uploaded SCORM 1.2 / SCORM 2004 is not valid. You can try to import the package without the validation option checked on your own risk. </b><br><br>Validation Error(s):</b><br> Normalized XML is not conform to " . self::VALIDATE_XSD,
201 if (file_exists($this->packageFolder .
'/' .
'index.xml')) {
202 $doc = simplexml_load_file($this->packageFolder .
'/' .
'index.xml');
203 $l = $doc->xpath(
"/ContentObject/MetaData");
205 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
207 $mdxml->startParsing();
208 $mdxml->getMDObject()->update();
211 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php");
214 $title = $importer->getTitle();
215 $description = $importer->getDescription();
216 if ($description !=
"") {
222 $x = simplexml_load_string($this->manifest->saveXML());
223 $x[
'persistPreviousAttempts'] = $this->packageData[
'persistprevattempts'];
226 $x[
'defaultLessonMode'] = $this->packageData[
'default_lesson_mode'];
227 $x[
'credit'] = $this->packageData[
'credit'];
228 $x[
'autoReview'] = $this->packageData[
'auto_review'];
232 foreach ($x->resource as $xe) {
233 $r[strval($xe[
'id'])] = $xe;
237 foreach ($x->xpath(
'//*[local-name()="item"]') as $xe) {
239 if (
$b = $r[strval($xe[
'resourceId'])]) {
240 $xe[
'href'] = strval(
$b[
'base']) . strval(
$b[
'href']);
241 unset($xe[
'resourceId']);
242 if (strval(
$b[
'scormType']) ==
'sco') {
250 self::jsonNode($x->organization, $j[
'item']);
251 foreach ($x->sequencing as $s) {
252 self::jsonNode($s, $j[
'sequencing'][]);
255 $j[
'item'][
'base'] = strval($x[
'base']);
258 $j[
'foreignId'] = floatval($x[
'foreignId']);
259 $j[
'id'] = strval($x[
'id']);
261 for (
$i = 0;
$i < count($j[
'item'][
'item']);
$i++) {
268 $adl_tree = $act->buildNodeSeqTree($this->imsmanifestFile);
272 'xmldata' => array(
'clob', $x->asXML()),
273 'jsdata' => array(
'clob', json_encode($j)),
274 'activitytree' => array(
'clob', json_encode($adl_tree[
'tree'])),
275 'global_to_system' => array(
'integer', (
int) $adl_tree[
'global']),
276 'shared_data_global_to_system' => array(
'integer', (
int) $adl_tree[
'dataglobal'])
279 'obj_id' => array(
'integer', (
int) $this->packageId)
288 return $j[
'item'][
'title'];
301 $ilDB = $DIC[
'ilDB'];
302 $ilLog = $DIC[
'ilLog'];
306 $this->imsmanifestFile = $this->packageFolder .
'/' .
'index.xml';
307 $this->imsmanifest =
new DOMDocument;
308 $this->imsmanifest->async =
false;
310 if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
311 $this->diagnostic[] =
'XML not wellformed';
320 $sco_xml_file = $this->packageFolder .
'/sco.xml';
321 if (is_file($sco_xml_file)) {
322 $scodoc =
new DOMDocument;
323 $scodoc->async =
false;
324 if (!@$scodoc->load($sco_xml_file)) {
325 $this->diagnostic[] =
'XML of sco.xml not wellformed';
330 $xpath =
new DOMXPath($scodoc);
331 $nodes = $xpath->query(
"/sco/objective");
332 foreach ($nodes as $node) {
333 $t_node = $node->firstChild;
334 if (is_object($t_node)) {
335 $objective_text = $t_node->textContent;
336 if (trim($objective_text) !=
"") {
337 $objs = $sco->getObjectives();
338 foreach ($objs as $o) {
339 $mappings = $o->getMappings();
340 if ($mappings == null) {
341 $ob =
new ilScorm2004Objective($sco->getId(), $o->getId());
342 $ob->setObjectiveID($objective_text);
343 $ob->updateObjective();
362 $ilDB = $DIC[
'ilDB'];
363 $ilLog = $DIC[
'ilLog'];
367 $this->imsmanifestFile = $this->packageFolder .
'/' .
'index.xml';
368 $this->imsmanifest =
new DOMDocument;
369 $this->imsmanifest->async =
false;
371 if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
372 $this->diagnostic[] =
'XML not wellformed';
426 $ilDB = $DIC[
'ilDB'];
427 $ilLog = $DIC[
'ilLog'];
430 $this->packageId =
$slm->getId();
431 $this->imsmanifestFile = $this->packageFolder .
'/' .
'imsmanifest.xml';
432 $this->imsmanifest =
new DOMDocument;
433 $this->imsmanifest->async =
false;
434 $this->imsmanifest->formatOutput =
false;
435 $this->imsmanifest->preserveWhiteSpace =
false;
437 if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
438 $this->diagnostic[] =
'XML not wellformed';
442 $this->mani_xpath =
new DOMXPath($this->imsmanifest);
443 $this->mani_xpath->registerNamespace(
"d",
"http://www.imsproject.org/xsd/imscp_rootv1p1p2");
444 $this->mani_xpath->registerNamespace(
"imscp",
"http://www.imsglobal.org/xsd/imscp_v1p1");
445 $this->mani_xpath->registerNamespace(
"imsss",
"http://www.imsglobal.org/xsd/imsss");
449 simplexml_import_dom($this->imsmanifest->documentElement),
466 $newObj->setType(
'glo');
467 $newObj->setTitle(
'');
468 $newObj->create(
true);
469 $newObj->createReference();
470 $newObj->putInTree(
$_GET[
"ref_id"]);
471 $newObj->setPermissions(
$_GET[
"ref_id"]);
476 if (!is_file($xml_file)) {
480 include_once(
"./Modules/LearningModule/classes/class.ilContObjParser.php");
482 $contParser->startParsing();
485 $slm->setAssignedGlossary($newObj->getId());
489 public function dbImportLM($node, $parent_id =
"", $a_import_sequencing =
false)
491 switch ($node->getName()) {
493 $this->slm_tree =
new ilTree($this->slm->getId());
494 $this->slm_tree->setTreeTablePK(
"slm_id");
495 $this->slm_tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
496 $this->slm_tree->addTree($this->slm->getId(), 1);
499 include_once(
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
503 $r = $this->mani_xpath->query(
"/d:manifest/d:organizations/d:organization/imsss:sequencing");
504 $this->imsmanifest->formatOutput =
false;
507 if ($a_import_sequencing) {
508 $seq_info->initDom();
513 if (file_exists($this->packageFolder .
'/' .
'index.xml')) {
514 $doc = simplexml_load_file($this->packageFolder .
'/' .
'index.xml');
515 $l = $doc->xpath(
"/ContentObject/MetaData");
517 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
518 $mdxml =
new ilMDXMLCopier($l[0]->asXML(), $this->slm->getId(), $this->slm->getId(), $this->slm->getType());
520 $mdxml->getMDObject()->update();
525 $this->slm->title = $node->title;
528 $a = $node->attributes();
529 if (preg_match(
"/il_\d+_chap_\d+/",
$a[
'identifier'])) {
531 $chap->setTitle($node->title);
532 $chap->setSLMId($this->slm->getId());
536 $r = $this->mani_xpath->query(
"//d:item[@identifier='" .
$a[
'identifier'] .
"']/imsss:sequencing");
540 $seq_info->initDom();
545 $parent_id = $chap->getId();
546 $doc = simplexml_load_file($this->packageFolder .
'/' .
'index.xml');
547 $l = $doc->xpath(
"/ContentObject/StructureObject/MetaData[General/Identifier/@Entry='" .
$a[
'identifier'] .
"']");
549 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
550 $mdxml =
new ilMDXMLCopier($l[0]->asXML(), $this->slm->getId(), $chap->getId(), $chap->getType());
552 $mdxml->getMDObject()->update();
555 if (preg_match(
"/il_\d+_sco_(\d+)/",
$a[
'identifier'], $match)) {
557 $sco->setTitle($node->title);
558 $sco->setSLMId($this->slm->getId());
562 $r = $this->mani_xpath->query(
"//d:item[@identifier='" .
$a[
'identifier'] .
"']/imsss:sequencing");
568 $a_import_sequencing,
569 "local_obj_" . $sco->getID() .
"_0" 571 $seq_info->initDom();
577 $newPack->il_importSco($this->slm->getId(), $sco->getId(), $this->packageFolder .
"/" . $match[1]);
578 $parent_id = $sco->getId();
580 if (preg_match(
"/il_\d+_ass_(\d+)/",
$a[
'identifier'], $match)) {
582 $ass->setTitle($node->title);
583 $ass->setSLMId($this->slm->getId());
587 $r = $this->mani_xpath->query(
"//d:item[@identifier='" .
$a[
'identifier'] .
"']/imsss:sequencing");
593 $a_import_sequencing,
594 "local_obj_" . $ass->getID() .
"_0" 596 $seq_info->initDom();
602 $newPack->il_importAss($this->slm->getId(), $ass->getId(), $this->packageFolder .
"/" . $match[1]);
603 $parent_id = $ass->getId();
610 foreach ($node->children() as $child) {
611 $this->
dbImportLM($child, $parent_id, $a_import_sequencing);
622 public function setSequencingInfo($a_node, $a_seq_info, $a_import_sequencing, $a_fix_obj_id =
"")
624 $seq_xml = trim(str_replace(
"imsss:",
"", $this->imsmanifest->saveXML($a_node)));
625 if ($seq_xml !=
"") {
626 $a_seq_info->setImportSeqXml(
'<?xml version="1.0"?>' . $seq_xml);
628 if ($a_import_sequencing) {
629 if ($a_fix_obj_id !=
"") {
630 $seq_xml = preg_replace(
"/local_obj_[0-9]*_0/", $a_fix_obj_id, $seq_xml);
632 $a_seq_info->setSeqXml(
'<?xml version="1.0"?>' . $seq_xml);
640 $this->diagnostic[] = $msg;
653 foreach ($node->attributes() as $k => $v) {
658 } elseif ($v ===
"false") {
660 } elseif (is_numeric($v)) {
665 foreach ($node->children() as
$name => $child) {
666 self::jsonNode($child, $sink[$name][]);
676 if ($f[
"type"] ==
'file' && substr($f[
"entry"], 0, 4) ==
'qti_') {
678 $result = $qtiParser->startParsing();
679 $founditems = &$qtiParser->getFoundItems();
681 foreach ($founditems as $qp) {
696 $qtiParser->setTestObject($newObj);
697 $result = $qtiParser->startParsing();
699 $qtis = array_merge($qtis, $qtiParser->getImportMapping());
704 include_once
'Modules/Scorm2004/classes/class.ilSCORM2004Page.php';
705 $doc =
new SimpleXMLElement($this->imsmanifest->saveXml());
706 $l = $doc->xpath(
"/ContentObject/MetaData");
708 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
709 $mdxml =
new ilMDXMLCopier($l[0]->asXML(),
$slm->getId(), $sco->getId(), $sco->getType());
711 $mdxml->getMDObject()->update();
713 $l = $doc->xpath(
"/ContentObject/PageObject");
714 foreach ($l as $page_xml) {
715 $tnode = $page_xml->xpath(
'MetaData/General/Title');
717 $page->setTitle($tnode [0]);
718 $page->setSLMId(
$slm->getId());
722 $pmd = $page_xml->xpath(
"MetaData");
724 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
725 $mdxml =
new ilMDXMLCopier($pmd[0]->asXML(),
$slm->getId(), $page->getId(), $page->getType());
727 $mdxml->getMDObject()->update();
729 $tnode = $page_xml->xpath(
"//MediaObject/MediaAlias | //InteractiveImage/MediaAlias");
730 foreach ($tnode as $ttnode) {
731 include_once
'./Services/MediaObjects/classes/class.ilObjMediaObject.php';
732 $OriginId = $ttnode[
"OriginId"];
733 $medianodes = $doc->xpath(
"//MediaObject[MetaData/General/Identifier/@Entry='" . $OriginId .
"']");
734 $medianode = $medianodes[0];
737 $media_object->setTitle($medianode->MetaData->General->Title);
738 $media_object->setDescription($medianode->MetaData->General->Description);
739 $media_object->create(
false);
740 $mmd = $medianode->xpath(
"MetaData");
742 include_once
'Services/MetaData/classes/class.ilMDXMLCopier.php';
743 $mdxml =
new ilMDXMLCopier($mmd[0]->asXML(), 0, $media_object->getId(), $media_object->getType());
745 $mdxml->getMDObject()->update();
748 $media_object->createDirectory();
750 foreach ($medianode->MediaItem as $xMediaItem) {
752 $media_object->addMediaItem($media_item);
753 $media_item->setPurpose($xMediaItem[
"Purpose"]);
754 $media_item->setFormat($xMediaItem->Format);
755 $media_item->setLocation($xMediaItem->Location);
756 $media_item->setLocationType($xMediaItem->Location[
"Type"]);
757 $media_item->setWidth($xMediaItem->Layout[
"Width"]);
758 $media_item->setHeight($xMediaItem->Layout[
"Height"]);
759 $media_item->setHAlign($xMediaItem->Layout[
"HorizontalAlign"]);
760 $media_item->setCaption($xMediaItem->Caption);
761 $media_item->setTextRepresentation($xMediaItem->TextRepresentation);
765 foreach ($xMediaItem->MapArea as
$n => $v) {
766 if ($v->ExtLink[
"Href"] !=
"") {
770 $map_area->setShape($v[
"Shape"]);
771 $map_area->setCoords($v[
"Coords"]);
773 $map_area->setTitle($v->ExtLink);
774 $map_area->setHref($v->ExtLink[
"Href"]);
776 $media_item->addMapArea($map_area);
780 if ($media_item->getLocationType() ==
"LocalFile") {
787 ilUtil::rCopy($this->packageFolder .
"/objects/" . $OriginId, $mob_dir);
794 $media_object->update(
true);
795 $ttnode [
"OriginId"] =
"il__mob_" . $media_object->getId();
798 include_once(
"./Modules/File/classes/class.ilObjFile.php");
799 include_once(
"./Services/Utilities/classes/class.ilFileUtils.php");
800 include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
802 $intlinks = $page_xml->xpath(
"//IntLink");
806 foreach ($intlinks as $intlink) {
807 if ($intlink[
"Type"] !=
"File") {
810 $path = $this->packageFolder .
"/objects/" . str_replace(
'dfile',
'file', $intlink[
"Target"]);
811 if (!is_dir($path)) {
818 $fileObj->setType(
"file");
825 $fileObj->setFileSize(filesize($path .
"/" . $filename));
827 $fileObj->createReference();
830 $fileObj->createDirectory();
832 $intlink[
"Target"] =
"il__dfile_" . $fileObj->getId();
835 $fileitems = $page_xml->xpath(
"//FileItem/Identifier");
838 foreach ($fileitems as $fileitem) {
839 $path = $this->packageFolder .
"/objects/" . $fileitem[
"Entry"];
840 if (!is_dir($path)) {
847 $fileObj->setType(
"file");
854 $fileObj->setFileSize(filesize($path .
"/" . $filename));
856 $fileObj->createReference();
859 $fileObj->createDirectory();
861 $fileitem[
"Entry"] =
"il__file_" . $fileObj->getId();
866 $ddoc =
new DOMDocument();
867 $ddoc->async =
false;
868 $ddoc->preserveWhiteSpace =
false;
869 $ddoc->formatOutput =
false;
870 $ddoc->loadXML($page_xml->asXML());
871 $xpath =
new DOMXPath($ddoc);
872 $tnode = $xpath->query(
'PageContent');
874 foreach ($tnode as $ttnode) {
875 $t .= str_replace(
"&",
"&", $ddoc->saveXML($ttnode));
877 $t .=
"</PageObject>";
878 foreach ($qtis as $old => $q) {
879 $t = str_replace($old,
'il__qst_' . $q[
'pool'], $t);
881 $pagex->setXMLContent($t);
882 $pagex->updateFromXML();
886 public function dbImport($node, &$lft = 1, $depth = 1, $parent = 0)
889 $ilDB = $DIC[
'ilDB'];
891 switch ($node->nodeType) {
892 case XML_DOCUMENT_NODE:
897 'SELECT * FROM cp_package WHERE obj_id = %s AND c_identifier = %s',
898 array(
'integer',
'text'),
899 array($this->packageId, $this->packageName)
902 $query =
'UPDATE cp_package ' 903 .
'SET persistprevattempts = %s, c_settings = %s ' 904 .
'WHERE obj_id = %s AND c_identifier= %s';
907 array(
'integer',
'text',
'integer',
'text'),
908 array(0, null, $this->packageId, $this->packageName)
911 $query =
'INSERT INTO cp_package (obj_id, c_identifier, persistprevattempts, c_settings) ' 912 .
'VALUES (%s, %s, %s, %s)';
915 array(
'integer',
'text',
'integer',
'text'),
916 array($this->packageId, $this->packageName, 0, null)
921 $this->
dbImport($node->documentElement);
924 case XML_ELEMENT_NODE:
925 if ($node->nodeName ===
'manifest') {
926 if ($node->getAttribute(
'uri') ==
"") {
928 $node->setAttribute(
'uri',
'md5:' . $this->packageHash);
932 $cp_node_id =
$ilDB->nextId(
'cp_node');
934 $query =
'INSERT INTO cp_node (cp_node_id, slm_id, nodename) ' 935 .
'VALUES (%s, %s, %s)';
938 array(
'integer',
'integer',
'text'),
939 array($cp_node_id, $this->packageId, $node->nodeName)
942 $query =
'INSERT INTO cp_tree (child, depth, lft, obj_id, parent, rgt) ' 943 .
'VALUES (%s, %s, %s, %s, %s, %s)';
946 array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer'),
947 array($cp_node_id, $depth, $lft++, $this->packageId, $parent, 0)
952 $names = array(
'cp_node_id');
953 $values = array($cp_node_id);
954 $types = array(
'integer');
956 foreach ($node->attributes as $attr) {
957 switch (strtolower($attr->name)) {
958 case 'completionsetbycontent': $names[] =
'completionbycontent';
break;
959 case 'objectivesetbycontent': $names[] =
'objectivebycontent';
break;
960 case 'type': $names[] =
'c_type';
break;
961 case 'mode': $names[] =
'c_mode';
break;
962 case 'language': $names[] =
'c_language';
break;
963 case 'condition': $names[] =
'c_condition';
break;
964 case 'operator': $names[] =
'c_operator';
break;
965 case 'condition': $names[] =
'c_condition';
break;
966 case 'readnormalizedmeasure': $names[] =
'readnormalmeasure';
break;
967 case 'writenormalizedmeasure': $names[] =
'writenormalmeasure';
break;
968 case 'minnormalizedmeasure': $names[] =
'minnormalmeasure';
break;
969 case 'primary': $names[] =
'c_primary';
break;
970 case 'minnormalizedmeasure': $names[] =
'minnormalmeasure';
break;
971 case 'persistpreviousattempts': $names[] =
'persistprevattempts';
break;
972 case 'identifier': $names[] =
'c_identifier';
break;
973 case 'settings': $names[] =
'c_settings';
break;
974 case 'activityabsolutedurationlimit': $names[] =
'activityabsdurlimit';
break;
975 case 'activityexperienceddurationlimit': $names[] =
'activityexpdurlimit';
break;
976 case 'attemptabsolutedurationlimit': $names[] =
'attemptabsdurlimit';
break;
977 case 'measuresatisfactionifactive': $names[] =
'measuresatisfactive';
break;
978 case 'objectivemeasureweight': $names[] =
'objectivemeasweight';
break;
979 case 'requiredforcompleted': $names[] =
'requiredcompleted';
break;
980 case 'requiredforincomplete': $names[] =
'requiredincomplete';
break;
981 case 'requiredfornotsatisfied': $names[] =
'requirednotsatisfied';
break;
982 case 'rollupobjectivesatisfied': $names[] =
'rollupobjectivesatis';
break;
983 case 'rollupprogresscompletion': $names[] =
'rollupprogcompletion';
break;
984 case 'usecurrentattemptobjectiveinfo': $names[] =
'usecurattemptobjinfo';
break;
985 case 'usecurrentattemptprogressinfo': $names[] =
'usecurattemptproginfo';
break;
986 default: $names[] = strtolower($attr->name);
break;
990 $names[count($names) - 1],
991 array(
'flow',
'completionbycontent',
992 'objectivebycontent',
'rollupobjectivesatis',
994 'choiceexit',
'satisfiedbymeasure',
995 'c_primary',
'constrainchoice',
996 'forwardonly',
'global_to_system',
997 'writenormalmeasure',
'writesatisfiedstatus',
998 'readnormalmeasure',
'readsatisfiedstatus',
999 'preventactivation',
'measuresatisfactive',
1000 'reorderchildren',
'usecurattemptproginfo',
1001 'usecurattemptobjinfo',
'rollupprogcompletion',
1002 'read_shared_data',
'write_shared_data',
1003 'shared_data_global_to_system',
'completedbymeasure')
1005 if ($attr->value ==
'true') {
1007 } elseif ($attr->value ==
'false') {
1010 $values[] = (int) $attr->value;
1013 $values[] = $attr->value;
1017 $names[count($names) - 1],
1018 array(
'objectivesglobtosys',
'attemptlimit',
1019 'flow',
'completionbycontent',
1020 'objectivebycontent',
'rollupobjectivesatis',
1021 'tracked',
'choice',
1022 'choiceexit',
'satisfiedbymeasure',
1023 'c_primary',
'constrainchoice',
1024 'forwardonly',
'global_to_system',
1025 'writenormalmeasure',
'writesatisfiedstatus',
1026 'readnormalmeasure',
'readsatisfiedstatus',
1027 'preventactivation',
'measuresatisfactive',
1028 'reorderchildren',
'usecurattemptproginfo',
1029 'usecurattemptobjinfo',
'rollupprogcompletion',
1030 'read_shared_data',
'write_shared_data',
1031 'shared_data_global_to_system')
1033 $types[] =
'integer';
1035 $names[count($names) - 1],
1036 array(
'jsdata',
'xmldata',
'activitytree',
'data')
1040 $names[count($names) - 1],
1041 array(
'objectivemeasweight')
1049 if ($node->nodeName ===
'datamap') {
1050 $names[] =
'slm_id';
1052 $types[] =
'integer';
1054 $names[] =
'sco_node_id';
1055 $values[] = $parent;
1056 $types[] =
'integer';
1060 $insert_data = array();
1061 foreach ($names as $key => $db_field) {
1062 $insert_data[$db_field] = array($types[$key], trim($values[$key]));
1064 $ilDB->insert(
'cp_' . strtolower($node->nodeName), $insert_data);
1066 $node->setAttribute(
'foreignId', $cp_node_id);
1067 $this->idmap[$node->getAttribute(
'id')] = $cp_node_id;
1070 foreach ($node->childNodes as $child) {
1071 $this->
dbImport($child, $lft, $depth + 1, $cp_node_id);
1075 $query =
'UPDATE cp_tree SET rgt = %s WHERE child = %s';
1078 array(
'integer',
'integer'),
1079 array($lft++, $cp_node_id)
1089 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
1092 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
1099 $ilDB = $DIC[
'ilDB'];
1100 $ilLog = $DIC[
'ilLog'];
1103 $cp_nodes = array();
1106 'SELECT cp_node.cp_node_id FROM cp_node WHERE cp_node.slm_id = %s',
1108 array($this->packageId)
1111 $cp_nodes[] =
$data[
'cp_node_id'];
1115 foreach (self::$elements[
'cp'] as $t) {
1118 $in =
$ilDB->in(strtolower($t) .
'.cp_node_id', $cp_nodes,
false,
'integer');
1119 $ilDB->manipulate(
'DELETE FROM ' . strtolower($t) .
' WHERE ' .
$in);
1124 'DELETE FROM cp_tree WHERE cp_tree.obj_id = %s',
1126 array($this->packageId)
1130 'DELETE FROM cp_node WHERE cp_node.slm_id = %s',
1132 array($this->packageId)
1137 'DELETE FROM cp_package WHERE cp_package.obj_id = %s',
1139 array($this->packageId)
1150 public function transform($inputdoc, $xslfile, $outputpath = null)
1152 $xsl =
new DOMDocument;
1153 $xsl->async =
false;
1154 if (!@$xsl->load($xslfile)) {
1155 die(
'ERROR: load StyleSheet ' . $xslfile);
1157 $prc =
new XSLTProcessor;
1158 $prc->registerPHPFunctions();
1159 $r = @$prc->importStyleSheet($xsl);
1160 if (
false === @$prc->importStyleSheet($xsl)) {
1161 die(
'ERROR: importStyleSheet ' . $xslfile);
1164 file_put_contents($outputpath, $prc->transformToXML($inputdoc));
1166 return $prc->transformToDoc($inputdoc);
1172 libxml_use_internal_errors(
true);
1173 $return = @$doc->schemaValidate($schema);
1176 LIBXML_ERR_ERROR =>
'Error',
1177 LIBXML_ERR_FATAL =>
'Fatal Error' 1179 foreach (libxml_get_errors() as $error) {
1180 $level = $levels[$error->level];
1181 if (isset($level)) {
1183 $this->diagnostic[] =
"XSLT $level (Line $error->line) $message";
1186 libxml_clear_errors();
1188 libxml_use_internal_errors(
false);
1195 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
Class ilSCORM2004PageNode.
dbImportSco($slm, $sco, $asset=false)
static putInTree($a_obj, $a_parent_id="", $a_target_node_id="")
put this object into content object tree
dbImportLM($node, $parent_id="", $a_import_sequencing=false)
transform($inputdoc, $xslfile, $outputpath=null)
jsonNode($node, &$sink)
Helper for UploadAndImport Recursively copies values from XML into PHP array for export as json Eleme...
dbImport($node, &$lft=1, $depth=1, $parent=0)
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
il_import($packageFolder, $packageId, $ilias, $validate, $reimport=false)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
SCORM 13 Metadata importer.
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
Class ilSCORM2004Chapter.
static _refreshStatus($a_obj_id, $a_users=null)
Set dirty.
setSequencingInfo($a_node, $a_seq_info, $a_import_sequencing, $a_fix_obj_id="")
Save sequencing ingo.
exportXML()
Export as internal XML.
foreach($_POST as $key=> $value) $res
il_importAss($packageId, $sco_id, $packageFolder)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
setProgress($progress, $msg='')
static removeCMIDataForUser($user_id)
static _removeTrackingDataForUser($user_id)
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
il_importLM($slm, $packageFolder, $a_import_sequencing=false)
Class ilSCORM2004Sequencing.
static _lookupType($a_id, $a_reference=false)
lookup object type
static _writeDescription($a_obj_id, $a_desc)
write description to db (static)
if(php_sapi_name() !='cli') $in
static utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
static renameExecutables($a_dir)
Rename uploaded executables for security reasons.
Class ilObjSCORM2004LearningModule.
__construct($packageId=null)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
il_importSco($packageId, $sco_id, $packageFolder)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
static recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
static removeCMIDataForPackage($packageId)
for($i=6; $i< 13; $i++) for($i=1; $i< 13; $i++) $d
importGlossary($slm, $packageFolder)