11require_once 
"./Modules/Scorm2004/classes/ilSCORM13Package.php";
 
   12require_once 
"./Modules/Scorm2004/classes/class.ilSCORM2004Chapter.php";
 
   13require_once 
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php";
 
   14require_once 
"./Modules/Scorm2004/classes/class.ilSCORM2004PageNode.php";
 
   15require_once 
"./Modules/Scorm2004/classes/adlparser/SeqTreeBuilder.php";
 
   16require_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 = 
''; 
 
   77        $this->userId = 
$GLOBALS[
'USER'][
'usr_id'];
 
   90        $pg_set = 
$ilDB->queryF(
'SELECT * FROM cp_package WHERE obj_id  = %s', array(
'integer'), array(
$packageId));
 
   93        $this->packageData = array_merge($lm_data, $pg_data);
 
   95        $this->packageFolder = $this->packagesFolder . 
'/' . 
$packageId;
 
   96        $this->packageFile = $this->packageFolder . 
'.zip';
 
   97        $this->imsmanifestFile = $this->packageFolder . 
'/' . 
'imsmanifest.xml';
 
  105        if (is_dir($this->packageFolder)) {
 
  106            dir_delete($this->packageFolder);
 
  108        if (is_file($this->packageFile)) {
 
  109            @unlink($this->packageFile);
 
  122        header(
'content-type: text/xml');
 
  123        header(
'content-disposition: attachment; filename="manifest.xml"');
 
  126            'SELECT xmldata FROM cp_package WHERE obj_id = %s',
 
  128            array($this->packageId)
 
  148        if ($reimport === 
true) {
 
  155        $this->imsmanifestFile = $this->packageFolder . 
'/' . 
'imsmanifest.xml';
 
  157        $this->imsmanifest = 
new DOMDocument;
 
  158        $this->imsmanifest->async = 
false;
 
  159        if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
 
  160            $this->diagnostic[] = 
'XML not wellformed';
 
  165        $this->manifest = $this->
transform($this->imsmanifest, self::DB_ENCODE_XSL);
 
  167        if (!$this->manifest) {
 
  168            $this->diagnostic[] = 
'Cannot transform into normalized manifest';
 
  172        $path = 
new DOMXpath($this->manifest);
 
  173        $path->registerNamespace(
"scorm", 
"http://www.openpalms.net/scorm/scorm13");
 
  174        $items = 
$path->query(
"//scorm:item");
 
  175        if ($items->length == 1) {
 
  176            $n = $items->item(0);
 
  177            $resource = 
$path->query(
"//scorm:resource");
 
  178            foreach ($resource as 
$res) {
 
  179                if (
$res->getAttribute(
'id') == 
$n->getAttribute(
"resourceId")) {
 
  180                    $res->setAttribute(
'scormType', 
'sco');
 
  186        if ($validate==
"y") {
 
  187            if (!$this->
validate($this->manifest, self::VALIDATE_XSD)) {
 
  189                    "<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,
 
  196        if (file_exists($this->packageFolder . 
'/' . 
'index.xml')) {
 
  197            $doc = simplexml_load_file($this->packageFolder . 
'/' . 
'index.xml');
 
  198            $l = $doc->xpath(
"/ContentObject/MetaData");
 
  200                include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  202                $mdxml->startParsing();
 
  203                $mdxml->getMDObject()->update();
 
  206            include_once(
"./Modules/Scorm2004/classes/class.ilSCORM13MDImporter.php");
 
  209            $title = $importer->getTitle();
 
  217        $x = simplexml_load_string($this->manifest->saveXML());
 
  218        $x[
'persistPreviousAttempts'] = $this->packageData[
'persistprevattempts'];
 
  219        $x[
'online'] = $this->packageData[
'c_online'];
 
  221        $x[
'defaultLessonMode'] = $this->packageData[
'default_lesson_mode'];
 
  222        $x[
'credit'] = $this->packageData[
'credit'];
 
  223        $x[
'autoReview'] = $this->packageData[
'auto_review'];
 
  227        foreach (
$x->resource as $xe) {
 
  228            $r[strval($xe[
'id'])] = $xe;
 
  232        foreach (
$x->xpath(
'//*[local-name()="item"]') as $xe) {
 
  234            if ($b = 
$r[strval($xe[
'resourceId'])]) {
 
  235                $xe[
'href'] = strval($b[
'base']) . strval($b[
'href']);
 
  236                unset($xe[
'resourceId']);
 
  237                if (strval($b[
'scormType'])==
'sco') {
 
  246        foreach (
$x->sequencing as 
$s) {
 
  250        $j[
'item'][
'base'] = strval(
$x[
'base']);
 
  253        $j[
'foreignId'] = floatval(
$x[
'foreignId']); 
 
  254        $j[
'id'] = strval(
$x[
'id']); 
 
  259        $adl_tree = $act->buildNodeSeqTree($this->imsmanifestFile);
 
  263                'xmldata'                       => array(
'clob', 
$x->asXML()),
 
  264                'jsdata'                        => array(
'clob', json_encode($j)),
 
  265                'activitytree'          => array(
'clob', json_encode($adl_tree[
'tree'])),
 
  266                'global_to_system'      => array(
'integer', (
int) $adl_tree[
'global']),
 
  267                'shared_data_global_to_system' => array(
'integer', (
int) $adl_tree[
'dataglobal'])
 
  270                'obj_id'                        => array(
'integer', (
int) $this->packageId)
 
  279        return $j[
'item'][
'title'];
 
  295        $this->imsmanifestFile = $this->packageFolder . 
'/' . 
'index.xml';
 
  296        $this->imsmanifest = 
new DOMDocument;
 
  297        $this->imsmanifest->async = 
false;
 
  299        if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
 
  300            $this->diagnostic[] = 
'XML not wellformed';
 
  309        $sco_xml_file = $this->packageFolder . 
'/sco.xml';
 
  310        if (is_file($sco_xml_file)) {
 
  311            $scodoc = 
new DOMDocument;
 
  312            $scodoc->async = 
false;
 
  313            if (!@$scodoc->load($sco_xml_file)) {
 
  314                $this->diagnostic[] = 
'XML of sco.xml not wellformed';
 
  319            $xpath = 
new DOMXPath($scodoc);
 
  320            $nodes = $xpath->query(
"/sco/objective");
 
  321            foreach ($nodes as $node) {
 
  322                $t_node = $node->firstChild;
 
  323                if (is_object($t_node)) {
 
  324                    $objective_text = $t_node->textContent;
 
  325                    if (trim($objective_text) != 
"") {
 
  326                        $objs = $sco->getObjectives();
 
  327                        foreach ($objs as $o) {
 
  328                            $mappings = $o->getMappings();
 
  329                            if ($mappings == 
null) {
 
  330                                $ob = 
new ilScorm2004Objective($sco->getId(), $o->getId());
 
  331                                $ob->setObjectiveID($objective_text);
 
  332                                $ob->updateObjective();
 
  354        $this->imsmanifestFile = $this->packageFolder . 
'/' . 
'index.xml';
 
  355        $this->imsmanifest = 
new DOMDocument;
 
  356        $this->imsmanifest->async = 
false;
 
  358        if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
 
  359            $this->diagnostic[] = 
'XML not wellformed';
 
  415        $this->packageId=
$slm->getId();
 
  416        $this->imsmanifestFile = $this->packageFolder . 
'/' . 
'imsmanifest.xml';
 
  417        $this->imsmanifest = 
new DOMDocument;
 
  418        $this->imsmanifest->async = 
false;
 
  419        $this->imsmanifest->formatOutput = 
false;
 
  420        $this->imsmanifest->preserveWhiteSpace = 
false;
 
  422        if (!@$this->imsmanifest->load($this->imsmanifestFile)) {
 
  423            $this->diagnostic[] = 
'XML not wellformed';
 
  427        $this->mani_xpath = 
new DOMXPath($this->imsmanifest);
 
  428        $this->mani_xpath->registerNamespace(
"d", 
"http://www.imsproject.org/xsd/imscp_rootv1p1p2");
 
  429        $this->mani_xpath->registerNamespace(
"imscp", 
"http://www.imsglobal.org/xsd/imscp_v1p1");
 
  430        $this->mani_xpath->registerNamespace(
"imsss", 
"http://www.imsglobal.org/xsd/imsss");
 
  434            simplexml_import_dom($this->imsmanifest->documentElement),
 
  450        include_once(
"./Modules/Glossary/classes/class.ilObjGlossary.php");
 
  452        $newObj->setType(
'glo');
 
  453        $newObj->setTitle(
'');
 
  454        $newObj->create(
true);
 
  455        $newObj->createReference();
 
  456        $newObj->putInTree(
$_GET[
"ref_id"]);
 
  457        $newObj->setPermissions(
$_GET[
"ref_id"]);
 
  462        if (!is_file($xml_file)) {
 
  466        include_once(
"./Modules/LearningModule/classes/class.ilContObjParser.php");
 
  468        $contParser->startParsing();
 
  471        $slm->setAssignedGlossary($newObj->getId());
 
  475    public function dbImportLM($node, $parent_id = 
"", $a_import_sequencing = 
false)
 
  477        switch ($node->getName()) {
 
  479                $this->slm_tree = 
new ilTree($this->slm->getId());
 
  480                $this->slm_tree->setTreeTablePK(
"slm_id");
 
  481                $this->slm_tree->setTableNames(
'sahs_sc13_tree', 
'sahs_sc13_tree_node');
 
  482                $this->slm_tree->addTree($this->slm->getId(), 1);
 
  485                include_once(
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
 
  489                $r = $this->mani_xpath->query(
"/d:manifest/d:organizations/d:organization/imsss:sequencing");
 
  490                $this->imsmanifest->formatOutput = 
false;
 
  493                    if ($a_import_sequencing) {
 
  494                        $seq_info->initDom();
 
  499                if (file_exists($this->packageFolder . 
'/' . 
'index.xml')) {
 
  500                    $doc = simplexml_load_file($this->packageFolder . 
'/' . 
'index.xml');
 
  501                    $l = $doc->xpath(
"/ContentObject/MetaData");
 
  503                        include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  504                        $mdxml = 
new ilMDXMLCopier(
$l[0]->asXML(), $this->slm->getId(), $this->slm->getId(), $this->slm->getType());
 
  505                        $mdxml->startParsing();
 
  506                        $mdxml->getMDObject()->update();
 
  511                $this->slm->title=$node->title;
 
  514                $a = $node->attributes();
 
  515                if (preg_match(
"/il_\d+_chap_\d+/", $a[
'identifier'])) {
 
  517                    $chap->setTitle($node->title);
 
  518                    $chap->setSLMId($this->slm->getId());
 
  522                    $r = $this->mani_xpath->query(
"//d:item[@identifier='" . $a[
'identifier'] . 
"']/imsss:sequencing");
 
  526                        $seq_info->initDom();
 
  531                    $parent_id = $chap->getId();
 
  532                    $doc = simplexml_load_file($this->packageFolder . 
'/' . 
'index.xml');
 
  533                    $l = $doc->xpath(
"/ContentObject/StructureObject/MetaData[General/Identifier/@Entry='" . $a[
'identifier'] . 
"']");
 
  535                        include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  536                        $mdxml = 
new ilMDXMLCopier(
$l[0]->asXML(), $this->slm->getId(), $chap->getId(), $chap->getType());
 
  537                        $mdxml->startParsing();
 
  538                        $mdxml->getMDObject()->update();
 
  541                if (preg_match(
"/il_\d+_sco_(\d+)/", $a[
'identifier'], $match)) {
 
  543                    $sco->setTitle($node->title);
 
  544                    $sco->setSLMId($this->slm->getId());
 
  548                    $r = $this->mani_xpath->query(
"//d:item[@identifier='" . $a[
'identifier'] . 
"']/imsss:sequencing");
 
  554                            $a_import_sequencing,
 
  555                            "local_obj_" . $sco->getID() . 
"_0" 
  557                        $seq_info->initDom();
 
  563                    $newPack->il_importSco($this->slm->getId(), $sco->getId(), $this->packageFolder . 
"/" . $match[1]);
 
  564                    $parent_id = $sco->getId();
 
  566                if (preg_match(
"/il_\d+_ass_(\d+)/", $a[
'identifier'], $match)) {
 
  568                    $ass->setTitle($node->title);
 
  569                    $ass->setSLMId($this->slm->getId());
 
  573                    $r = $this->mani_xpath->query(
"//d:item[@identifier='" . $a[
'identifier'] . 
"']/imsss:sequencing");
 
  579                            $a_import_sequencing,
 
  580                            "local_obj_" . $ass->getID() . 
"_0" 
  582                        $seq_info->initDom();
 
  588                    $newPack->il_importAss($this->slm->getId(), $ass->getId(), $this->packageFolder . 
"/" . $match[1]);
 
  589                    $parent_id = $ass->getId();
 
  596            foreach ($node->children() as $child) {
 
  597                $this->
dbImportLM($child, $parent_id, $a_import_sequencing);
 
  608    public function setSequencingInfo($a_node, $a_seq_info, $a_import_sequencing, $a_fix_obj_id = 
"")
 
  610        $seq_xml = trim(str_replace(
"imsss:", 
"", $this->imsmanifest->saveXML($a_node)));
 
  611        if ($seq_xml != 
"") {
 
  612            $a_seq_info->setImportSeqXml(
'<?xml version="1.0"?>' . $seq_xml);
 
  614        if ($a_import_sequencing) {
 
  615            if ($a_fix_obj_id != 
"") {
 
  616                $seq_xml = preg_replace(
"/local_obj_[0-9]*_0/", $a_fix_obj_id, $seq_xml);
 
  618            $a_seq_info->setSeqXml(
'<?xml version="1.0"?>' . $seq_xml);
 
  626        $this->diagnostic[] = $msg;
 
  639        foreach ($node->attributes() as $k => $v) {
 
  644            } elseif ($v===
"false") {
 
  646            } elseif (is_numeric($v)) {
 
  651        foreach ($node->children() as 
$name => $child) {
 
  662            if ($f [type] == 
'file' && substr($f [entry], 0, 4) == 
'qti_') {
 
  663                include_once 
"./Services/QTI/classes/class.ilQTIParser.php";
 
  664                include_once 
"./Modules/Test/classes/class.ilObjTest.php";
 
  668                $result = $qtiParser->startParsing();
 
  669                $founditems = &$qtiParser->getFoundItems();
 
  671                foreach ($founditems as $qp) {
 
  686                    $qtiParser->setTestObject($newObj);
 
  687                    $result = $qtiParser->startParsing();
 
  689                    $qtis = array_merge($qtis, $qtiParser->getImportMapping());
 
  694        include_once 
'Modules/Scorm2004/classes/class.ilSCORM2004Page.php';
 
  695        $doc = 
new SimpleXMLElement($this->imsmanifest->saveXml());
 
  696        $l = $doc->xpath(
"/ContentObject/MetaData");
 
  698            include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  700            $mdxml->startParsing();
 
  701            $mdxml->getMDObject()->update();
 
  703        $l = $doc->xpath(
"/ContentObject/PageObject");
 
  704        foreach (
$l as $page_xml) {
 
  705            $tnode = $page_xml->xpath(
'MetaData/General/Title');
 
  707            $page->setTitle($tnode [0]);
 
  708            $page->setSLMId(
$slm->getId());
 
  711            $pmd = $page_xml->xpath(
"MetaData");
 
  713                include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  714                $mdxml = 
new ilMDXMLCopier($pmd[0]->asXML(), 
$slm->getId(), $page->getId(), $page->getType());
 
  715                $mdxml->startParsing();
 
  716                $mdxml->getMDObject()->update();
 
  718            $tnode = $page_xml->xpath(
"//MediaObject/MediaAlias | //InteractiveImage/MediaAlias");
 
  719            foreach ($tnode as $ttnode) {
 
  720                include_once 
'./Services/MediaObjects/classes/class.ilObjMediaObject.php';
 
  721                $OriginId = $ttnode[OriginId];
 
  722                $medianodes = $doc->xpath(
"//MediaObject[MetaData/General/Identifier/@Entry='" . $OriginId . 
"']");
 
  723                $medianode = $medianodes[0];
 
  726                    $media_object->setTitle($medianode->MetaData->General->Title);
 
  727                    $media_object->setDescription($medianode->MetaData->General->Description);
 
  728                    $media_object->create(
false);
 
  729                    $mmd = $medianode->xpath(
"MetaData");
 
  731                        include_once 
'Services/MetaData/classes/class.ilMDXMLCopier.php';
 
  732                        $mdxml = 
new ilMDXMLCopier($mmd[0]->asXML(), 0, $media_object->getId(), $media_object->getType());
 
  733                        $mdxml->startParsing();
 
  734                        $mdxml->getMDObject()->update();
 
  737                    $media_object->createDirectory();
 
  739                    foreach ($medianode->MediaItem as $xMediaItem) {
 
  741                        $media_object->addMediaItem($media_item);
 
  742                        $media_item->setPurpose($xMediaItem[Purpose]);
 
  743                        $media_item->setFormat($xMediaItem->Format);
 
  744                        $media_item->setLocation($xMediaItem->Location);
 
  745                        $media_item->setLocationType($xMediaItem->Location[Type]);
 
  746                        $media_item->setWidth($xMediaItem->Layout[Width]);
 
  747                        $media_item->setHeight($xMediaItem->Layout[Height]);
 
  748                        $media_item->setHAlign($xMediaItem->Layout[HorizontalAlign]);
 
  749                        $media_item->setCaption($xMediaItem->Caption);
 
  750                        $media_item->setTextRepresentation($xMediaItem->TextRepresentation);
 
  754                        foreach ($xMediaItem->MapArea as 
$n => $v) {
 
  755                            if ($v->ExtLink[Href] != 
"") {
 
  756                                include_once(
"./Services/MediaObjects/classes/class.ilMapArea.php");
 
  760                                $map_area->setShape($v[Shape]);
 
  761                                $map_area->setCoords($v[Coords]);
 
  763                                $map_area->setTitle($v->ExtLink);
 
  764                                $map_area->setHref($v->ExtLink[Href]);
 
  766                                $media_item->addMapArea($map_area);
 
  770                        if ($media_item->getLocationType()==
"LocalFile") {
 
  777                    ilUtil::rCopy($this->packageFolder . 
"/objects/" . $OriginId, $mob_dir);
 
  784                    $media_object->update(
true);
 
  785                    $ttnode [OriginId] = 
"il__mob_" . $media_object->getId();
 
  788            include_once(
"./Modules/File/classes/class.ilObjFile.php");
 
  789            include_once(
"./Services/Utilities/classes/class.ilFileUtils.php");
 
  790            include_once(
"./Services/MediaObjects/classes/class.ilObjMediaObject.php");
 
  792            $intlinks = $page_xml->xpath(
"//IntLink");
 
  796                foreach ($intlinks as $intlink) {
 
  797                    if ($intlink[Type]!=
"File") {
 
  800                    $path = $this->packageFolder . 
"/objects/" . str_replace(
'dfile', 
'file', $intlink[Target]);
 
  801                    if (!is_dir(
$path)) {
 
  808                    $fileObj->setType(
"file");
 
  817                    $fileObj->createReference();
 
  820                    $fileObj->createDirectory();
 
  822                    $intlink[Target]=
"il__dfile_" . $fileObj->getId();
 
  825            $fileitems = $page_xml->xpath(
"//FileItem/Identifier");
 
  828                foreach ($fileitems as $fileitem) {
 
  829                    $path = $this->packageFolder . 
"/objects/" . $fileitem[
Entry];
 
  830                    if (!is_dir(
$path)) {
 
  837                    $fileObj->setType(
"file");
 
  846                    $fileObj->createReference();
 
  849                    $fileObj->createDirectory();
 
  851                    $fileitem[
Entry]=
"il__file_" . $fileObj->getId();
 
  856            $ddoc = 
new DOMDocument();
 
  857            $ddoc->async = 
false;
 
  858            $ddoc->preserveWhiteSpace = 
false;
 
  859            $ddoc->formatOutput = 
false;
 
  860            $ddoc->loadXML($page_xml->asXML());
 
  861            $xpath  = 
new DOMXPath($ddoc);
 
  862            $tnode = $xpath->query(
'PageContent');
 
  864            foreach ($tnode as $ttnode) {
 
  865                $t .= str_replace(
"&", 
"&", $ddoc->saveXML($ttnode));
 
  867            $t .=
"</PageObject>";
 
  868            foreach ($qtis as 
$old=>$q) {
 
  869                $t = str_replace(
$old, 
'il__qst_' . $q[
'pool'], 
$t);
 
  871            $pagex->setXMLContent(
$t);
 
  872            $pagex->updateFromXML();
 
  876    public function dbImport($node, &$lft=1, $depth=1, $parent=0)
 
  880        switch ($node->nodeType) {
 
  881            case XML_DOCUMENT_NODE:
 
  886                    'SELECT * FROM cp_package WHERE obj_id = %s AND c_identifier = %s',
 
  887                    array(
'integer', 
'text'),
 
  888                    array($this->packageId, $this->packageName)
 
  891                    $query = 
'UPDATE cp_package ' 
  892                           . 
'SET persistprevattempts = %s, c_settings = %s ' 
  893                           . 
'WHERE obj_id = %s AND c_identifier= %s';
 
  896                        array(
'integer', 
'text', 
'integer', 
'text'),
 
  897                        array(0, 
null, $this->packageId, $this->packageName)
 
  900                    $query = 
'INSERT INTO cp_package (obj_id, c_identifier, persistprevattempts, c_settings) ' 
  901                           . 
'VALUES (%s, %s, %s, %s)';
 
  904                        array(
'integer',
'text',
'integer', 
'text'),
 
  905                        array($this->packageId, $this->packageName, 0, 
null)
 
  910                $this->
dbImport($node->documentElement); 
 
  913            case XML_ELEMENT_NODE:
 
  914                if ($node->nodeName===
'manifest') {
 
  915                    if ($node->getAttribute(
'uri')==
"") {
 
  917                        $node->setAttribute(
'uri', 
'md5:' . $this->packageHash);
 
  921                $cp_node_id = 
$ilDB->nextId(
'cp_node');
 
  923                $query = 
'INSERT INTO cp_node (cp_node_id, slm_id, nodename) ' 
  924                       . 
'VALUES (%s, %s, %s)';
 
  927                    array(
'integer', 
'integer', 
'text'),
 
  928                    array($cp_node_id, $this->packageId, $node->nodeName)
 
  931                $query = 
'INSERT INTO cp_tree (child, depth, lft, obj_id, parent, rgt) ' 
  932                       . 
'VALUES (%s, %s, %s, %s, %s, %s)';
 
  935                    array(
'integer', 
'integer', 
'integer', 
'integer', 
'integer', 
'integer'),
 
  936                    array($cp_node_id, $depth, $lft++, $this->packageId, $parent, 0)
 
  941                $names = array(
'cp_node_id');
 
  942                $values = array($cp_node_id);
 
  943                $types = array(
'integer');
 
  945                foreach ($node->attributes as $attr) {
 
  946                    switch (strtolower($attr->name)) {
 
  947                        case 'completionsetbycontent': 
$names[] = 
'completionbycontent';
break;
 
  948                        case 'objectivesetbycontent': 
$names[] = 
'objectivebycontent';
break;
 
  949                        case 'type': 
$names[] = 
'c_type';
break;
 
  950                        case 'mode': 
$names[] = 
'c_mode';
break;
 
  951                        case 'language': 
$names[] = 
'c_language';
break;
 
  952                        case 'condition': 
$names[] = 
'c_condition';
break;
 
  953                        case 'operator': 
$names[] = 
'c_operator';
break;
 
  954                        case 'condition': 
$names[] = 
'c_condition';
break;
 
  955                        case 'readnormalizedmeasure': 
$names[] = 
'readnormalmeasure';
break;
 
  956                        case 'writenormalizedmeasure': 
$names[] = 
'writenormalmeasure';
break;
 
  957                        case 'minnormalizedmeasure': 
$names[] = 
'minnormalmeasure';
break;
 
  958                        case 'primary': 
$names[] = 
'c_primary';
break;
 
  959                        case 'minnormalizedmeasure': 
$names[] = 
'minnormalmeasure';
break;
 
  960                        case 'persistpreviousattempts': 
$names[] = 
'persistprevattempts';
break;
 
  961                        case 'identifier': 
$names[] = 
'c_identifier';
break;
 
  962                        case 'settings': 
$names[] = 
'c_settings';
break;
 
  963                        case 'activityabsolutedurationlimit': 
$names[] = 
'activityabsdurlimit';
break;
 
  964                        case 'activityexperienceddurationlimit': 
$names[] = 
'activityexpdurlimit';
break;
 
  965                        case 'attemptabsolutedurationlimit': 
$names[] = 
'attemptabsdurlimit';
break;
 
  966                        case 'measuresatisfactionifactive': 
$names[] = 
'measuresatisfactive';
break;
 
  967                        case 'objectivemeasureweight': 
$names[] = 
'objectivemeasweight';
break;
 
  968                        case 'requiredforcompleted': 
$names[] = 
'requiredcompleted';
break;
 
  969                        case 'requiredforincomplete': 
$names[] = 
'requiredincomplete';
break;
 
  970                        case 'requiredfornotsatisfied': 
$names[] = 
'requirednotsatisfied';
break;
 
  971                        case 'rollupobjectivesatisfied': 
$names[] = 
'rollupobjectivesatis';
break;
 
  972                        case 'rollupprogresscompletion': 
$names[] = 
'rollupprogcompletion';
break;
 
  973                        case 'usecurrentattemptobjectiveinfo': 
$names[] = 
'usecurattemptobjinfo';
break;
 
  974                        case 'usecurrentattemptprogressinfo': 
$names[] = 
'usecurattemptproginfo';
break;
 
  975                        default: 
$names[] = strtolower($attr->name);
break;
 
  980                        array(
'flow', 
'completionbycontent',
 
  981                                      'objectivebycontent', 
'rollupobjectivesatis',
 
  983                                      'choiceexit', 
'satisfiedbymeasure',
 
  984                                      'c_primary', 
'constrainchoice',
 
  985                                      'forwardonly', 
'global_to_system',
 
  986                                      'writenormalmeasure', 
'writesatisfiedstatus',
 
  987                                      'readnormalmeasure', 
'readsatisfiedstatus',
 
  988                                      'preventactivation', 
'measuresatisfactive',
 
  989                                      'reorderchildren', 
'usecurattemptproginfo',
 
  990                                      'usecurattemptobjinfo', 
'rollupprogcompletion',
 
  991                                      'read_shared_data', 
'write_shared_data',
 
  992                                      'shared_data_global_to_system', 
'completedbymeasure')
 
  994                        if ($attr->value == 
'true') {
 
  996                        } elseif ($attr->value == 
'false') {
 
  999                            $values[] = (int) $attr->value;
 
 1002                        $values[] = $attr->value;
 
 1007                        array(
'objectivesglobtosys', 
'attemptlimit',
 
 1008                                       'flow', 
'completionbycontent',
 
 1009                                       'objectivebycontent', 
'rollupobjectivesatis',
 
 1010                                       'tracked', 
'choice',
 
 1011                                       'choiceexit', 
'satisfiedbymeasure',
 
 1012                                       'c_primary', 
'constrainchoice',
 
 1013                                       'forwardonly', 
'global_to_system',
 
 1014                                       'writenormalmeasure', 
'writesatisfiedstatus',
 
 1015                                       'readnormalmeasure', 
'readsatisfiedstatus',
 
 1016                                       'preventactivation', 
'measuresatisfactive',
 
 1017                                       'reorderchildren', 
'usecurattemptproginfo',
 
 1018                                       'usecurattemptobjinfo', 
'rollupprogcompletion',
 
 1019                                       'read_shared_data', 
'write_shared_data',
 
 1020                                       'shared_data_global_to_system')
 
 1022                        $types[] = 
'integer';
 
 1025                        array(
'jsdata', 
'xmldata', 
'activitytree', 
'data')
 
 1030                        array(
'objectivemeasweight')
 
 1038                if ($node->nodeName===
'datamap') {
 
 1041                    $types[] = 
'integer';
 
 1043                    $names[] = 
'sco_node_id';
 
 1044                    $values[] = $parent;
 
 1045                    $types[] = 
'integer';
 
 1049                $insert_data = array();
 
 1051                    $insert_data[$db_field] = array($types[
$key], trim($values[
$key]));
 
 1053                $ilDB->insert(
'cp_' . strtolower($node->nodeName), $insert_data);
 
 1055                $node->setAttribute(
'foreignId', $cp_node_id);
 
 1056                $this->idmap[$node->getAttribute(
'id')] = $cp_node_id;
 
 1059                foreach ($node->childNodes as $child) {
 
 1060                    $this->
dbImport($child, $lft, $depth + 1, $cp_node_id); 
 
 1064                $query = 
'UPDATE cp_tree SET rgt = %s WHERE child = %s';
 
 1067                    array(
'integer', 
'integer'),
 
 1068                    array($lft++, $cp_node_id)
 
 1082        $ilDB->insert(
'cp_package', array(
 
 1083            'obj_id'            => array(
'integer', $this->packageId),
 
 1084            'xmldata'           => array(
'clob', 
$x->asXML()),
 
 1085            'jsdata'            => array(
'clob', json_encode($j))
 
 1094        include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
 
 1097        include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
 
 1106        $cp_nodes = array();
 
 1109            'SELECT cp_node.cp_node_id FROM cp_node WHERE cp_node.slm_id = %s',
 
 1111            array($this->packageId)
 
 1114            $cp_nodes[] = 
$data[
'cp_node_id'];
 
 1118        foreach (self::$elements[
'cp'] as 
$t) {
 
 1121            $in = 
$ilDB->in(strtolower(
$t) . 
'.cp_node_id', $cp_nodes, 
false, 
'integer');
 
 1122            $ilDB->manipulate(
'DELETE FROM ' . strtolower(
$t) . 
' WHERE ' . 
$in);
 
 1127            'DELETE FROM cp_tree WHERE cp_tree.obj_id = %s',
 
 1129            array($this->packageId)
 
 1133            'DELETE FROM cp_node WHERE cp_node.slm_id = %s',
 
 1135            array($this->packageId)
 
 1140            'DELETE FROM cp_package WHERE cp_package.obj_id = %s',
 
 1142            array($this->packageId)
 
 1153    public function transform($inputdoc, $xslfile, $outputpath = 
null)
 
 1155        $xsl = 
new DOMDocument;
 
 1156        $xsl->async = 
false;
 
 1157        if (!@$xsl->load($xslfile)) {
 
 1158            die(
'ERROR: load StyleSheet ' . $xslfile);
 
 1160        $prc = 
new XSLTProcessor;
 
 1161        $prc->registerPHPFunctions();
 
 1162        $r = @$prc->importStyleSheet($xsl);
 
 1163        if (
false===@$prc->importStyleSheet($xsl)) {
 
 1164            die(
'ERROR: importStyleSheet ' . $xslfile);
 
 1167            file_put_contents($outputpath, $prc->transformToXML($inputdoc));
 
 1169            return $prc->transformToDoc($inputdoc);
 
 1175        libxml_use_internal_errors(
true);
 
 1176        $return = @$doc->schemaValidate(
$schema);
 
 1179            LIBXML_ERR_ERROR => 
'Error',
 
 1180            LIBXML_ERR_FATAL => 
'Fatal Error' 
 1182            foreach (libxml_get_errors() as 
$error) {
 
 1183                $level = $levels[
$error->level];
 
 1184                if (isset($level)) {
 
 1186                    $this->diagnostic[] = 
"XSLT $level (Line $error->line) $message";
 
 1189            libxml_clear_errors();
 
 1191        libxml_use_internal_errors(
false);
 
 1198        include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
 
if(php_sapi_name() !='cli') $in
An exception for terminatinating execution or to throw for unit testing.
static utf8_encode($string)
utf8-encodes string if it is not a valid utf8-string.
static recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
static _refreshStatus($a_obj_id, $a_users=null)
Set dirty.
Class ilObjSCORM2004LearningModule.
static _lookupType($a_id, $a_reference=false)
lookup object type
static _writeDescription($a_obj_id, $a_desc)
write description to db (static)
SCORM 13 Metadata importer.
dbAddNew()
add new sahs and package record
setSequencingInfo($a_node, $a_seq_info, $a_import_sequencing, $a_fix_obj_id="")
Save sequencing ingo.
transform($inputdoc, $xslfile, $outputpath=null)
__construct($packageId=null)
il_importSco($packageId, $sco_id, $packageFolder)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
il_import($packageFolder, $packageId, $ilias, $validate, $reimport=false)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
exportXML()
Export as internal XML.
jsonNode($node, &$sink)
Helper for UploadAndImport Recursively copies values from XML into PHP array for export as json Eleme...
dbImportSco($slm, $sco, $asset=false)
importGlossary($slm, $packageFolder)
static _removeTrackingDataForUser($user_id)
dbImportLM($node, $parent_id="", $a_import_sequencing=false)
il_importLM($slm, $packageFolder, $a_import_sequencing=false)
il_importAss($packageId, $sco_id, $packageFolder)
Imports an extracted SCORM 2004 module from ilias-data dir into database.
dbImport($node, &$lft=1, $depth=1, $parent=0)
setProgress($progress, $msg='')
Class ilSCORM2004Chapter.
static removeCMIDataForPackage($packageId)
static removeCMIDataForUser($user_id)
static putInTree($a_obj, $a_parent_id="", $a_target_node_id="")
put this object into content object tree
Class ilSCORM2004PageNode.
Class ilSCORM2004Sequencing.
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
static rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
static getDir($a_dir, $a_rec=false, $a_sub_dir="")
get directory
static stripSlashes($a_str, $a_strip_html=true, $a_allow="")
strip slashes if magic qoutes is enabled
static renameExecutables($a_dir)
Rename uploaded executables for security reasons.
for( $i=6;$i< 13;$i++) for($i=1; $i< 13; $i++) $d
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
catch(Exception $e) $message
foreach($_POST as $key=> $value) $res