5require_once
"./Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php";
20 const CONVERT_XSL =
'./Modules/Scorm2004/templates/xsl/op/scorm12To2004.xsl';
21 const WRAPPER_HTML =
'./Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/GenericRunTimeWrapper.htm';
22 const WRAPPER_JS =
'./Modules/Scorm2004/scripts/converter/GenericRunTimeWrapper1.0_aadlc/SCOPlayerWrapper.js';
33 parent::__construct($a_id,$a_call_by_reference);
43 $this->import_sequencing = $a_val;
53 return $this->import_sequencing;
78 if (!function_exists(
'json_encode') || !function_exists(
'json_decode') ) {
79 $ilias->raiseError(
$lng->txt(
'scplayer_phpmysqlcheck'),
$ilias->error_obj->WARNING);
82 $needs_convert =
false;
89 $check_for_manifest_file = is_file($manifest_file);
94 if (!$check_for_manifest_file)
96 $this->
ilias->raiseError($this->lng->txt(
"Manifestfile $manifest_file not found!"), $this->ilias->error_obj->MESSAGE);
101 if ($check_for_manifest_file)
103 $manifest_file_array = file($manifest_file);
105 foreach($manifest_file_array as $mfa)
108 if (@iconv(
'UTF-8',
'UTF-8', $mfa) != $mfa)
110 $needs_convert =
true;
118 $estimated_manifest_filesize = filesize($manifest_file) * 2;
122 $check_disc_free = 2;
130 if ($check_for_manifest_file && ($check_disc_free > 1))
134 if (!copy($manifest_file, $manifest_file.
".old"))
136 echo
"Failed to copy $manifest_file...<br>\n";
141 $f_write_handler = fopen($manifest_file.
".new",
"w");
142 $f_read_handler = fopen($manifest_file.
".old",
"r");
143 while (!feof($f_read_handler))
145 $zeile = fgets($f_read_handler);
147 fputs($f_write_handler, utf8_encode($zeile));
149 fclose($f_read_handler);
150 fclose($f_write_handler);
153 if (!copy($manifest_file.
".new", $manifest_file))
155 echo
"Failed to copy $manifest_file...<br>\n";
158 if (!@is_file($manifest_file))
160 $this->
ilias->raiseError($this->lng->txt(
"cont_no_manifest"),
161 $this->ilias->error_obj->WARNING);
168 if (!($check_disc_free > 1))
169 $this->
ilias->raiseError($this->lng->txt(
"Not enough space left on device!"),$this->ilias->error_obj->MESSAGE);
177 $hmani = fopen($manifest_file,
"r");
178 $start = fread($hmani, 3);
179 if (strtolower(bin2hex(
$start)) ==
"efbbbf")
181 $f_write_handler = fopen($manifest_file.
".new",
"w");
182 while (!feof($hmani))
184 $n = fread($hmani, 900);
185 fputs($f_write_handler,
$n);
187 fclose($f_write_handler);
191 if (!copy($manifest_file.
".new", $manifest_file))
193 echo
"Failed to copy $manifest_file...<br>\n";
203 if (
$_POST[
"validate"] ==
"y")
208 $this->
ilias->error_obj->WARNING);
217 include_once (
"./Modules/Scorm2004/classes/ilSCORM13Package.php");
232 $out = file_get_contents($this->imsmanifestFile);
233 $check =
'/xmlns="http:\/\/www.imsglobal.org\/xsd\/imscp_v1p1"/';
234 $replace=
"xmlns=\"http://www.imsproject.org/xsd/imscp_rootv1p1p2\"";
235 $out=preg_replace($check, $replace,
$out);
236 file_put_contents($this->imsmanifestFile,
$out);
243 ##check manifest-file for version. Check for schemaversion as this is a required element for SCORM 2004
244 ##accept 2004 3rd Edition an CAM 1.3 as valid schemas
248 $this->imsmanifestFile=$manifest;
249 $doc =
new DomDocument();
253 $doc->load($this->imsmanifestFile);
254 $elements = $doc->getElementsByTagName(
"schemaversion");
255 $schema=$elements->item(0)->nodeValue;
256 if (strtolower(trim(
$schema))==
"cam 1.3" || strtolower(trim(
$schema))==
"2004 3rd edition" || strtolower(trim(
$schema))==
"2004 4th edition") {
258 $this->converted=
false;
262 $this->converted=
true;
266 $organizations = $doc->getElementsByTagName(
"organizations");
268 if ($organizations->item(0)==
null) die(
"organizations missing in manifest");
269 $default=$organizations->item(0)->getAttribute(
"default");
270 if ($default==
"" || $default==
null) {
272 $organization = $doc->getElementsByTagName(
"organization");
273 $ident=$organization->item(0)->getAttribute(
"identifier");
274 $organizations->item(0)->setAttribute(
"default",$ident);
281 $wrapperdir=$this->packageFolder.
"/GenericRunTimeWrapper1.0_aadlc";
283 copy(self::WRAPPER_HTML,$wrapperdir.
"/GenericRunTimeWrapper.htm");
284 copy(self::WRAPPER_JS,$wrapperdir.
"/SCOPlayerWrapper.js");
287 $this->backupManifest=$this->packageFolder.
"/imsmanifest.xml.back";
288 $ret=copy($this->imsmanifestFile,$this->backupManifest);
291 $this->totransform = $doc;
292 $ilLog->write(
"SCORM: about to transform to SCORM 2004");
294 $xsl =
new DOMDocument;
296 $xsl->load(self::CONVERT_XSL);
297 $prc =
new XSLTProcessor;
298 $r = @$prc->importStyleSheet($xsl);
300 file_put_contents($this->imsmanifestFile, $prc->transformToXML($this->totransform));
302 $ilLog->write(
"SCORM: Transformation completed");
320 SELECT MAX(c_timestamp) last_access
321 FROM cmi_node, cp_node
322 WHERE cmi_node.cp_node_id = cp_node.cp_node_id
323 AND cp_node.slm_id = %s
325 GROUP BY c_timestamp',
326 array(
'integer',
'integer'),
327 array($a_obj_id, $a_usr_id));
331 return $row[
"last_access"];
387 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004DeleteData.php");
388 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
389 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
392 foreach($a_users as $user)
407 $sco_set =
$ilDB->queryF(
'
408 SELECT DISTINCT cmi_node.cp_node_id id
409 FROM cp_node, cmi_node
411 AND cp_node.cp_node_id = cmi_node.cp_node_id
412 ORDER BY cmi_node.cp_node_id ',
414 array($this->
getId()));
418 while($sco_rec =
$ilDB->fetchAssoc($sco_set))
420 $item[
'id']=$sco_rec[
"id"];
422 $items[count($items)] =$item;
437 $val_set =
$ilDB->queryF(
438 'SELECT cp_node_id FROM cp_node
440 AND cp_node.slm_id = %s',
441 array(
'text',
'integer'),
442 array(
'item',$this->
getId())
444 while($val_rec =
$ilDB->fetchAssoc($val_set))
446 array_push($scos,$val_rec[
'cp_node_id']);
449 foreach ($scos as $sco)
451 $data_set =
$ilDB->queryF(
'
452 SELECT c_timestamp last_access, total_time, success_status, completion_status,
453 c_raw, scaled, cp_node_id
455 WHERE cp_node_id = %s
457 array(
'integer',
'integer'),
458 array($sco,$a_user_id)
461 while($data_rec =
$ilDB->fetchAssoc($data_set))
463 if ($data_rec[
"success_status"]!=
"" && $data_rec[
"success_status"]!=
"unknown") {
464 $status = $data_rec[
"success_status"];
466 if ($data_rec[
"completion_status"]==
"") {
469 $status = $data_rec[
"completion_status"];
476 if ($data_rec[
"c_raw"] !=
null) {
477 $score = $data_rec[
"c_raw"];
478 if ($data_rec[
"scaled"] !=
null) $score .=
" = ";
480 if ($data_rec[
"scaled"] !=
null) $score .= ($data_rec[
"scaled"]*100).
"%";
483 $data[] = array(
"sco_id"=>$data_rec[
"cp_node_id"],
484 "score" => $score,
"time" => $time,
"status" => $status,
"last_access"=>$last_access,
"title"=>
$title);
489 $data[$data_rec[
"cp_node_id"]] = $data_rec;
503 $val_set =
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE user_id = %s AND obj_id = %s',
504 array(
'integer',
'integer'),
505 array($a_user_id, $this->
getId()));
507 $val_rec =
$ilDB->fetchAssoc($val_set);
509 if ($val_rec[
"package_attempts"] ==
null) {
510 $val_rec[
"package_attempts"]=
"";
513 return $val_rec[
"package_attempts"];
522 $val_set =
$ilDB->queryF(
'SELECT module_version FROM sahs_user WHERE user_id = %s AND obj_id = %s',
523 array(
'integer',
'integer'),
524 array($a_user_id, $this->
getId()));
526 $val_rec =
$ilDB->fetchAssoc($val_set);
528 if ($val_rec[
"module_version"] ==
null) {
529 $val_rec[
"module_version"]=
"";
531 return $val_rec[
"module_version"];
545 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
548 include_once
'./Services/Object/classes/class.ilObjectLP.php';
550 $collection = $olp->getCollectionInstance();
553 $scos = $collection->getItems();
556 $fhandle = fopen($a_file,
"r");
558 $obj_id = $this->getID();
560 $usersToDelete = array();
561 $fields = fgetcsv($fhandle, 4096,
';');
562 while(($csv_rows = fgetcsv($fhandle, 4096,
";")) !== FALSE) {
563 $data = array_combine($fields, $csv_rows);
568 if (
$data[
"user"] && is_numeric(
$data[
"user"])) $user_id =
$data[
"user"];
572 $date_ex = explode(
'.',
$data[
'Date']);
573 $last_access = implode(
'-', array($date_ex[2], $date_ex[1], $date_ex[0]));
575 if (
$data[
'LastAccess']) {
576 $last_access =
$data[
'LastAccess'];
581 if (
$data[
"Status"]) {
582 if (is_numeric(
$data[
"Status"])) $status =
$data[
"Status"];
588 if(
$data[
"Attempts"]) $attempts =
$data[
"Attempts"];
590 $percentage_completed = 0;
592 else if (
$data[
'percentageCompletedSCOs']) $percentage_completed =
$data[
'percentageCompletedSCOs'];
594 $sco_total_time_sec =
null;
595 if (
$data[
'SumTotal_timeSeconds']) $sco_total_time_sec =
$data[
'SumTotal_timeSeconds'];
598 $usersToDelete[] = $user_id;
600 $this->
importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
605 foreach ($scos as $sco_id)
608 SELECT completion_status, success_status, user_id FROM cmi_node WHERE cp_node_id = %s AND user_id = %s',
609 array(
'integer',
'integer'),
610 array($sco_id,$user_id)
615 $nextId =
$ilDB->nextId(
'cmi_node');
616 $val_set =
$ilDB->manipulateF(
'INSERT INTO cmi_node
617 (cp_node_id,user_id,completion_status,c_timestamp,cmi_node_id)
618 VALUES(%s,%s,%s,%s,%s)',
619 array(
'integer',
'integer',
'text',
'timestamp',
'integer'),
620 array($sco_id,$user_id,
'completed',$last_access,$nextId));
624 if ( (
$row[
"completion_status"] ==
"completed" &&
$row[
"success_status"] !=
"failed") ||
$row[
"success_status"] ==
"passed") {
625 if ($doUpdate !=
true) $doUpdate =
false;
630 if ($doUpdate ==
true) {
631 $ilDB->update(
'cmi_node',
633 'completion_status' => array(
'text',
'completed'),
634 'success_status' => array(
'text',
''),
635 'suspend_data' => array(
'text',
''),
636 'c_timestamp' => array(
'timestamp', $last_access)
639 'user_id' => array(
'integer', $user_id),
640 'cp_node_id' => array(
'integer', $sco_id)
653 if (count($usersToDelete)>0) {
658 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
671 $aV = array(0, 0, 0, 0, 0, 0);
674 if (strpos($str,
"P") != 0) {
678 $aT = array(
"Y",
"M",
"D",
"H",
"M",
"S");
681 $str = substr($str,1);
682 for ($i = 0; $i < count($aT); $i++) {
683 if (strpos($str,
"T")===0) {
684 $str = substr($str,1);
688 $p = strpos($str,$aT[$i]);
691 if ($i == 1 && strpos($str,
"T") > -1 && strpos($str,
"T") < $p) {
694 if ($aT[$i] ==
"S") {
695 $aV[$i] = substr($str,0, $p);
698 $aV[$i] = intval(substr($str,0, $p));
700 if (!is_numeric($aV[$i])) {
703 }
else if ($i > 2 && !$bTFound) {
707 $str = substr($str,$p + 1);
711 if (!$bErr && strlen($str) != 0) {
720 return $aV[0] * 3155760000 + $aV[1] * 262980000 + $aV[2] * 8640000 + $aV[3] * 360000 + $aV[4] * 6000 + round($aV[5] * 100);
730 $val_set =
$ilDB->queryF(
'
731 SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item
732 WHERE cp_item.cp_node_id = cp_node.cp_node_id
733 AND cp_item.resourceid = cp_resource.id
736 AND cp_node.slm_id = %s ',
737 array(
'text',
'text',
'integer'),
738 array(
'sco',
'item',$this->
getId()));
740 while ($val_rec =
$ilDB->fetchAssoc($val_set))
742 array_push($scos,$val_rec[
'cp_node_id']);
749 for ($i=0;$i<count($scos);$i++)
752 $val_set =
$ilDB->queryF(
'
753 SELECT * FROM cmi_node
756 AND (completion_status=%s OR success_status=%s))',
757 array(
'integer',
'integer',
'text',
'text'),
758 array($a_user,$scos[$i],
'completed',
'passed')
761 if (
$ilDB->numRows($val_set) > 0) {
763 $key = array_search($scos[$i], $scos_c);
764 unset ($scos_c[$key]);
769 if (count($scos_c) == 0) {
789 $val_set =
$ilDB->queryF(
'
790 SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item
791 WHERE cp_item.cp_node_id = cp_node.cp_node_id
792 AND cp_item.resourceid = cp_resource.id
795 AND cp_node.slm_id = %s',
796 array(
'text',
'text',
'integer'), array(
'sco' ,
'item',$a_id));
797 while ($val_rec =
$ilDB->fetchAssoc($val_set))
799 array_push($scos,$val_rec[
'cp_node_id']);
805 for ($i=0;$i<count($scos);$i++)
808 $val_set =
$ilDB->queryF(
'
809 SELECT * FROM cmi_node
812 AND (completion_status = %s OR success_status = %s))',
813 array(
'integer',
'integer',
'text',
'text'),
814 array($a_user,$scos[$i],
'completed',
'passed'));
816 if (
$ilDB->numRows($val_set) > 0)
819 $key = array_search($scos[$i], $scos_c);
820 unset ($scos_c[$key]);
825 if (count($scos_c) == 0) {
845 $val_set =
$ilDB->queryF(
"SELECT cp_node.cp_node_id FROM cp_node,cp_resource,cp_item WHERE".
846 " cp_item.cp_node_id=cp_node.cp_node_id AND cp_item.resourceId = cp_resource.id AND scormType='sco' AND nodeName='item' AND cp_node.slm_id = %s GROUP BY cp_node.cp_node_id",
850 while ($val_rec =
$ilDB->fetchAssoc($val_set))
852 array_push($scos,$val_rec[
'cp_node_id']);
856 for ($i=0;$i<count($scos);$i++)
858 $val_set =
$ilDB->queryF(
"SELECT scaled FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)",
859 array(
'integer',
'integer'),
860 array($a_user, $scos[$i])
862 if ($val_set->numRows()>0)
864 $val_rec =
$ilDB->fetchAssoc($val_set);
865 if ($val_rec[
'scaled']!=NULL) {
867 $scaled = $val_rec[
'scaled'];
871 $retVal = ($set == 1) ? $scaled :
null ;
885 $item_set =
$ilDB->queryF(
'
886 SELECT cp_item.* FROM cp_node, cp_item WHERE slm_id = %s
887 AND cp_node.cp_node_id = cp_item.cp_node_id
888 ORDER BY cp_node.cp_node_id ',
894 while ($item_rec =
$ilDB->fetchAssoc($item_set))
897 $s2 =
$ilDB->queryF(
'
898 SELECT cp_resource.* FROM cp_node, cp_resource
900 AND cp_node.cp_node_id = cp_resource.cp_node_id
901 AND cp_resource.id = %s ',
902 array(
'integer',
'text'),
903 array($a_obj_id,$item_rec[
"resourceid"])
910 if (
$res[
"scormtype"] ==
"sco")
912 $items[] = array(
"id" => $item_rec[
"cp_node_id"],
913 "title" => $item_rec[
"title"]);
925 $status_set =
$ilDB->queryF(
'
926 SELECT * FROM cmi_gobjective
928 AND objective_id = %s
930 array(
'integer',
'text',
'integer'),
931 array($a_obj_id,
'course_overall_status',$a_user_id)
934 if ($status_rec =
$ilDB->fetchAssoc($status_set))
936 return $status_rec[
"status"];
947 $status_set =
$ilDB->queryF(
'
948 SELECT * FROM cmi_gobjective
950 AND objective_id = %s
952 array(
'integer',
'text',
'integer'),
953 array($a_obj_id,
'course_overall_status',$a_user_id)
956 if ($status_rec =
$ilDB->fetchAssoc($status_set))
958 return $status_rec[
"satisfied"];
968 $status_set =
$ilDB->queryF(
'
969 SELECT * FROM cmi_gobjective
971 AND objective_id = %s
973 array(
'integer',
'text',
'integer'),
974 array($a_obj_id,
'course_overall_status',$a_user_id)
977 if ($status_rec =
$ilDB->fetchAssoc($status_set))
979 return $status_rec[
"measure"];
990 SELECT * FROM cp_item
991 WHERE cp_node_id = %s',
996 if ($i =
$ilDB->fetchAssoc(
$r))
1008 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Tree.php");
1014 $this->slm_tree->addTree($this->
getId(), 1);
1017 include_once (
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1019 $seq_info->insert();
1025 $this->slm_tree->setTreeTablePK(
"slm_id");
1026 $this->slm_tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1027 return $this->slm_tree;
1033 $ilTabs->setTabActive(
"sequencing");
1035 include_once (
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1038 return $control_settings;
1042 include_once (
"./Modules/Scorm2004/classes/seq_editor/class.ilSCORM2004Sequencing.php");
1048 $control_settings->insert();
1064 $this->slm_tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1065 $this->slm_tree->setTreeTablePK(
"slm_id");
1067 require_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004NodeFactory.php");
1076 $target_parent = $this->slm_tree->getParentId(
$target_id);
1080 if ($source_obj->getType() ==
"page")
1082 if ($this->slm_tree->isInTree($source_obj->getId()))
1084 $node_data = $this->slm_tree->getNodeData($source_obj->getId());
1087 if ($movecopy ==
"move")
1089 $parent_id = $this->slm_tree->getParentId($source_obj->getId());
1090 $this->slm_tree->deleteTree($node_data);
1112 if(!$this->slm_tree->isInTree($source_obj->getId()))
1119 else if ($as_subitem)
1123 $pg_childs = $this->slm_tree->getChildsByType($parent,
"page");
1124 if (count($pg_childs) != 0)
1126 $target_pos = $pg_childs[count($pg_childs) - 1][
"obj_id"];
1132 $parent = $target_parent;
1136 $this->slm_tree->insertNode($source_obj->getId(),
1137 $parent, $target_pos);
1158 if ($source_obj->getType() ==
"sco" || $source_obj->getType() ==
"ass")
1161 $source_node = $this->slm_tree->getNodeData($source_id);
1162 $subnodes = $this->slm_tree->getSubtree($source_node);
1165 foreach ($subnodes as $subnode)
1180 $pg_childs = $this->slm_tree->getChildsByType($target_parent,
"page");
1181 if (count($pg_childs) != 0)
1183 $target_pos = $pg_childs[count($pg_childs) - 1][
"obj_id"];
1186 else if ($as_subitem)
1190 $childs = $this->slm_tree->getChilds($target_parent);
1191 if (count($childs) != 0)
1193 $target_pos = $childs[count($childs) - 1][
"obj_id"];
1198 if ($movecopy ==
"move")
1200 $this->slm_tree->deleteTree($source_node);
1209 if (!$this->slm_tree->isInTree($source_id))
1211 $this->slm_tree->insertNode($source_id, $target_parent, $target_pos);
1214 if ($movecopy ==
"move")
1216 foreach ($subnodes as $node)
1218 if($node[
"obj_id"] != $source_id)
1220 $this->slm_tree->insertNode($node[
"obj_id"], $node[
"parent"]);
1231 if ($source_obj->getType() ==
"chap")
1234 $source_node = $this->slm_tree->getNodeData($source_id);
1235 $subnodes = $this->slm_tree->getSubtree($source_node);
1238 foreach ($subnodes as $subnode)
1259 else if ($as_subitem)
1263 $childs = $this->slm_tree->getChilds($target_parent);
1264 if (count($childs) != 0)
1266 $target_pos = $childs[count($childs) - 1][
"obj_id"];
1271 if ($movecopy ==
"move")
1273 $this->slm_tree->deleteTree($source_node);
1282 if (!$this->slm_tree->isInTree($source_id))
1284 $this->slm_tree->insertNode($source_id, $target_parent, $target_pos);
1287 if ($movecopy ==
"move")
1289 foreach ($subnodes as $node)
1291 if($node[
"obj_id"] != $source_id)
1293 $this->slm_tree->insertNode($node[
"obj_id"], $node[
"parent"]);
1310 require_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Export.php");
1312 $export =
new ilSCORM2004Export($this);
1313 foreach ($export->getSupportedExportTypes() as
$type)
1315 $dir = $export->getExportDirectoryForType(
$type);
1317 if (!@is_dir($dir) or !is_writeable($dir))
1325 while ($entry = $cdir->read())
1327 if ($entry !=
"." and
1330 preg_match(
"~^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)*[0-9]+\.zip\$~", $entry) or
1331 preg_match(
"~^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)*[0-9]+\.pdf\$~", $entry) or
1332 preg_match(
"~^[0-9]{10}_{2}[0-9]+_{2}(".$this->
getType().
"_)*[0-9]+\.iso\$~", $entry)
1335 $file[$entry.$type] = array(
"type" =>
$type,
"file" => $entry,
1336 "size" => filesize($dir.
"/".$entry));
1360 $metadata_xml = $a_xml_writer->xmlDumpMem(
false);
1361 $a_xml_writer->_XmlWriter;
1363 $xsl = file_get_contents(
"./Modules/Scorm2004/templates/xsl/metadata.xsl");
1364 $args = array(
'/_xml' => $metadata_xml ,
'/_xsl' => $xsl );
1366 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl",NULL,$args,NULL);
1368 file_put_contents($a_target_dir.
'/indexMD.xml',
$output);
1374 include_once(
"./Modules/Glossary/classes/class.ilObjGlossary.php");
1375 include_once(
"./Modules/Glossary/classes/class.ilGlossaryExport.php");
1378 $glo_xml_writer->xmlSetDtdDef(
"<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
1380 $glo_xml_writer->xmlHeader();
1384 $glos->exportXML($glo_xml_writer,$glos_export->getInstId(), $a_target_dir.
"/glossary", $expLog);
1385 $glo_xml_writer->xmlDumpFile($a_target_dir.
"/glossary/glossary.xml");
1386 $glo_xml_writer->_XmlWriter;
1391 $a_xml_writer->
xmlSetDtdDef(
"<!DOCTYPE ContentObject SYSTEM \"http://www.ilias.de/download/dtd/ilias_co_3_7.dtd\">");
1394 $a_xml_writer->xmlSetGenCmt(
"Export of ILIAS Content Module ". $this->
getId().
" of installation ".$a_inst.
".");
1397 $a_xml_writer->xmlHeader();
1401 $a_xml_writer->xmlStartTag(
"ContentObject", array(
"Type"=>
"SCORM2004LearningModule"));
1409 $expLog->write(
date(
"[y-m-d H:i:s] ").
"Start Export Sco Objects");
1411 $expLog->write(
date(
"[y-m-d H:i:s] ").
"Finished Export Sco Objects");
1413 $a_xml_writer->xmlEndTag(
"ContentObject");
1414 $a_xml_writer->xmlDumpFile($a_target_dir.
'/index.xml',
false);
1416 if ($ver ==
"2004 4th") {
1421 if ($ver ==
"2004 3rd") {
1427 $css_dir = $a_target_dir.
"/ilias_css_4_2";
1429 include_once(
"./Modules/Scorm2004/classes/class.ilScormExportUtil.php");
1433 include_once(
"./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1435 $manifestBuilder->buildManifest($ver,$revision);
1436 $manifestBuilder->dump($a_target_dir);
1438 $xsl = file_get_contents(
"./Modules/Scorm2004/templates/xsl/module.xsl");
1439 $args = array(
'/_xml' => file_get_contents($a_target_dir.
"/imsmanifest.xml"),
'/_xsl' => $xsl );
1441 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl",NULL,$args,NULL);
1443 fputs(fopen($a_target_dir.
'/index.html',
'w+'),
$output);
1448 if ($revision ==
"3rd") {
1449 ilUtil::rCopy(
'./Modules/Scorm2004/templates/xsd/adlcp_130_export_2004',$a_target_dir,
false);
1452 if ($revision ==
"4th") {
1453 ilUtil::rCopy(
'./Modules/Scorm2004/templates/xsd/adlcp_130_export_2004_4th',$a_target_dir,
false);
1457 ilUtil::rCopy(
'./Modules/Scorm2004/templates/xsd/adlcp_120_export_12',$a_target_dir,
false);
1461 $a_xml_writer->_XmlWriter;
1469 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1470 $tree->setTreeTablePK(
"slm_id");
1471 foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),
true,
'sco') as $sco)
1473 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1474 $sco_folder = $a_target_dir.
"/".$sco[
'obj_id'];
1477 $node->exportHTML4PDF($a_inst, $sco_folder, $expLog);
1485 $a_xml_writer->
xmlStartTag(
"ContentObject", array(
"Type"=>
"SCORM2004SCO"));
1488 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1489 $tree->setTreeTablePK(
"slm_id");
1490 foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),
true,
'sco') as $sco)
1492 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1493 $sco_folder = $a_target_dir.
"/".$sco[
'obj_id'];
1496 $node->exportPDFPrepareXmlNFiles($a_inst, $a_target_dir, $expLog, $a_xml_writer);
1501 include_once(
"./Modules/Glossary/classes/class.ilObjGlossary.php");
1502 include_once(
"./Modules/Glossary/classes/class.ilGlossaryExport.php");
1505 $glos->exportXML($a_xml_writer,$glos_export->getInstId(), $a_target_dir.
"/glossary", $expLog);
1507 $a_xml_writer->xmlEndTag(
"ContentObject");
1508 include_once
'Services/Transformation/classes/class.ilXML2FO.php';
1510 $xml2FO->setXSLTLocation(
'./Modules/Scorm2004/templates/xsl/contentobject2fo.xsl');
1511 $xml2FO->setXMLString($a_xml_writer->xmlDumpMem());
1512 $xml2FO->setXSLTParams(array (
'target_dir' => $a_target_dir));
1513 $xml2FO->transform();
1514 $fo_string = $xml2FO->getFOString();
1515 $fo_xml = simplexml_load_string($fo_string);
1516 $fo_ext = $fo_xml->xpath(
"//fo:declarations");
1517 $fo_ext = $fo_ext[0];
1519 include_once
"./Services/Utilities/classes/class.ilFileUtils.php";
1523 foreach (
$results[
"file"] as $key => $value)
1525 $e = $fo_ext->addChild(
"fox:embedded-file",
"",
"http://xml.apache.org/fop/extensions");
1526 $e->addAttribute(
"src",
$results[path][$key].$value);
1527 $e->addAttribute(
"name",$value);
1528 $e->addAttribute(
"desc",
"");
1531 $fo_string = $fo_xml->asXML();
1532 $a_xml_writer->_XmlWriter;
1538 $one_file = fopen($a_target_dir.
'/index.html',
'w+');
1539 $this->
exportHTML($a_inst, $a_target_dir, $expLog, $one_file);
1546 function exportHTML($a_inst, $a_target_dir, &$expLog, $a_one_file =
"")
1575 if ($a_one_file ==
"")
1577 include_once(
"./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1579 $manifestBuilder->buildManifest(
'12');
1581 include_once(
"Services/Frameset/classes/class.ilFramesetGUI.php");
1583 $fs_gui->setFramesetTitle($this->
getTitle());
1584 $fs_gui->setMainFrameSource(
"");
1585 $fs_gui->setSideFrameSource(
"toc.html");
1586 $fs_gui->setMainFrameName(
"content");
1587 $fs_gui->setSideFrameName(
"toc");
1589 fputs(fopen($a_target_dir.
'/index.html',
'w+'),
$output);
1591 $xsl = file_get_contents(
"./Modules/Scorm2004/templates/xsl/module.xsl");
1592 $xml = simplexml_load_string($manifestBuilder->writer->xmlDumpMem());
1593 $args = array(
'/_xml' => $xml->organizations->organization->asXml(),
'/_xsl' => $xsl );
1595 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl",NULL,$args,NULL);
1597 fputs(fopen($a_target_dir.
'/toc.html',
'w+'),
$output);
1610 include_once(
"Services/MetaData/classes/class.ilMD2XML.php");
1612 $md2xml->setExportMode(
true);
1613 $md2xml->startExport();
1614 $a_xml_writer->appendXML($md2xml->getXML());
1625 include_once(
"Services/MetaData/classes/class.ilMD2XML.php");
1627 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1628 $tree->setTreeTablePK(
"slm_id");
1629 $a_xml_writer->xmlStartTag(
"StructureObject");
1630 foreach($tree->getFilteredSubTree($tree->getRootId(),Array(
'page')) as $obj)
1632 if($obj[
'type']==
'')
continue;
1635 $md2xml =
new ilMD2XML($this->
getId(), $obj[
'obj_id'], $obj[
'type']);
1636 $md2xml->setExportMode(
true);
1637 $md2xml->startExport();
1638 $a_xml_writer->appendXML($md2xml->getXML());
1640 $a_xml_writer->xmlEndTag(
"StructureObject");
1654 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1655 $tree->setTreeTablePK(
"slm_id");
1656 foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),
true,array(
'sco',
'ass')) as $sco)
1658 if ($sco[
'type'] ==
"sco")
1660 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1661 $sco_folder = $a_target_dir.
"/".$sco[
'obj_id'];
1664 $node->exportScorm($a_inst, $sco_folder, $ver, $expLog);
1666 if ($sco[
'type'] ==
"ass")
1668 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Asset.php");
1669 $sco_folder = $a_target_dir.
"/".$sco[
'obj_id'];
1672 $node->exportScorm($a_inst, $sco_folder, $ver, $expLog);
1688 $tree->setTableNames(
'sahs_sc13_tree',
'sahs_sc13_tree_node');
1689 $tree->setTreeTablePK(
"slm_id");
1692 if ($a_one_file !=
"")
1697 $sco_tpl =
new ilTemplate(
"tpl.sco.html",
true,
true,
"Modules/Scorm2004");
1698 include_once(
"./Services/COPage/classes/class.ilCOPageHTMLExport.php");
1700 $sco_tpl = $page_html_export->getPreparedMainTemplate($sco_tpl);
1702 $sco_tpl->setCurrentBlock(
"js_file");
1703 $sco_tpl->setVariable(
"JS_FILE",
"./js/pure.js");
1704 $sco_tpl->parseCurrentBlock();
1705 $sco_tpl->setCurrentBlock(
"js_file");
1706 $sco_tpl->setVariable(
"JS_FILE",
"./js/question_handling.js");
1707 $sco_tpl->parseCurrentBlock();
1710 $sco_tpl->setCurrentBlock(
"head");
1711 $sco_tpl->parseCurrentBlock();
1712 fputs($a_one_file, $sco_tpl->get(
"head"));
1715 include_once(
"./Modules/Scorm2004/classes/class.ilContObjectManifestBuilder.php");
1717 $manifestBuilder->buildManifest(
'12');
1718 $xsl = file_get_contents(
"./Modules/Scorm2004/templates/xsl/module.xsl");
1719 $xml = simplexml_load_string($manifestBuilder->writer->xmlDumpMem());
1720 $args = array(
'/_xml' => $xml->organizations->organization->asXml(),
'/_xsl' => $xsl );
1722 $params = array(
"one_page" =>
"y");
1723 $output = xslt_process($xh,
"arg:/_xml",
"arg:/_xsl",NULL,$args,
$params);
1729 foreach($tree->getSubTree($tree->getNodeData($tree->getRootId()),
true,
'sco') as $sco)
1731 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Sco.php");
1732 $sco_folder = $a_target_dir.
"/".$sco[
'obj_id'];
1736 if ($a_one_file ==
"")
1738 $node->exportHTML($a_inst, $sco_folder, $expLog, $a_one_file);
1742 $node->exportHTMLPageObjects($a_inst, $a_target_dir, $expLog,
'full',
1743 "sco", $a_one_file, $sco_tpl);
1747 include_once(
"./Modules/Glossary/classes/class.ilObjGlossary.php");
1754 if ($a_one_file !=
"")
1757 fputs($a_one_file, $sco_tpl->get(
"tail"));
1771 include_once(
"./Services/Style/System/classes/class.ilSystemStyleHTMLExport.php");
1773 $this->sys_style_html_export->export();
1776 include_once(
"./Services/COPage/classes/class.ilCOPageHTMLExport.php");
1778 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
1779 $this->co_page_html_export->setContentStyleId(
1781 $this->co_page_html_export->createDirectories();
1782 $this->co_page_html_export->exportStyles();
1783 $this->co_page_html_export->exportSupportScripts();
1785 include_once(
"./Services/MediaObjects/classes/class.ilPlayerUtil.php");
1793 include_once(
"./Services/MediaObjects/classes/class.ilPlayerUtil.php");
1798 copy(
'./Modules/Scorm2004/scripts/scorm_2004.js',$a_target_dir.
'/js/scorm.js');
1799 copy(
'./Modules/Scorm2004/scripts/pager.js',$a_target_dir.
'/js/pager.js');
1800 copy(
'./Modules/Scorm2004/scripts/questions/pure.js',$a_target_dir.
'/js/pure.js');
1801 copy(
'./Modules/Scorm2004/scripts/questions/question_handling.js',
1802 $a_target_dir.
'/js/question_handling.js');
1815 return $this->public_export_file[
$a_type];
1824 include_once(
"./Modules/File/classes/class.ilObjFile.php");
1826 foreach ($this->file_ids as $file_id)
1828 $expLog->write(
date(
"[y-m-d H:i:s] ").
"File Item ".$file_id);
1829 $file_obj =
new ilObjFile($file_id,
false);
1830 $file_obj->export($a_target_dir);
1840 $this->public_export_file[
$a_type] = $a_file;
1860 'SELECT cp_node.cp_node_id '
1861 .
'FROM cp_node, cp_resource, cp_item '
1862 .
'WHERE cp_item.cp_node_id = cp_node.cp_node_id '
1863 .
'AND cp_item.resourceId = cp_resource.id '
1864 .
'AND scormType = '.
$ilDB->quote(
'sco',
'text').
' '
1865 .
'AND nodeName = '.
$ilDB->quote(
'item',
'text').
' '
1866 .
'AND cp_node.slm_id = '.
$ilDB->quote($a_id,
'integer').
' '
1867 .
'GROUP BY cp_node.cp_node_id'
1872 array_push($scos,
$row[
'cp_node_id']);
1877 for($i = 0; $i < count($scos); $i++)
1880 'SELECT c_max FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)',
1881 array(
'integer',
'integer'),
1882 array($a_user, $scos[$i])
1888 if(
$row[
'c_max'] !=
null)
1891 $max =
$row[
'c_max'];
1895 $retVal = ($set == 1) ? $max :
null;
1902 $retAr = array(
"raw" =>
null,
"max" =>
null,
"scaled" =>
null);
1903 $val_set =
$ilDB->queryF(
"SELECT c_raw, c_max, scaled FROM cmi_node WHERE (user_id = %s AND cp_node_id = %s)",
1904 array(
'integer',
'integer'),
1905 array($a_user, $a_cp_node_id)
1907 if ($val_set->numRows()>0)
1909 $val_rec =
$ilDB->fetchAssoc($val_set);
1910 $retAr[
"raw"] = $val_rec[
'c_raw'];
1911 $retAr[
"max"] = $val_rec[
'c_max'];
1912 $retAr[
"scaled"] = $val_rec[
'scaled'];
1913 if ($val_rec[
'scaled']==
null && $val_rec[
'c_raw']!=
null && $val_rec[
'c_max']!=
null) {
1914 $retAr[
"scaled"] = ($val_rec[
'c_raw'] / $val_rec[
'c_max']);
1931 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
1935 $style_obj =
$ilias->obj_factory->getInstanceByObjId($style_id);
1936 $new_id = $style_obj->ilClone();
1937 $a_new_obj->setStyleSheetId($new_id);
1938 $a_new_obj->update();
1941 $a_new_obj->createScorm2004Tree();
1942 $source_tree = $this->
getTree();
1943 $target_tree_root_id = $a_new_obj->getTree()->readRootId();
1944 $childs = $source_tree->getChilds($source_tree->readRootId());
1945 $a_copied_nodes = array();
1946 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Node.php");
1947 foreach ($childs as $c)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
An exception for terminatinating execution or to throw for unit testing.
HTML export class for pages.
static _deleteReadEventsForUsers($a_obj_id, array $a_user_ids)
Content Object (ILIAS native learning module / digilib book) Manifest export class.
static secondsToString($seconds, $force_with_seconds=false, $a_lng=null)
converts seconds to string: Long: 7 days 4 hour(s) ...
static formatDate(ilDateTime $date)
Format a date @access public.
@classDescription Date and time handling
static recursive_dirscan($dir, &$arr)
Recursively scans a given directory and writes path and filename into referenced array.
Export class for content objects.
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _refreshStatus($a_obj_id, $a_users=null)
Set dirty.
const LP_STATUS_COMPLETED_NUM
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
getEditable()
Get Editable.
getAssignedGlossary()
get assigned glossary
getStyleSheetId()
get ID of assigned style sheet object
getDataDirectory($mode="filesystem")
get data directory of lm
Class ilObjSCORM2004LearningModule.
__construct($a_id=0, $a_call_by_reference=true)
Constructor @access public.
exportXMLStructureObjects(&$a_xml_writer, $a_inst, &$expLog)
export structure objects to xml (see ilias_co.dtd)
deleteTrackingDataOfUsers($a_users)
get all tracked items of current user
validate($directory)
Validate all XML-Files in a SCOM-Directory.
setImportSequencing($a_val)
Set import sequencing.
exportXMLScoObjects($a_inst, $a_target_dir, $ver, &$expLog)
export page objects to xml (see ilias_co.dtd)
static _ISODurationToCentisec($str)
convert ISO 8601 Timeperiods to centiseconds ta
exportPDF($a_inst, $a_target_dir, &$expLog)
exportHTML($a_inst, $a_target_dir, &$expLog, $a_one_file="")
Export SCORM package to HTML.
static _getTrackingItems($a_obj_id)
get all tracking items of scorm object
copyAuthoredContent($a_new_obj)
Copy authored content (everything done with the editor.
exportXMLMetaData(&$a_xml_writer)
export content objects meta data to xml (see ilias_co.dtd)
getTrackingDataAgg($a_user_id, $raw=false)
executeDragDrop($source_id, $target_id, $first_child, $as_subitem=false, $movecopy="move")
Execute Drag Drop Action.
static _getMaxScoreForUser($a_id, $a_user)
Returns score.max for the learning module, refered to the last sco where score.max is set.
getCourseCompletionForUser($a_user)
exportHTML4PDF($a_inst, $a_target_dir, &$expLog)
exportHTMLScoObjects($a_inst, $a_target_dir, &$expLog, $a_one_file="")
static _getStatus($a_obj_id, $a_user_id)
getImportSequencing()
Get import sequencing.
getAttemptsForUser($a_user_id)
get number of atttempts for a certain user and package
static _getUniqueScaledScoreForUser($a_id, $a_user)
Get the Unique Scaled Score of a course Conditions: Only one SCO may set cmi.score....
updateSequencingSettings()
exportHTMLOne($a_inst, $a_target_dir, &$expLog)
static _lookupLastAccess($a_obj_id, $a_usr_id)
Return the last access timestamp for a given user.
getTrackedItems()
get all tracked items of current user
static _getMeasure($a_obj_id, $a_user_id)
readObject()
read manifest file @access public
static _getSatisfied($a_obj_id, $a_user_id)
getPublicExportFile($a_type)
get public export file
createScorm2004Tree()
Create Scorm 2004 Tree used by Editor.
exportFileItems($a_target_dir, &$expLog)
export files of file itmes
getModuleVersionForUser($a_user_id)
get module version that tracking data for a user was recorded on
static _getScores2004ForUser($a_cp_node_id, $a_user)
static _lookupItemTitle($a_node_id)
convert_1_2_to_2004($manifest)
setPublicExportFile($a_type, $a_file)
prepareHTMLExporter($a_target_dir)
Prepare HTML exporter.
exportScorm($a_inst, $a_target_dir, $ver, &$expLog)
Export (authoring) scorm package.
static _getCourseCompletionForUser($a_id, $a_user)
Get the completion of a SCORM module for a given user.
Class ilObjSCORMLearningModule.
importSuccessForSahsUser($user_id, $last_access, $status, $attempts=null, $percentage_completed=null, $sco_total_time_sec=null)
static _lookupStandard($a_id)
Lookup standard flag.
static getEffectiveContentStyleId($a_style_id, $a_type="")
Get effective Style Id.
static getInstance($a_obj_id)
getType()
get object type @access public
getId()
get object id @access public
getTitle()
get object title @access public
static getFlashVideoPlayerDirectory()
Get flash video player directory.
static copyPlayerFilesToTargetDirectory($a_target_dir)
Copy css files to target dir.
static removeCMIDataForUserAndPackage($user_id, $packageId)
static getInstance($a_slm_object, $a_id=0, $a_halt=true)
static pasteTree($a_target_slm, $a_item_id, $a_parent_id, $a_target, $a_insert_time, &$a_copied_nodes, $a_as_copy=false, $a_from_clipboard=true, $a_source_parent_type="")
Paste item (tree) from clipboard or other learning module to target scorm learning module.
Class ilSCORM2004Sequencing.
static exportContentCSS($a_slm_object, $a_target_dir)
Export lm content css to a directory.
HTML export class for system styles.
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 rCopy($a_sdir, $a_tdir, $preserveTimeAttributes=false)
Copies content of a directory $a_sdir recursively to a directory $a_tdir.
static now()
Return current timestamp in Y-m-d H:i:s format.
static yn2tf($a_yn)
convert "y"/"n" to true/false
static makeDir($a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
xmlStartTag($tag, $attrs=NULL, $empty=FALSE, $encode=TRUE, $escape=TRUE)
Writes a starttag.
xmlSetDtdDef($dtdDef)
Sets dtd definition.
if(!is_dir( $entity_dir)) exit("Fatal Error ([A-Za-z0-9]+)\s+" &#(? foreach( $entity_files as $file) $output
redirection script todo: (a better solution should control the processing via a xml file)
if(!file_exists("$old.txt")) if( $old===$new) if(file_exists("$new.txt")) $file