5 require_once
"classes/class.ilObject.php";
6 require_once
"./Modules/ScormAicc/classes/class.ilObjSCORMValidator.php";
7 require_once
"./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php";
45 $returnValue = $this->validator->validate();
51 if(is_object($this->validator))
53 return $this->validator->getSummary();
70 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMTree.php");
72 $root_id = $tree->readRootId();
75 $childs = $tree->getSubTree($tree->getNodeData($root_id));
77 foreach($childs as $child)
79 if($child[
"c_type"] ==
"sit")
81 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
83 if ($sc_item->getIdentifierRef() !=
"")
85 $items[count($items)] =& $sc_item;
102 include_once(
"include/inc.utf8checker.php");
103 $needs_convert =
false;
110 $check_for_manifest_file = is_file($manifest_file);
113 if (!$check_for_manifest_file)
115 $this->ilias->raiseError($this->lng->txt(
"Manifestfile $manifest_file not found!"), $this->ilias->error_obj->MESSAGE);
119 if ($check_for_manifest_file)
121 $manifest_file_array = file($manifest_file);
122 foreach($manifest_file_array as $mfa)
126 $needs_convert =
true;
132 $estimated_manifest_filesize = filesize($manifest_file) * 2;
136 $check_disc_free = 2;
143 if ($check_for_manifest_file && ($check_disc_free > 1))
147 if (!copy($manifest_file, $manifest_file.
".old"))
149 echo
"Failed to copy $manifest_file...<br>\n";
154 $f_write_handler = fopen($manifest_file.
".new",
"w");
155 $f_read_handler = fopen($manifest_file.
".old",
"r");
156 while (!feof($f_read_handler))
158 $zeile = fgets($f_read_handler);
160 fputs($f_write_handler, utf8_encode($zeile));
162 fclose($f_read_handler);
163 fclose($f_write_handler);
166 if (!copy($manifest_file.
".new", $manifest_file))
168 echo
"Failed to copy $manifest_file...<br>\n";
171 if (!@is_file($manifest_file))
173 $this->ilias->raiseError($this->lng->txt(
"cont_no_manifest"),
174 $this->ilias->error_obj->WARNING);
181 if (!($check_disc_free > 1))
182 $this->ilias->raiseError($this->lng->txt(
"Not enough space left on device!"),$this->ilias->error_obj->MESSAGE);
190 $hmani = fopen($manifest_file,
"r");
191 $start = fread($hmani, 3);
192 if (strtolower(bin2hex($start)) ==
"efbbbf")
194 $f_write_handler = fopen($manifest_file.
".new",
"w");
195 while (!feof($hmani))
197 $n = fread($hmani, 900);
198 fputs($f_write_handler, $n);
200 fclose($f_write_handler);
204 if (!copy($manifest_file.
".new", $manifest_file))
206 echo
"Failed to copy $manifest_file...<br>\n";
216 if (
$_POST[
"validate"] ==
"y")
220 $ilErr->raiseError(
"<b>Validation Error(s):</b><br>".$this->
getValidationSummary(),$ilErr->MESSAGE);
225 include_once (
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php");
228 $slmParser->startParsing();
229 return $slmParser->getPackageTitle();
238 global
$ilDB, $ilUser;
240 $sco_set = $ilDB->queryF(
'
241 SELECT DISTINCT sco_id FROM scorm_tracking WHERE obj_id = %s',
242 array(
'integer'),array($this->
getId()));
245 while($sco_rec = $ilDB->fetchAssoc($sco_set))
247 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
249 if ($sc_item->getIdentifierRef() !=
"")
251 $items[count($items)] =& $sc_item;
269 $result = $ilDB->queryF(
'
270 SELECT user_id,c_timestamp last_access FROM scorm_tracking
273 ORDER BY c_timestamp DESC',
274 array(
'integer',
'integer'), array($a_obj_id,$a_usr_id));
276 if ($ilDB->numRows($result))
278 $row = $ilDB->fetchAssoc($result);
279 return $row[
"last_access"];
286 global $ilUser,
$ilDB, $ilUser;
288 $sco_set = $ilDB->queryF(
'
289 SELECT user_id,MAX(c_timestamp) last_access FROM scorm_tracking
292 array(
'integer'), array($this->
getId()));
295 while($sco_rec = $ilDB->fetchAssoc($sco_set))
297 if ($sco_rec[
'last_access'] != 0) {
300 $sco_rec[
'last_access'] =
"";
303 if (
ilObject::_exists($sco_rec[
'user_id']) && ilObject::_lookUpType($sco_rec[
"user_id"])==
"usr" ) {
304 $user =
new ilObjUser($sco_rec[
'user_id']);
308 $sco_rec[
'username'] = $user->getLastname().
", ".$user->getFirstname();
309 if ($a_search !=
"" && (strpos(strtolower($user->getLastname()), strtolower($a_search)) !==
false || strpos(strtolower($user->getFirstname()), strtolower($a_search)) !==
false ) ) {
311 }
else if ($a_search ==
"") {
327 $val_set = $ilDB->queryF(
'
328 SELECT * FROM scorm_tracking
333 array(
'integer',
'integer',
'text',
'integer'),
334 array($a_user_id,0,
'package_attempts',$this->
getId()));
336 $val_rec = $ilDB->fetchAssoc($val_set);
338 $val_rec[
"rvalue"] = str_replace(
"\r\n",
"\n", $val_rec[
"rvalue"]);
339 if ($val_rec[
"rvalue"] == null) {
340 $val_rec[
"rvalue"]=
"";
342 return $val_rec[
"rvalue"];
352 $val_set = $ilDB->queryF(
'
353 SELECT * FROM scorm_tracking
358 array(
'integer',
'integer',
'text',
'integer'),
359 array($a_user_id,0,
'module_version',$this->
getId()));
361 $val_rec = $ilDB->fetchAssoc($val_set);
364 $val_rec[
"rvalue"] = str_replace(
"\r\n",
"\n", $val_rec[
"rvalue"]);
365 if ($val_rec[
"rvalue"] == null) {
366 $val_rec[
"rvalue"]=
"";
368 return $val_rec[
"rvalue"];
375 $data_set = $ilDB->queryF(
'
376 SELECT * FROM scorm_tracking
381 array(
'integer',
'integer',
'integer'),
382 array($a_user_id,$a_sco_id,$this->
getId()));
385 while($data_rec = $ilDB->fetchAssoc($data_set))
399 $sco_set = $ilDB->queryF(
'
400 SELECT DISTINCT sco_id FROM scorm_tracking
404 array(
'integer',
'integer',
'integer'),
405 array($this->
getId(),$a_user_id,0));
408 while($sco_rec = $ilDB->fetchAssoc($sco_set))
410 $data_set = $ilDB->queryF(
'
411 SELECT * FROM scorm_tracking
419 array(
'integer',
'integer',
'integer',
'text',
'text',
'text',
'text'),
420 array($this->
getId(),
424 "cmi.core.lesson_status",
425 "cmi.core.total_time",
426 "cmi.core.score.raw")
429 $score = $time = $status =
"";
431 while($data_rec = $ilDB->fetchAssoc($data_set))
433 switch($data_rec[
"lvalue"])
435 case "cmi.core.lesson_status":
436 $status = $data_rec[
"rvalue"];
439 case "cmi.core.total_time":
440 $time = $data_rec[
"rvalue"];
443 case "cmi.core.score.raw":
444 $score = $data_rec[
"rvalue"];
450 $data[] = array(
"sco_id"=>$sco_rec[
"sco_id"],
"title" => $sc_item->getTitle(),
451 "score" => $score,
"time" => $time,
"status" => $status);
463 $user_set = $ilDB->queryF(
'
464 SELECT DISTINCT user_id FROM scorm_tracking
467 array(
'integer',
'integer'),
468 array($this->
getId(),$a_sco_id));
471 while($user_rec = $ilDB->fetchAssoc($user_set))
474 $data_set = $ilDB->queryF(
'
475 SELECT * FROM scorm_tracking
482 array(
'integer',
'integer',
'integer',
'text',
'text',
'text'),
483 array($this->
getId(),
485 $user_rec[
"user_id"],
486 "cmi.core.lesson_status",
487 "cmi.core.total_time",
488 "cmi.core.score.raw")
491 $score = $time = $status =
"";
493 while($data_rec = $ilDB->fetchAssoc($data_set))
495 switch($data_rec[
"lvalue"])
497 case "cmi.core.lesson_status":
498 $status = $data_rec[
"rvalue"];
501 case "cmi.core.total_time":
502 $time = $data_rec[
"rvalue"];
505 case "cmi.core.score.raw":
506 $score = $data_rec[
"rvalue"];
511 $data[] = array(
"user_id" => $user_rec[
"user_id"],
512 "score" => $score,
"time" => $time,
"status" => $status);
520 global
$ilDB, $ilUser;
524 $user_array = array();
526 if(!isset(
$_POST[
'user']) && $a_exportall == 0)
528 $this->ilias->raiseError($this->lng->txt(
'no_checkbox'), $this->ilias->error_obj->MESSAGE);
531 if($a_exportall == 1)
533 $res = $ilDB->queryF(
534 'SELECT user_id FROM scorm_tracking WHERE obj_id = %s GROUP BY user_id',
536 array($this->
getId())
538 while(
$row = $ilDB->fetchAssoc(
$res))
540 $user_array[] =
$row[
'user_id'];
545 $user_array = $a_user;
549 foreach($user_array as $user)
555 $email = $e_user->getEmail();
558 $query =
'SELECT rvalue, lvalue, identifierref, c_timestamp '
559 .
'FROM scorm_tracking '
560 .
'INNER JOIN sc_item ON sc_item.obj_id = scorm_tracking.sco_id '
561 .
'WHERE scorm_tracking.sco_id <> 0 AND user_id = %s AND scorm_tracking.obj_id = %s';
562 $res = $ilDB->queryF(
564 array(
'integer',
'integer'),
565 array($user, $this->
getId())
567 while(
$row = $ilDB->fetchAssoc(
$res))
570 $sco_id =
$row[
'identifierref'];
571 $key =
$row[
'lvalue'];
572 $value =
$row[
'rvalue'];
574 $csv = $csv.
"$sco_id;$key;$value;$email;$timestamp;$user\n";
578 $query =
'SELECT rvalue, lvalue, c_timestamp FROM scorm_tracking '
579 .
'WHERE sco_id = 0 AND user_id = %s AND obj_id = %s';
580 $res = $ilDB->queryF(
582 array(
'integer',
'integer'),
583 array($user, $this->
getId())
585 while(
$row = $ilDB->fetchAssoc(
$res))
587 $key =
$row[
'lvalue'];
588 $value =
$row[
'rvalue'];
590 $csv = $csv.
"0;$key;$value;$email;$timestamp;$user\n";
594 $header =
"Scoid;Key;Value;Email;Timestamp;Userid\n";
601 global
$ilDB, $ilUser;
606 $query =
'SELECT scorm_object.obj_id, scorm_object.title, '
607 .
'scorm_object.c_type, scorm_object.slm_id, scorm_object.obj_id scoid '
608 .
'FROM scorm_object, sc_item, sc_resource '
609 .
'WHERE (scorm_object.slm_id = %s '
610 .
'AND scorm_object.obj_id = sc_item.obj_id '
611 .
'AND sc_item.identifierref = sc_resource.import_id '
612 .
'AND sc_resource.scormtype = %s) '
613 .
'GROUP BY scorm_object.obj_id, scorm_object.title, scorm_object.c_type, '
614 .
'scorm_object.slm_id, scorm_object.obj_id ';
615 $res = $ilDB->queryF(
617 array(
'integer',
'text'),
618 array($this->
getId(),
'sco')
620 while(
$row = $ilDB->fetchAssoc(
$res))
622 $scos[] =
$row[
'scoid'];
628 $user_array = array();
630 if($a_exportall == 1)
632 $query =
'SELECT user_id FROM scorm_tracking WHERE obj_id = %s GROUP BY user_id';
633 $res = $ilDB->queryF(
636 array($this->
getId())
638 while(
$row = $ilDB->fetchAssoc(
$res))
640 $user_array[] =
$row[
'user_id'];
645 $user_array = $a_user;
648 foreach($user_array as $user)
653 for($i = 0; $i < count($scos); $i++)
655 $query =
'SELECT * FROM scorm_tracking '
656 .
'WHERE (user_id = %s AND obj_id = %s AND sco_id = %s '
657 .
'AND ( (lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'completed').
') OR (lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'passed').
') ) )';
658 $res = $ilDB->queryF(
660 array(
'integer',
'integer',
'integer',
'text',
'text'),
661 array($user, $this->
getId(), $scos[$i],
'cmi.core.lesson_status',
'cmi.core.lesson_status')
667 $key = array_search($scos[$i], $scos_c);
668 unset($scos_c[$key]);
673 if(count($scos_c) == 0)
686 $login = $e_user->getLogin();
687 $firstname = $e_user->getFirstname();
688 $lastname = $e_user->getLastname();
689 $email = $e_user->getEmail();
690 $department = $e_user->getDepartment();
693 $query =
'SELECT MAX(c_timestamp) exp_date '
694 .
'FROM scorm_tracking '
695 .
'WHERE user_id = %s AND obj_id = %s';
696 $res = $ilDB->queryF(
698 array(
'integer',
'integer'),
699 array($user, $this->
getId())
706 $datetime = explode(
' ',
$data[
'exp_date']);
707 if(count($datetime) == 2)
709 $date = explode(
'-', $datetime[0]);
710 if(count($date) == 3 && checkdate($date[1], $date[2], $date[0]))
715 $date = date(
'd.m.Y', strtotime(
$data[
'exp_date']));
723 $csv = $csv.
"$department;$login;$lastname;$firstname;$email;$date;$completion\n";
726 $header =
"Department;Login;Lastname;Firstname;Email;Date;Status\n";
733 global
$ilDB, $ilUser;
740 $fhandle = fopen($a_file,
"r");
743 $fields = fgetcsv($fhandle, 4096,
';');
764 global
$ilDB, $ilUser;
769 $val_set = $ilDB->queryF(
'
770 SELECT scorm_object.obj_id,
774 scorm_object.obj_id scoid
775 FROM scorm_object,sc_item,sc_resource
776 WHERE(scorm_object.slm_id = %s
777 AND scorm_object.obj_id=sc_item.obj_id
778 AND sc_item.identifierref = sc_resource.import_id
779 AND sc_resource.scormtype = %s)
780 GROUP BY scorm_object.obj_id,
784 scorm_object.obj_id ',
785 array(
'integer',
'text'),
786 array($this->
getId(),
'sco')
789 if (count($val_set)<1)
793 while($rows_sco = $ilDB->fetchAssoc($val_set))
795 array_push($scos,$rows_sco[
'scoid']);
798 $fhandle = fopen($a_file,
"r");
800 $obj_id = $ilDB->quote($this->getID());
802 $fields = fgetcsv($fhandle, 4096,
';');
804 while(($csv_rows = fgetcsv($fhandle, 4096,
";")) !== FALSE) {
805 $data = array_combine($fields, $csv_rows);
808 if (count($csv_rows) == 6) {$statuscheck = 1;}
814 $import =
$data[
"Status"];
815 if ($import ==
"") {$import = 1;}
818 foreach ($scos as $sco)
822 $date_ex = explode(
'.',
$data[
'Date']);
823 $date = implode(
'-', array($date_ex[2], $date_ex[1], $date_ex[0]));
825 $statement = $ilDB->queryF(
'
826 SELECT * FROM scorm_tracking
831 array(
'integer',
'integer',
'text',
'integer'),
832 array($user_id, $sco_id,
'cmi.core.lesson_status',$obj_id)
834 if($ilDB->numRows($statement) > 0)
836 $ilDB->update(
'scorm_tracking',
838 'rvalue' => array(
'clob',
'completed'),
839 'c_timestamp' => array(
'timestamp', $date)
842 'user_id' => array(
'integer', $user_id),
843 'sco_id' => array(
'integer', $sco_id),
844 'lvalue' => array(
'text',
'cmi.core.lesson_status'),
845 'obj_id' => array(
'integer', $obj_id)
851 $ilDB->insert(
'scorm_tracking', array(
852 'obj_id' => array(
'integer', $obj_id),
853 'user_id' => array(
'integer', $user_id),
854 'sco_id' => array(
'integer', $sco_id),
855 'lvalue' => array(
'text',
'cmi.core.lesson_status'),
856 'rvalue' => array(
'clob',
'completed'),
857 'c_timestamp' => array(
'timestamp', $date)
861 $statement = $ilDB->queryF(
'
862 SELECT * FROM scorm_tracking
867 array(
'integer',
'integer',
'text',
'integer'),
868 array($user_id, $sco_id,
'cmi.core.entry',$obj_id)
870 if($ilDB->numRows($statement) > 0)
872 $ilDB->update(
'scorm_tracking',
874 'rvalue' => array(
'clob',
'completed'),
875 'c_timestamp' => array(
'timestamp', $date)
878 'user_id' => array(
'integer', $user_id),
879 'sco_id' => array(
'integer', $sco_id),
880 'lvalue' => array(
'text',
'cmi.core.entry'),
881 'obj_id' => array(
'integer', $obj_id)
887 $ilDB->insert(
'scorm_tracking', array(
888 'obj_id' => array(
'integer', $obj_id),
889 'user_id' => array(
'integer', $user_id),
890 'sco_id' => array(
'integer', $sco_id),
891 'lvalue' => array(
'text',
'cmi.core.entry'),
892 'rvalue' => array(
'clob',
'completed'),
893 'c_timestamp' => array(
'timestamp', $date)
903 foreach ($users as $user_id)
905 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
913 global
$ilDB, $ilUser;
915 $fhandle = fopen($a_file,
"r");
917 $fields = fgetcsv($fhandle, 4096,
';');
919 while(($csv_rows = fgetcsv($fhandle, 4096,
";")) !== FALSE)
921 $data = array_combine($fields, $csv_rows);
924 $user_id =
$data[
'Userid'];
926 if ($user_id ==
"" || $user_id == null) {
931 if ($user_id !=
"" && $il_sco_id>=0)
933 $statement = $ilDB->queryF(
'
934 SELECT * FROM scorm_tracking
939 array(
'integer',
'integer',
'text',
'integer'),
940 array($user_id, $il_sco_id,
$data[
'Key'],$this->getID())
942 if($ilDB->numRows($statement) > 0)
944 $ilDB->update(
'scorm_tracking',
946 'rvalue' => array(
'clob',
$data[
'Value']),
947 'c_timestamp' => array(
'timestamp',
$data[
'Timestamp'])
950 'user_id' => array(
'integer', $user_id),
951 'sco_id' => array(
'integer', $il_sco_id),
952 'lvalue' => array(
'text',
$data[
'Key']),
953 'obj_id' => array(
'integer', $this->
getId())
959 $ilDB->insert(
'scorm_tracking', array(
960 'obj_id' => array(
'integer', $this->
getId()),
961 'user_id' => array(
'integer', $user_id),
962 'sco_id' => array(
'integer', $il_sco_id),
963 'lvalue' => array(
'text',
$data[
'Key']),
964 'rvalue' => array(
'clob',
$data[
'Value']),
965 'c_timestamp' => array(
'timestamp',
$data[
'Timestamp'])
973 foreach ($users as $user_id)
975 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
984 global
$ilDB, $ilUser;
986 $val_set = $ilDB->queryF(
'SELECT * FROM usr_data WHERE(login=%s)',
987 array(
'text'),array($a_login));
988 $val_rec = $ilDB->fetchAssoc($val_set);
990 if (count($val_rec)>0) {
991 return $val_rec[
'usr_id'];
1002 global
$ilDB, $ilUser;
1005 if ($a_referrer==
"0") {
1009 $val_set = $ilDB->queryF(
'
1010 SELECT obj_id FROM sc_item,scorm_tree
1011 WHERE (obj_id = child
1012 AND identifierref = %s
1014 array(
'text',
'integer'), array($a_referrer,$this->getID()));
1015 $val_rec = $ilDB->fetchAssoc($val_set);
1017 return $val_rec[
"obj_id"];
1025 global
$ilDB, $ilUser;
1027 $val_set = $ilDB->queryF(
'SELECT usr_id FROM usr_data WHERE(email=%s)',
1028 array(
'text'),array($a_mail));
1029 $val_rec = $ilDB->fetchAssoc($val_set);
1032 return $val_rec[
"usr_id"];
1045 header(
"Expires: 0");
1046 header(
"Cache-control: private");
1047 header(
"Cache-Control: must-revalidate, post-check=0, pre-check=0");
1048 header(
"Content-Description: File Transfer");
1049 header(
"Content-Type: application/octet-stream");
1050 header(
"Content-disposition: attachment; filename=$filename");
1051 echo $a_header.$a_content;
1066 $val_set = $ilDB->queryF(
'
1067 SELECT scorm_object.obj_id,
1069 scorm_object.c_type,
1070 scorm_object.slm_id,
1071 scorm_object.obj_id scoid
1072 FROM scorm_object,sc_item,sc_resource
1073 WHERE(scorm_object.slm_id = %s
1074 AND scorm_object.obj_id = sc_item.obj_id
1075 AND sc_item.identifierref = sc_resource.import_id
1076 AND sc_resource.scormtype = %s)
1077 GROUP BY scorm_object.obj_id,
1079 scorm_object.c_type,
1080 scorm_object.slm_id,
1081 scorm_object.obj_id ',
1082 array(
'integer',
'text'),
1083 array($a_id,
'sco'));
1085 while ($val_rec = $ilDB->fetchAssoc($val_set))
1087 array_push($scos,$val_rec[
'scoid']);
1104 $scos = $a_allScoIds;
1106 $scos_c = implode(
',',$scos);
1108 $val_set = $ilDB->queryF(
'
1109 SELECT * FROM scorm_tracking
1112 AND '.$ilDB->in(
'sco_id', $scos,
false,
'integer').
'
1113 AND ((lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'completed').
')
1114 OR (lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'passed').
')))',
1115 array(
'integer',
'integer',
'text',
'text'),
1116 array($a_user,$a_id,
'cmi.core.lesson_status',
'cmi.core.lesson_status'));
1117 while ($val_rec = $ilDB->fetchAssoc($val_set))
1119 $key = array_search($val_rec[
'sco_id'], $scos);
1120 unset ($scos[$key]);
1123 if (count($scos) == 0) {
1124 $completion = ($a_numerical===
true) ?
true: $lng->txt(
"cont_complete");
1126 if (count($scos) > 0) {
1127 $completion = ($a_numerical===
true) ?
false: $lng->txt(
"cont_incomplete");
1148 $val_set = $ilDB->queryF(
'
1149 SELECT scorm_object.obj_id,
1151 scorm_object.c_type,
1152 scorm_object.slm_id,
1153 scorm_object.obj_id scoid
1154 FROM scorm_object, sc_item,sc_resource
1155 WHERE(scorm_object.slm_id = %s
1156 AND scorm_object.obj_id = sc_item.obj_id
1157 AND sc_item.identifierref = sc_resource.import_id
1158 AND sc_resource.scormtype = %s )
1159 GROUP BY scorm_object.obj_id,
1161 scorm_object.c_type,
1162 scorm_object.slm_id,
1163 scorm_object.obj_id',
1164 array(
'integer',
'text'),
1165 array($this->
getId(),
'sco'));
1167 while ($val_rec = $ilDB->fetchAssoc($val_set))
1169 array_push($scos,$val_rec[
'scoid']);
1176 $scos = $a_allScoIds;
1179 $scos_c = implode(
',',$scos);
1181 $val_set = $ilDB->queryF(
'
1182 SELECT sco_id FROM scorm_tracking
1185 AND '.$ilDB->in(
'sco_id', $scos,
false,
'integer').
'
1186 AND ((lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'completed').
') OR (lvalue = %s AND '.$ilDB->like(
'rvalue',
'clob',
'passed').
') ) )',
1187 array(
'integer',
'integer',
'text',
'text',),
1188 array($a_user,$this->getID(),
'cmi.core.lesson_status',
'cmi.core.lesson_status'));
1189 while ($val_rec = $ilDB->fetchAssoc($val_set))
1191 $key = array_search($val_rec[
'sco_id'], $scos);
1192 unset ($scos[$key]);
1195 if (count($scos) == 0) {
1196 $completion = ($a_numerical===
true) ?
true: $this->lng->txt(
"cont_complete");
1198 if (count($scos) > 0) {
1199 $completion = ($a_numerical===
true) ?
false: $this->lng->txt(
"cont_incomplete");
1213 'DELETE FROM scorm_tracking WHERE user_id = %s',