5require_once
"./Services/Object/classes/class.ilObject.php";
6require_once
"./Modules/ScormAicc/classes/class.ilObjSCORMValidator.php";
7require_once
"./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php";
30 parent::__construct($a_id,$a_call_by_reference);
43 $returnValue = $this->validator->validate();
49 if(is_object($this->validator))
51 return $this->validator->getSummary();
68 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMTree.php");
70 $root_id = $tree->readRootId();
73 $childs = $tree->getSubTree($tree->getNodeData($root_id));
75 foreach($childs as $child)
77 if($child[
"c_type"] ==
"sit")
79 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
81 if ($sc_item->getIdentifierRef() !=
"")
83 $items[count($items)] = $sc_item;
99 $needs_convert =
false;
106 $check_for_manifest_file = is_file($manifest_file);
109 if (!$check_for_manifest_file)
111 $this->
ilias->raiseError($this->lng->txt(
"Manifestfile $manifest_file not found!"), $this->ilias->error_obj->MESSAGE);
115 if ($check_for_manifest_file)
117 $manifest_file_array = file($manifest_file);
118 foreach($manifest_file_array as $mfa)
121 if (@iconv(
'UTF-8',
'UTF-8', $mfa) != $mfa)
123 $needs_convert =
true;
129 $estimated_manifest_filesize = filesize($manifest_file) * 2;
133 $check_disc_free = 2;
140 if ($check_for_manifest_file && ($check_disc_free > 1))
144 if (!copy($manifest_file, $manifest_file.
".old"))
146 echo
"Failed to copy $manifest_file...<br>\n";
151 $f_write_handler = fopen($manifest_file.
".new",
"w");
152 $f_read_handler = fopen($manifest_file.
".old",
"r");
153 while (!feof($f_read_handler))
155 $zeile = fgets($f_read_handler);
157 fputs($f_write_handler, utf8_encode($zeile));
159 fclose($f_read_handler);
160 fclose($f_write_handler);
163 if (!copy($manifest_file.
".new", $manifest_file))
165 echo
"Failed to copy $manifest_file...<br>\n";
168 if (!@is_file($manifest_file))
170 $this->
ilias->raiseError($this->lng->txt(
"cont_no_manifest"),
171 $this->ilias->error_obj->WARNING);
178 if (!($check_disc_free > 1))
179 $this->
ilias->raiseError($this->lng->txt(
"Not enough space left on device!"),$this->ilias->error_obj->MESSAGE);
187 $hmani = fopen($manifest_file,
"r");
188 $start = fread($hmani, 3);
189 if (strtolower(bin2hex(
$start)) ==
"efbbbf")
191 $f_write_handler = fopen($manifest_file.
".new",
"w");
192 while (!feof($hmani))
194 $n = fread($hmani, 900);
195 fputs($f_write_handler,
$n);
197 fclose($f_write_handler);
201 if (!copy($manifest_file.
".new", $manifest_file))
203 echo
"Failed to copy $manifest_file...<br>\n";
213 if (
$_POST[
"validate"] ==
"y")
217 $ilErr->raiseError(
"<b>Validation Error(s):</b><br>".$this->
getValidationSummary(),$ilErr->MESSAGE);
222 include_once (
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php");
225 $slmParser->startParsing();
226 return $slmParser->getPackageTitle();
237 if (
$lm_set->get(
'scorm_lp_auto_activate') != 1)
return;
239 include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
243 include_once(
"./Services/Tracking/classes/class.ilLPObjSettings.php");
249 include_once(
"Services/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php");
252 foreach($collection->getPossibleItems() as $sco_id => $item)
256 $collection->activateEntries($scos);
265 $sco_set =
$ilDB->queryF(
'
266 SELECT DISTINCT sco_id FROM scorm_tracking WHERE obj_id = %s',
267 array(
'integer'),array($this->
getId()));
270 while($sco_rec =
$ilDB->fetchAssoc($sco_set))
272 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
274 if ($sc_item->getIdentifierRef() !=
"")
276 $items[count($items)] = $sc_item;
295 SELECT last_access FROM sahs_user
298 array(
'integer',
'integer'), array($a_obj_id,$a_usr_id));
303 return $row[
"last_access"];
313 $query =
'SELECT user_id, last_access, lastname, firstname FROM sahs_user st ' .
314 'JOIN usr_data ud ON st.user_id = ud.usr_id ' .
315 'WHERE obj_id = ' .
$ilDB->quote($this->
getId(),
'integer');
318 $query .=
' AND ' .
$ilDB->like(
'lastname',
'text',
'%' . $a_search .
'%');
320 $query .=
' GROUP BY user_id, lastname, firstname, last_access';
324 while($sco_rec =
$ilDB->fetchAssoc($sco_set))
340 $query =
'SELECT user_id, package_attempts FROM sahs_user WHERE obj_id = ' .
$ilDB->quote($this->
getId(),
'integer') .
' ';
346 $attempts[
$row[
'user_id']] = (int)
$row[
'package_attempts'];
357 $val_set =
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
358 array(
'integer',
'integer'),
359 array($this->
getId(),$a_user_id,0));
361 $val_rec =
$ilDB->fetchAssoc($val_set);
363 if ($val_rec[
"package_attempts"] ==
null) {
364 $val_rec[
"package_attempts"]=
"";
366 return $val_rec[
"package_attempts"];
377 $query =
'SELECT user_id, module_version FROM sahs_user WHERE obj_id = ' .
$ilDB->quote($this->
getId(),
'integer') .
' ';
383 $versions[
$row[
'user_id']] = (int)
$row[
'module_version'];
394 $val_set =
$ilDB->queryF(
'SELECT module_version FROM sahs_user WHERE obj_id = %s AND user_id = %s',
395 array(
'integer',
'integer'),
396 array($this->
getId(),$a_user_id,0));
398 $val_rec =
$ilDB->fetchAssoc($val_set);
400 if ($val_rec[
"module_version"] ==
null) {
401 $val_rec[
"module_version"]=
"";
403 return $val_rec[
"module_version"];
417 $data_set =
$ilDB->queryF(
'
418 SELECT * FROM scorm_tracking
423 array(
'integer',
'integer',
'integer'),
424 array($a_user_id,$a_sco_id,$this->
getId()));
427 while($data_rec =
$ilDB->fetchAssoc($data_set)) {
439 $sco_set =
$ilDB->queryF(
'
440 SELECT DISTINCT sco_id FROM scorm_tracking
444 array(
'integer',
'integer',
'integer'),
445 array($this->
getId(),$a_user_id,0));
448 while($sco_rec =
$ilDB->fetchAssoc($sco_set))
450 $data_set =
$ilDB->queryF(
'
451 SELECT * FROM scorm_tracking
459 array(
'integer',
'integer',
'integer',
'text',
'text',
'text',
'text'),
460 array($this->
getId(),
464 "cmi.core.lesson_status",
465 "cmi.core.total_time",
466 "cmi.core.score.raw")
469 $score = $time = $status =
"";
471 while($data_rec =
$ilDB->fetchAssoc($data_set))
473 switch($data_rec[
"lvalue"])
475 case "cmi.core.lesson_status":
476 $status = $data_rec[
"rvalue"];
479 case "cmi.core.total_time":
480 $time = $data_rec[
"rvalue"];
483 case "cmi.core.score.raw":
484 $score = $data_rec[
"rvalue"];
489 include_once
'./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
491 $data[] = array(
"sco_id"=>$sco_rec[
"sco_id"],
"title" => $sc_item->getTitle(),
492 "score" => $score,
"time" => $time,
"status" => $status);
495 return (array)
$data;
503 $user_set =
$ilDB->queryF(
'
504 SELECT DISTINCT user_id FROM scorm_tracking
507 array(
'integer',
'integer'),
508 array($this->
getId(),$a_sco_id));
511 while($user_rec =
$ilDB->fetchAssoc($user_set))
514 $data_set =
$ilDB->queryF(
'
515 SELECT * FROM scorm_tracking
522 array(
'integer',
'integer',
'integer',
'text',
'text',
'text'),
523 array($this->
getId(),
525 $user_rec[
"user_id"],
526 "cmi.core.lesson_status",
527 "cmi.core.total_time",
528 "cmi.core.score.raw")
531 $score = $time = $status =
"";
533 while($data_rec =
$ilDB->fetchAssoc($data_set))
535 switch($data_rec[
"lvalue"])
537 case "cmi.core.lesson_status":
538 $status = $data_rec[
"rvalue"];
541 case "cmi.core.total_time":
542 $time = $data_rec[
"rvalue"];
545 case "cmi.core.score.raw":
546 $score = $data_rec[
"rvalue"];
551 $data[] = array(
"user_id" => $user_rec[
"user_id"],
552 "score" => $score,
"time" => $time,
"status" => $status);
570 include_once(
'./Modules/ScormAicc/classes/class.ilSCORMTrackingItems.php');
571 include_once(
"./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
572 include_once(
'./Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
574 $allowExportPrivacy = $privacy->enabledExportSCORM();
577 $query =
'SELECT * FROM sahs_user WHERE obj_id = %s';
578 if (count($a_users) >0)
$query .=
' AND '.$ilDB->in(
'user_id', $a_users,
false,
'integer');
582 array($this->
getId())
584 while (
$data = $ilDB->fetchAssoc(
$res)) {
585 $csv = $csv.
$data[
"obj_id"]
587 .
";" .
$data[
"module_version"]
589 .
";\"" .
$data[
"last_access"] .
"\""
591 .
";" .
$data[
"package_attempts"]
592 .
";" .
$data[
"percentage_completed"]
593 .
";" .
$data[
"sco_total_time_sec"]
598 $header =
"LearningModuleId;LearningModuleTitle;LearningModuleVersion;".str_replace(
',',
';',$udh[
"cols"]).
";"
599 .
"LastAccess;Status;Attempts;percentageCompletedSCOs;SumTotal_timeSeconds\n";
614 $fhandle = fopen($a_file,
"r");
617 $fields = fgetcsv($fhandle, pow(2, 16),
';');
624 case "SCO-Identifier":
628 case "LearningModuleId":
641 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
644 include_once
'./Services/Object/classes/class.ilObjectLP.php';
646 $collection = $olp->getCollectionInstance();
649 $scos = $collection->getItems();
652 $fhandle = fopen($a_file,
"r");
654 $obj_id = $this->getID();
655 $fields = fgetcsv($fhandle, pow(2, 16),
';');
657 $usersToDelete = array();
658 while(($csv_rows = fgetcsv($fhandle, pow(2, 16),
";")) !== FALSE)
660 $data = array_combine($fields, $csv_rows);
665 if (
$data[
"user"] && is_numeric(
$data[
"user"])) $user_id = (int)
$data[
"user"];
671 $date_ex = explode(
'.',
$data[
'Date']);
672 $last_access = implode(
'-', array($date_ex[2], $date_ex[1], $date_ex[0]));
674 if (
$data[
'LastAccess']) {
675 $last_access =
$data[
'LastAccess'];
680 if (
$data[
"Status"]) {
681 if (is_int(
$data[
"Status"])) $status =
$data[
"Status"];
682 else if (
$data[
"Status"] ==
"0" ||
$data[
"Status"] ==
"1" ||
$data[
"Status"] ==
"2" ||
$data[
"Status"] ==
"3") $status = (int)
$data[
"Status"];
689 if(
$data[
"Attempts"]) $attempts =
$data[
"Attempts"];
691 $percentage_completed = 0;
693 if (
$data[
'percentageCompletedSCOs']) $percentage_completed =
$data[
'percentageCompletedSCOs'];
695 $sco_total_time_sec =
null;
696 if (
$data[
'SumTotal_timeSeconds']) $sco_total_time_sec =
$data[
'SumTotal_timeSeconds'];
699 $usersToDelete[] = $user_id;
701 $this->
importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
706 foreach ($scos as $sco_id)
708 $statement =
$ilDB->queryF(
'
709 SELECT * FROM scorm_tracking
714 array(
'integer',
'integer',
'text',
'integer'),
715 array($user_id, $sco_id,
'cmi.core.lesson_status',$obj_id)
717 if(
$ilDB->numRows($statement) > 0)
719 $ilDB->update(
'scorm_tracking',
721 'rvalue' => array(
'clob',
'completed'),
722 'c_timestamp' => array(
'timestamp', $last_access)
725 'user_id' => array(
'integer', $user_id),
726 'sco_id' => array(
'integer', $sco_id),
727 'lvalue' => array(
'text',
'cmi.core.lesson_status'),
728 'obj_id' => array(
'integer', $obj_id)
734 $ilDB->insert(
'scorm_tracking', array(
735 'obj_id' => array(
'integer', $obj_id),
736 'user_id' => array(
'integer', $user_id),
737 'sco_id' => array(
'integer', $sco_id),
738 'lvalue' => array(
'text',
'cmi.core.lesson_status'),
739 'rvalue' => array(
'clob',
'completed'),
740 'c_timestamp' => array(
'timestamp', $last_access)
749 if (count($usersToDelete)>0) {
754 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
759 function importSuccessForSahsUser($user_id, $last_access, $status, $attempts=
null, $percentage_completed=
null, $sco_total_time_sec=
null){
761 $statement =
$ilDB->queryF(
'SELECT * FROM sahs_user WHERE obj_id = %s AND user_id = %s',
762 array(
'integer',
'integer'),
763 array($this->getID(),$user_id)
765 if(
$ilDB->numRows($statement) > 0)
767 $ilDB->update(
'sahs_user',
769 'last_access' => array(
'timestamp', $last_access),
770 'status' => array(
'integer', $status),
771 'package_attempts' => array(
'integer', $attempts),
772 'percentage_completed' => array(
'integer', $percentage_completed),
773 'sco_total_time_sec' => array(
'integer', $sco_total_time_sec)
776 'obj_id' => array(
'integer', $this->getID()),
777 'user_id' => array(
'integer', $user_id)
783 $ilDB->insert(
'sahs_user', array(
784 'obj_id' => array(
'integer', $this->getID()),
785 'user_id' => array(
'integer', $user_id),
786 'last_access' => array(
'timestamp', $last_access),
787 'status' => array(
'integer', $status),
788 'package_attempts' => array(
'integer', $attempts),
789 'percentage_completed' => array(
'integer', $percentage_completed),
790 'sco_total_time_sec' => array(
'integer', $sco_total_time_sec)
794 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
807 $parts = explode(
'_', $il_id);
809 if(!count((array) $parts))
813 if(!isset($parts[2]) or !isset($parts[3]))
817 if($parts[2] !=
$ilSetting->get(
'inst_id',$parts[2]))
834 $lng->loadLanguageModule(
"scormtrac");
836 $fhandle = fopen($a_file,
"r");
838 $fields = fgetcsv($fhandle, pow(2, 16),
';');
840 $a_last_access = array();
842 $a_package_attempts = array();
843 $a_module_version = array();
844 while(($csv_rows = fgetcsv($fhandle, pow(2, 16),
";")) !== FALSE)
846 $data = array_combine($fields, $csv_rows);
847 if (
$data[
'Userid']) {
850 else if (
$data[$lng->txt(
"user")])
867 if (
$data[$lng->txt(
"identifierref")])
877 if (
$data[
'Timestamp'])
879 $c_timestamp =
$data[
'Timestamp'];
883 $c_timestamp =
$data[
$lng->txt(
"c_timestamp")];
885 if ($c_timestamp ==
"")
887 $date =
new DateTime();
888 $c_timestamp = $date->getTimestamp();
890 if($a_last_access[$user_id]) {
891 if ($a_last_access[$user_id] < $c_timestamp) $a_last_access[$user_id] = $c_timestamp;
893 $a_last_access[$user_id] = $c_timestamp;
906 if(
$data[
'Key'] ==
"cmi.core.total_time" &&
$data[
'Value'] !=
"") {
907 $tarr = explode(
":",
$data[
'Value']);
908 $sec = (int) $tarr[2] + (
int) $tarr[1] * 60 +
909 (int) substr($tarr[0], strlen($tarr[0]) - 3) * 60 * 60;
910 if ($a_time[$user_id]) $a_time[$user_id] += $sec;
911 else $a_time[$user_id] = $sec;
916 $statement =
$ilDB->queryF(
'
917 SELECT * FROM scorm_tracking
922 array(
'integer',
'integer',
'text',
'integer'),
923 array($user_id, $il_sco_id,
$data[
'Key'], $this->getID())
925 if(
$ilDB->numRows($statement) > 0)
927 $ilDB->update(
'scorm_tracking',
929 'rvalue' => array(
'clob',
$data[
'Value']),
930 'c_timestamp' => array(
'timestamp', $c_timestamp)
933 'user_id' => array(
'integer', $user_id),
934 'sco_id' => array(
'integer', $il_sco_id),
935 'lvalue' => array(
'text',
$data[
'Key']),
936 'obj_id' => array(
'integer', $this->
getId())
942 $ilDB->insert(
'scorm_tracking', array(
943 'obj_id' => array(
'integer', $this->
getId()),
944 'user_id' => array(
'integer', $user_id),
945 'sco_id' => array(
'integer', $il_sco_id),
946 'lvalue' => array(
'text',
$data[
'Key']),
947 'rvalue' => array(
'clob',
$data[
'Value']),
948 'c_timestamp' => array(
'timestamp',
$data[
'Timestamp'])
955 if (
$data[
'Key'] ==
"package_attempts") $a_package_attempts[$user_id] =
$data[
'Value'];
958 if (!in_array($user_id,$users)) $users[] = $user_id;
963 include_once
'./Services/Tracking/classes/class.ilLPStatusWrapper.php';
967 include_once
'./Services/Tracking/classes/class.ilLPStatus.php';
968 foreach ($users as $user_id){
970 if ($a_package_attempts[$user_id]) $attempts = $a_package_attempts[$user_id];
973 $sco_total_time_sec =
null;
974 if ($a_time[$user_id]) $sco_total_time_sec = $a_time[$user_id];
976 if ($a_last_access[$user_id]) $last_access = $a_last_access[$user_id];
982 $this->
importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
998 foreach ($a_user_id as $user)
1001 $val_set =
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE user_id = %s AND obj_id = %s',
1002 array(
'integer',
'integer'),
1003 array($user,$this->getID()));
1005 $val_rec =
$ilDB->fetchAssoc($val_set);
1007 if ($val_rec[
"package_attempts"] !=
null && $val_rec[
"package_attempts"] != 0)
1011 if ((
int)$val_rec[
"package_attempts"] > 0) $new_rec = (int)$val_rec[
"package_attempts"]-1;
1012 $ilDB->manipulateF(
'UPDATE sahs_user SET package_attempts = %s WHERE user_id = %s AND obj_id = %s',
1013 array(
'integer',
'integer',
'integer'),
1014 array($new_rec,$user,$this->getID()));
1017 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
1028 $val_set =
$ilDB->queryF(
'SELECT * FROM usr_data WHERE(login=%s)',
1029 array(
'text'),array($a_login));
1030 $val_rec =
$ilDB->fetchAssoc($val_set);
1032 if (count($val_rec)>0) {
1033 return $val_rec[
'usr_id'];
1047 if ($a_referrer==
"0") {
1051 $val_set =
$ilDB->queryF(
'
1052 SELECT obj_id FROM sc_item,scorm_tree
1053 WHERE (obj_id = child
1054 AND identifierref = %s
1056 array(
'text',
'integer'), array($a_referrer,$this->getID()));
1057 $val_rec =
$ilDB->fetchAssoc($val_set);
1059 return $val_rec[
"obj_id"];
1069 $val_set =
$ilDB->queryF(
'SELECT usr_id FROM usr_data WHERE(email=%s)',
1070 array(
'text'),array($a_mail));
1071 $val_rec =
$ilDB->fetchAssoc($val_set);
1074 return $val_rec[
"usr_id"];
1087 header(
"Expires: 0");
1088 header(
"Cache-control: private");
1089 header(
"Cache-Control: must-revalidate, post-check=0, pre-check=0");
1090 header(
"Content-Description: File Transfer");
1091 header(
"Content-Type: application/octet-stream");
1092 header(
"Content-disposition: attachment; filename=$filename");
1093 echo $a_header.$a_content;
1108 $val_set =
$ilDB->queryF(
'
1109 SELECT scorm_object.obj_id,
1111 scorm_object.c_type,
1112 scorm_object.slm_id,
1113 scorm_object.obj_id scoid
1114 FROM scorm_object,sc_item,sc_resource
1115 WHERE(scorm_object.slm_id = %s
1116 AND scorm_object.obj_id = sc_item.obj_id
1117 AND sc_item.identifierref = sc_resource.import_id
1118 AND sc_resource.scormtype = %s)
1119 GROUP BY scorm_object.obj_id,
1121 scorm_object.c_type,
1122 scorm_object.slm_id,
1123 scorm_object.obj_id ',
1124 array(
'integer',
'text'),
1125 array($a_id,
'sco'));
1127 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1129 array_push($scos,$val_rec[
'scoid']);
1146 $scos = $a_allScoIds;
1148 $scos_c = implode(
',',$scos);
1150 $val_set =
$ilDB->queryF(
'
1151 SELECT * FROM scorm_tracking
1154 AND '.
$ilDB->in(
'sco_id', $scos,
false,
'integer').
'
1155 AND ((lvalue = %s AND '.
$ilDB->like(
'rvalue',
'clob',
'completed').
')
1156 OR (lvalue = %s AND '.
$ilDB->like(
'rvalue',
'clob',
'passed').
')))',
1157 array(
'integer',
'integer',
'text',
'text'),
1158 array($a_user,$a_id,
'cmi.core.lesson_status',
'cmi.core.lesson_status'));
1159 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1161 $key = array_search($val_rec[
'sco_id'], $scos);
1162 unset ($scos[$key]);
1165 if (count($scos) == 0) {
1166 $completion = ($a_numerical===
true) ?
true:
$lng->txt(
"cont_complete");
1168 if (count($scos) > 0) {
1169 $completion = ($a_numerical===
true) ?
false:
$lng->txt(
"cont_incomplete");
1190 $val_set =
$ilDB->queryF(
'
1191 SELECT scorm_object.obj_id,
1193 scorm_object.c_type,
1194 scorm_object.slm_id,
1195 scorm_object.obj_id scoid
1196 FROM scorm_object, sc_item,sc_resource
1197 WHERE(scorm_object.slm_id = %s
1198 AND scorm_object.obj_id = sc_item.obj_id
1199 AND sc_item.identifierref = sc_resource.import_id
1200 AND sc_resource.scormtype = %s )
1201 GROUP BY scorm_object.obj_id,
1203 scorm_object.c_type,
1204 scorm_object.slm_id,
1205 scorm_object.obj_id',
1206 array(
'integer',
'text'),
1207 array($this->
getId(),
'sco'));
1209 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1211 array_push($scos,$val_rec[
'scoid']);
1218 $scos = $a_allScoIds;
1221 $scos_c = implode(
',',$scos);
1223 $val_set =
$ilDB->queryF(
'
1224 SELECT sco_id FROM scorm_tracking
1227 AND '.
$ilDB->in(
'sco_id', $scos,
false,
'integer').
'
1228 AND ((lvalue = %s AND '.
$ilDB->like(
'rvalue',
'clob',
'completed').
') OR (lvalue = %s AND '.
$ilDB->like(
'rvalue',
'clob',
'passed').
') ) )',
1229 array(
'integer',
'integer',
'text',
'text',),
1230 array($a_user,$this->getID(),
'cmi.core.lesson_status',
'cmi.core.lesson_status'));
1231 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1233 $key = array_search($val_rec[
'sco_id'], $scos);
1234 unset ($scos[$key]);
1237 if (count($scos) == 0) {
1238 $completion = ($a_numerical===
true) ?
true: $this->lng->txt(
"cont_complete");
1240 if (count($scos) > 0) {
1241 $completion = ($a_numerical===
true) ?
false: $this->lng->txt(
"cont_incomplete");
1255 'DELETE FROM scorm_tracking WHERE user_id = %s',
1260 'DELETE FROM sahs_user WHERE user_id = %s',
1270 $retAr = array(
"raw" =>
null,
"max" =>
null,
"scaled" =>
null);
1271 $val_set =
$ilDB->queryF(
"
1272 SELECT lvalue, rvalue FROM scorm_tracking
1275 AND (lvalue = 'cmi.core.score.raw' OR lvalue = 'cmi.core.score.max')",
1276 array(
'integer',
'integer'),
1277 array($a_item_id, $a_user_id)
1279 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1281 if ($val_rec[
'lvalue'] ==
"cmi.core.score.raw") $retAr[
"raw"] = $val_rec[
"rvalue"];
1282 if ($val_rec[
'lvalue'] ==
"cmi.core.score.max") $retAr[
"max"] = $val_rec[
"rvalue"];
1284 if ($retAr[
"raw"] !=
null && $retAr[
"max"] !=
null) $retAr[
"scaled"] = ($retAr[
"raw"] / $retAr[
"max"]);
1293 $val_set =
$ilDB->queryF(
'SELECT last_visited FROM sahs_user WHERE obj_id = %s AND user_id = %s',
1294 array(
'integer',
'integer'),
1295 array($this->getID(),$user_id)
1297 while ($val_rec =
$ilDB->fetchAssoc($val_set))
1299 if ($val_rec[
"last_visited"] !=
null)
return "".$val_rec[
"last_visited"];
1307 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
1308 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
1312 foreach($a_users as $user)
1314 $ilDB->manipulateF(
'
1315 DELETE FROM scorm_tracking
1318 array(
'integer',
'integer'),
1319 array($user, $this->getID()));
1321 $ilDB->manipulateF(
'
1322 DELETE FROM sahs_user
1325 array(
'integer',
'integer'),
1326 array($user, $this->getID()));
foreach($mandatory_scripts as $file) $timestamp
An exception for terminatinating execution or to throw for unit testing.
static _recordReadEvent($a_type, $a_ref_id, $obj_id, $usr_id, $isCatchupWriteEvents=true, $a_ext_rc=false, $a_ext_time=false)
Records a read event and catches up with write events.
static _deleteReadEventsForUsers($a_obj_id, array $a_user_ids)
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
static _lookupStatus($a_obj_id, $a_user_id, $a_create=true)
Lookup status.
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
static _lookupPercentage($a_obj_id, $a_user_id)
Lookup percentage.
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
static __readStatus($a_obj_id, $user_id)
Class ilObjSCORMLearningModule.
getDataDirectory($mode="filesystem")
get data directory of lm
Class ilObjSCORMLearningModule.
static _getScoresForUser($a_item_id, $a_user_id)
getStatusForUser($a_user, $a_allScoIds, $a_numerical=false)
setLearningProgressSettingsAtUpload()
set settings for learning progress determination per default at upload
importTrackingData($a_file)
getModuleVersionForUsers()
Get module version for users.
importRaw($a_file)
Import raw data @global ilDB $ilDB @global ilObjUser $ilUser.
exportSelected($a_all, $a_users=array())
Export selected user tracking data @global ilDB $ilDB @global ilObjUser $ilUser.
getCourseCompletionForUser($a_user)
static _getTrackingItems($a_obj_id)
get all tracking items of scorm object @access static
static _removeTrackingDataForUser($user_id)
static _getStatusForUser($a_id, $a_user, $a_allScoIds, $a_numerical=false)
Get the status of a SCORM module for a given user.
getAttemptsForUser($a_user_id)
get number of atttempts for a certain user and package
getTrackingDataAgg($a_user_id)
lookupSCOId($a_referrer)
resolves manifest SCOID to internal ILIAS SCO ID
getAttemptsForUsers()
Get attempts for all users @global ilDB $ilDB.
parseUserId($il_id)
Parse il_usr_123_6 id.
static _lookupLastAccess($a_obj_id, $a_usr_id)
Return the last access timestamp for a given user.
importSuccessForSahsUser($user_id, $last_access, $status, $attempts=null, $percentage_completed=null, $sco_total_time_sec=null)
validate($directory)
Validate all XML-Files in a SCOM-Directory.
getTrackingDataPerUser($a_sco_id, $a_user_id)
Get tracking data per user @global ilDB $ilDB.
sendExportFile($a_header, $a_content)
send export file to browser
__construct($a_id=0, $a_call_by_reference=true)
Constructor @access public.
getTrackingDataAggSco($a_sco_id)
static _getCourseCompletionForUser($a_id, $a_user)
Get the completion of a SCORM module for a given user.
deleteTrackingDataOfUsers($a_users)
readObject()
read manifest file @access public
getTrackedItems()
get all tracked items of current user
static _getAllScoIds($a_id)
Get an array of id's for all Sco's in the module.
decreaseAttemptsForUser($a_user_id)
Decrease attempts for user @global ilDB $ilDB.
getUserIdEmail($a_mail)
assumes that only one account exists for a mailadress
getTrackedUsers($a_search)
getModuleVersionForUser($a_user_id)
get module version that tracking data for a user was recorded on
Validation of SCORM-XML Files.
static _enabledLearningProgress()
check wether learing progress is enabled or not
static getInstance($a_obj_id)
getRefId()
get reference id @access public
getId()
get object id @access public
getTitle()
get object title @access public
static _getInstance()
Get instance of ilPrivacySettings.
static userDataHeaderForExport()
static userDataArrayForExport($user, $b_allowExportPrivacy=false)
static now()
Return current timestamp in Y-m-d H:i:s format.
redirection script todo: (a better solution should control the processing via a xml file)