26 $this->insert = array();
27 if (is_array(
$_GET[
"iL"]))
29 foreach(
$_GET[
"iL"] as $key => $value)
31 $this->insert[] = array(
"left" => $value,
"right" =>
$_GET[
"iR"][$key]);
34 if (is_array(
$_POST[
"iL"]))
36 foreach(
$_POST[
"iL"] as $key => $value)
38 $this->insert[] = array(
"left" => $value,
"right" =>
$_POST[
"iR"][$key]);
42 $this->update = array();
43 if (is_array(
$_GET[
"uL"]))
45 foreach(
$_GET[
"uL"] as $key => $value)
47 $this->update[] = array(
"left" => $value,
"right" =>
$_GET[
"uR"][$key]);
50 if (is_array(
$_POST[
"uL"]))
52 foreach(
$_POST[
"uL"] as $key => $value)
54 $this->update[] = array(
"left" => $value,
"right" =>
$_POST[
"uR"][$key]);
59 function store($obj_id=0, $sahs_id=0, $extractData=1)
70 $f = fopen(
"./Modules/ScormAicc/log/scorm.log",
"a");
71 fwrite($f,
"\nCALLING SCORM store()\n");
72 fwrite($f,
'POST: '.print_r(
$_POST,
true));
81 if (is_object($ilUser))
83 $user_id = $ilUser->getId();
90 fwrite($f,
"Error: No obj_id given.\n");
94 foreach($this->insert as $insert)
96 $set = $ilDB->queryF(
' 97 SELECT * FROM scorm_tracking 102 array(
'integer',
'integer',
'text',
'integer'),
103 array($user_id,$sahs_id,$insert[
"left"],$obj_id));
104 if ($rec = $ilDB->fetchAssoc($set))
106 fwrite($f,
"Error Insert, left value already exists. L:".$insert[
"left"].
",R:".
107 $insert[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
111 $ilDB->insert(
'scorm_tracking', array(
112 'obj_id' => array(
'integer', $obj_id),
113 'user_id' => array(
'integer', $user_id),
114 'sco_id' => array(
'integer', $sahs_id),
115 'lvalue' => array(
'text', $insert[
"left"]),
116 'rvalue' => array(
'clob', $insert[
"right"]),
120 fwrite($f,
"Insert - L:".$insert[
"left"].
",R:".
121 $insert[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
124 foreach($this->update as $update)
126 $set = $ilDB->queryF(
' 127 SELECT * FROM scorm_tracking 132 array(
'integer',
'integer',
'text',
'integer'),
133 array($user_id,$sahs_id,$update[
"left"],$obj_id));
135 if ($rec = $ilDB->fetchAssoc($set))
137 $ilDB->update(
'scorm_tracking',
139 'rvalue' => array(
'clob', $update[
"right"]),
143 'user_id' => array(
'integer', $user_id),
144 'sco_id' => array(
'integer', $sahs_id),
145 'lvalue' => array(
'text', $update[
"left"]),
146 'obj_id' => array(
'integer', $obj_id)
152 fwrite($f,
"ERROR Update, left value does not exist. L:".$update[
"left"].
",R:".
153 $update[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
161 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
176 $obj_id = (int)
$_GET[
"package_id"];
177 $in = file_get_contents(
"php://input");
180 $user_id = (int)
$data->p;
182 header(
'Content-Type: text/plain; charset=UTF-8');
184 $rval=self::storeJsApiCmi($user_id,$obj_id,
$data);
186 print(
"storeJsApiCmi failed");
188 $rval=self::syncGlobalStatus($user_id, $obj_id,
$data,
$data->now_global_status);
189 if($rval!=
true) print(
"syncGlobalStatus failed");
191 if($rval==
true) print(
"ok");
197 $b_updateStatus=
false;
200 if ($ilLog->current_log_level == 30)
204 $ilLog->write(
"ScormAicc: CALLING SCORM storeJsApi() ".
$_POST);
213 for ($i=0;$i<count(
$data->cmi);$i++) {
214 $aa_data[] = array(
"sco_id" => (
int)
$data->cmi[$i][0],
"left" =>
$data->cmi[$i][1],
"right" =>
$data->cmi[$i][2]);
219 $ilLog->write(
"ScormAicc: storeJsApi: Error: No valid obj_id given.");
222 foreach($aa_data as $a_data) {
223 $set = $ilDB->queryF(
' 224 SELECT rvalue FROM scorm_tracking 229 array(
'integer',
'integer',
'text',
'integer'),
230 array($user_id,$a_data[
"sco_id"],$a_data[
"left"],$obj_id));
231 if ($rec = $ilDB->fetchAssoc($set)) {
232 if ($a_data[
"left"] ==
'cmi.core.lesson_status' && $a_data[
"right"] != $rec[
"rvalue"]) {
233 $b_updateStatus =
true;
235 $ilDB->update(
'scorm_tracking',
237 'rvalue' => array(
'clob', $a_data[
"right"]),
241 'user_id' => array(
'integer', $user_id),
242 'sco_id' => array(
'integer', $a_data[
"sco_id"]),
243 'lvalue' => array(
'text', $a_data[
"left"]),
244 'obj_id' => array(
'integer', $obj_id)
248 $ilLog->write(
"ScormAicc: storeJsApi Updated - L:".$a_data[
"left"].
",R:".
249 $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$a_data[
"sco_id"].
",user_id:".$user_id);
253 if ($a_data[
"left"] ==
'cmi.core.lesson_status') {
254 $b_updateStatus =
true;
256 $ilDB->insert(
'scorm_tracking', array(
257 'obj_id' => array(
'integer', $obj_id),
258 'user_id' => array(
'integer', $user_id),
259 'sco_id' => array(
'integer', $a_data[
"sco_id"]),
260 'lvalue' => array(
'text', $a_data[
"left"]),
261 'rvalue' => array(
'clob', $a_data[
"right"]),
265 $ilLog->write(
"ScormAicc: storeJsApi Inserted - L:".$a_data[
"left"].
",R:".
266 $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$$a_data[
"sco_id"].
",user_id:".$user_id);
285 $saved_global_status=
$data->saved_global_status;
286 $ilLog->write(
"saved_global_status=".$saved_global_status);
291 if (!
$data->packageAttempts) {
292 $val_set = $ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
293 array(
'integer',
'integer'), array(
$packageId,$userId));
294 $val_rec = $ilDB->fetchAssoc($val_set);
295 $attempts = $val_rec[
"package_attempts"];
297 $attempts=
$data->packageAttempts;
299 if ($attempts == null) $attempts = 1;
302 $totalTime=(int)
$data->totalTimeCentisec;
303 $totalTime=round($totalTime/100);
304 $ilDB->queryF(
'UPDATE sahs_user SET sco_total_time_sec=%s, status=%s, percentage_completed=%s, package_attempts=%s WHERE obj_id = %s AND user_id = %s',
305 array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer'),
306 array($totalTime, $new_global_status,
$data->percentageCompleted, $attempts,
$packageId, $userId));
309 global $ilObjDataCache;
310 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
316 if ($new_global_status != null) {
317 include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
318 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
338 $val_set = $ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
339 array(
'integer',
'integer'),
340 array($a_obj_id,$a_user_id));
342 $val_rec = $ilDB->fetchAssoc($val_set);
344 if ($val_rec[
"package_attempts"] == null) {
345 $val_rec[
"package_attempts"]=
"";
347 $attempts = $val_rec[
"package_attempts"];
350 $sco_set = $ilDB->queryF(
' 351 SELECT sco_id, rvalue FROM scorm_tracking 356 array(
'integer',
'integer',
'text',
'integer'),
357 array($a_obj_id,$a_user_id,
'cmi.core.total_time',0));
360 while($sco_rec = $ilDB->fetchAssoc($sco_set))
362 $tarr = explode(
":", $sco_rec[
"rvalue"]);
363 $sec = (int) $tarr[2] + (
int) $tarr[1] * 60 +
364 (int) substr($tarr[0], strlen($tarr[0]) - 3) * 60 * 60;
368 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
376 $ilDB->insert(
'scorm_tracking', array(
377 'obj_id' => array(
'integer', $a_obj_id),
378 'user_id' => array(
'integer', $ilUser->getId()),
379 'sco_id' => array(
'integer', $a_sahs_id),
380 'lvalue' => array(
'text', $a_lval),
381 'rvalue' => array(
'clob', $a_rval),
385 if ($a_lval ==
"cmi.core.lesson_status")
387 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
399 public static function _getInProgress($scorm_item_id,$a_obj_id,$a_blocked_user_ids = null)
403 if(is_array($scorm_item_id))
405 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
407 $res = $ilDB->queryF(
'SELECT user_id,sco_id FROM scorm_tracking 410 GROUP BY user_id, sco_id',
411 array(
'integer'),array($a_obj_id));
416 $res = $ilDB->queryF(
'SELECT user_id,sco_id FROM scorm_tracking 419 array(
'integer',
'integer'),array($scorm_item_id,$a_obj_id)
423 $in_progress = array();
425 while(
$row = $ilDB->fetchObject(
$res))
428 if(!($a_blocked_user_ids &&
429 is_array($a_blocked_user_ids[
$row->sco_id]) &&
430 in_array(
$row->user_id, $a_blocked_user_ids[
$row->sco_id])))
432 $in_progress[
$row->sco_id][] =
$row->user_id;
448 if(is_array($scorm_item_id))
450 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
452 $res = $ilDB->queryF(
'SELECT DISTINCT(user_id) FROM scorm_tracking 456 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
')',
457 array(
'integer',
'text'),
458 array($a_obj_id,
'cmi.core.lesson_status'));
462 $res = $ilDB->queryF(
'SELECT DISTINCT(user_id) FROM scorm_tracking 466 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
')',
467 array(
'integer',
'integer',
'text'),
468 array($scorm_item_id,$a_obj_id,
'cmi.core.lesson_status'));
471 while(
$row = $ilDB->fetchObject(
$res))
473 $user_ids[] =
$row->user_id;
475 return $user_ids ? $user_ids : array();
483 $status =
"not_attempted";
485 if (is_array($a_scos))
487 $in = $ilDB->in(
'sco_id', $a_scos,
false,
'integer');
489 $res = $ilDB->queryF(
'SELECT sco_id, rvalue FROM scorm_tracking 494 array(
'integer',
'text',
'integer'),
495 array($a_obj_id,
'cmi.core.lesson_status', $a_user_id));
500 while ($rec = $ilDB->fetchAssoc(
$res))
502 if ($rec[
"rvalue"] ==
"failed")
506 if ($rec[
"rvalue"] !=
"completed" && $rec[
"rvalue"] !=
"passed")
514 $status =
"in_progress";
516 if ($completed && $cnt == count($a_scos))
518 $status =
"completed";
534 if (is_array($a_scos))
536 $in = $ilDB->in(
'sco_id', $a_scos,
false,
'integer');
538 $res = $ilDB->queryF(
'SELECT sco_id, rvalue FROM scorm_tracking 543 array(
'integer',
'text',
'integer'),
544 array($a_obj_id,
'cmi.core.lesson_status', $a_user_id));
547 while ($rec = $ilDB->fetchAssoc(
$res))
549 if ($rec[
"rvalue"] ==
"completed" || $rec[
"rvalue"] ==
"passed")
568 $query =
'SELECT user_id, MAX(c_timestamp) tst '.
569 'FROM scorm_tracking '.
570 'WHERE obj_id = '.$ilDB->quote($a_obj_id,
'integer').
' '.
592 $res = $ilDB->queryF(
'SELECT DISTINCT user_id FROM scorm_tracking 595 array(
'integer',
'text'),
596 array($a_obj_id,
'cmi.core.lesson_status'));
599 while (
$row = $ilDB->fetchAssoc(
$res))
601 $users[] =
$row[
"user_id"];
616 if(is_array($scorm_item_id))
618 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
620 $res = $ilDB->queryF(
' 621 SELECT DISTINCT(user_id) FROM scorm_tracking 625 AND '.$ilDB->like(
'rvalue',
'clob',
'failed').
' ',
626 array(
'integer',
'text'),
627 array($a_obj_id,
'cmi.core.lesson_status'));
632 $res = $ilDB->queryF(
' 633 SELECT DISTINCT(user_id) FROM scorm_tracking 637 AND '.$ilDB->like(
'rvalue',
'clob',
'failed').
' ',
638 array(
'integer',
'integer',
'text'),
639 array($scorm_item_id,$a_obj_id,
'cmi.core.lesson_status'));
642 while(
$row = $ilDB->fetchObject(
$res))
644 $user_ids[] =
$row->user_id;
646 return $user_ids ? $user_ids : array();
659 $in = $ilDB->in(
'sco_id', $a_scorm_item_ids,
false,
'integer');
663 $res = $ilDB->queryF(
' 664 SELECT user_id, COUNT(user_id) completed FROM scorm_tracking 668 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
') 670 array(
'integer',
'text'),
671 array($a_obj_id,
'cmi.core.lesson_status')
673 while(
$row = $ilDB->fetchObject(
$res))
675 $users[
$row->user_id] =
$row->completed;
677 return $users ? $users : array();
690 $in = $ilDB->in(
'sco_id', $sco_item_ids,
false,
'integer');
692 $res = $ilDB->queryF(
' 693 SELECT * FROM scorm_tracking 697 array(
'integer',
'text'),
698 array($a_obj_id,
'cmi.core.lesson_status'));
700 $info[
'completed'] = array();
701 $info[
'failed'] = array();
704 while(
$row = $ilDB->fetchObject(
$res))
711 $user_ids[
$row->sco_id][] =
$row->user_id;
716 $user_ids[
$row->sco_id][] =
$row->user_id;
730 $user_id = (int)
$_GET[
"p"];
733 $obj_id = (int)
$_GET[
"package_id"];
735 $GLOBALS[
'ilLog']->write(__METHOD__.
' no valid obj_id');
737 $last_visited=
$_POST[
'last_visited'];
738 $endDate = date(
'Y-m-d H:i:s', mktime(date(
'H'), date(
'i')+5, date(
's'), date(
'm'), date(
'd'), date(
'Y')));
739 $ilDB->manipulateF(
'UPDATE sahs_user 740 SET last_visited = %s, hash_end =%s, last_access = %s 741 WHERE obj_id = %s AND user_id = %s',
742 array(
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
743 array($last_visited, $endDate, date(
'Y-m-d H:i:s'), $obj_id, $user_id)
749 header(
'Content-Type: text/plain; charset=UTF-8');
755 $res = $ilDB->queryF(
'select hash from sahs_user where obj_id=%s AND user_id=%s AND hash_end>%s',
756 array(
'integer',
'integer',
'timestamp'),
759 $rowtmp=$ilDB->fetchAssoc(
$res);
760 if ($rowtmp[
'hash']==$hash)
return;
761 else die(
"not allowed");
syncGlobalStatus($userId, $packageId, $data, $new_global_status)
static _getCompleted($scorm_item_id, $a_obj_id)
like necessary because of Oracle
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
Class ilObjSCORMTracking.
static now()
Return current timestamp in Y-m-d H:i:s format.
const DB_FETCHMODE_OBJECT
storeJsApiCmi($user_id, $obj_id, $data)
static _countCompleted($a_scos, $a_obj_id, $a_user_id)
_getFailed($scorm_item_id, $a_obj_id)
like necessary because of Oracle
_insertTrackData($a_sahs_id, $a_lval, $a_rval, $a_obj_id)
static _getCountCompletedPerUser($a_scorm_item_ids, $a_obj_id)
Get users who have status completed or passed.
static _lookupObjId($a_id)
checkIfAllowed($packageId, $userId, $hash)
static lookupLastAccessTimes($a_obj_id)
Lookup last acccess time for all users of a scorm module ilDB $ilDB.
_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 writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
ilObjSCORMTracking()
Constructor public.
static _getInProgress($scorm_item_id, $a_obj_id, $a_blocked_user_ids=null)
_syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id)
Synch read event table.
static _getCollectionStatus($a_scos, $a_obj_id, $a_user_id)
static _getProgressInfo($sco_item_ids, $a_obj_id)
Get info about.
_getTrackedUsers($a_obj_id)
Get all tracked users.
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
store($obj_id=0, $sahs_id=0, $extractData=1)