17 $this->insert =
array();
18 if (is_array(
$_GET[
"iL"]))
20 foreach(
$_GET[
"iL"] as $key => $value)
22 $this->insert[] =
array(
"left" => $value,
"right" =>
$_GET[
"iR"][$key]);
25 if (is_array(
$_POST[
"iL"]))
27 foreach(
$_POST[
"iL"] as $key => $value)
29 $this->insert[] =
array(
"left" => $value,
"right" =>
$_POST[
"iR"][$key]);
33 $this->update =
array();
34 if (is_array(
$_GET[
"uL"]))
36 foreach(
$_GET[
"uL"] as $key => $value)
38 $this->update[] =
array(
"left" => $value,
"right" =>
$_GET[
"uR"][$key]);
41 if (is_array(
$_POST[
"uL"]))
43 foreach(
$_POST[
"uL"] as $key => $value)
45 $this->update[] =
array(
"left" => $value,
"right" =>
$_POST[
"uR"][$key]);
50 function store($obj_id=0, $sahs_id=0, $extractData=1)
61 $f = fopen(
"./Modules/ScormAicc/log/scorm.log",
"a");
62 fwrite($f,
"\nCALLING SCORM store()\n");
63 fwrite($f,
'POST: '.print_r(
$_POST,
true));
72 if (is_object($ilUser))
74 $user_id = $ilUser->getId();
81 fwrite($f,
"Error: No obj_id given.\n");
85 foreach($this->insert as
$insert)
87 $set = $ilDB->queryF(
' 88 SELECT * FROM scorm_tracking 93 array(
'integer',
'integer',
'text',
'integer'),
94 array($user_id,$sahs_id,$insert[
"left"],$obj_id));
95 if ($rec = $ilDB->fetchAssoc($set))
97 fwrite($f,
"Error Insert, left value already exists. L:".$insert[
"left"].
",R:".
98 $insert[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
102 $ilDB->insert(
'scorm_tracking',
array(
103 'obj_id' =>
array(
'integer', $obj_id),
104 'user_id' =>
array(
'integer', $user_id),
105 'sco_id' =>
array(
'integer', $sahs_id),
106 'lvalue' =>
array(
'text', $insert[
"left"]),
107 'rvalue' =>
array(
'clob', $insert[
"right"]),
111 fwrite($f,
"Insert - L:".$insert[
"left"].
",R:".
112 $insert[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
115 foreach($this->update as $update)
117 $set = $ilDB->queryF(
' 118 SELECT * FROM scorm_tracking 123 array(
'integer',
'integer',
'text',
'integer'),
124 array($user_id,$sahs_id,$update[
"left"],$obj_id));
126 if ($rec = $ilDB->fetchAssoc($set))
128 $ilDB->update(
'scorm_tracking',
130 'rvalue' =>
array(
'clob', $update[
"right"]),
134 'user_id' =>
array(
'integer', $user_id),
135 'sco_id' =>
array(
'integer', $sahs_id),
136 'lvalue' =>
array(
'text', $update[
"left"]),
137 'obj_id' =>
array(
'integer', $obj_id)
143 fwrite($f,
"ERROR Update, left value does not exist. L:".$update[
"left"].
",R:".
144 $update[
"right"].
",sahs_id:".$sahs_id.
",user_id:".$user_id.
"\n");
152 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
167 $obj_id = (int)
$_GET[
"package_id"];
168 $in = file_get_contents(
"php://input");
171 $user_id = (int)
$data->p;
173 header(
'Content-Type: text/plain; charset=UTF-8');
175 $rval=self::storeJsApiCmi($user_id,$obj_id,
$data);
177 print(
"storeJsApiCmi failed");
179 $rval=self::syncGlobalStatus($user_id, $obj_id,
$data,
$data->now_global_status);
180 if($rval!=
true) print(
"syncGlobalStatus failed");
182 if($rval==
true) print(
"ok");
188 $b_updateStatus=
false;
191 if ($ilLog->current_log_level == 30)
195 $ilLog->write(
"ScormAicc: CALLING SCORM storeJsApi() ".
$_POST);
204 for ($i=0;$i<count(
$data->cmi);$i++) {
205 $aa_data[] =
array(
"sco_id" => (
int)
$data->cmi[$i][0],
"left" =>
$data->cmi[$i][1],
"right" =>
$data->cmi[$i][2]);
210 $ilLog->write(
"ScormAicc: storeJsApi: Error: No valid obj_id given.");
213 foreach($aa_data as $a_data) {
214 $set = $ilDB->queryF(
' 215 SELECT rvalue FROM scorm_tracking 220 array(
'integer',
'integer',
'text',
'integer'),
221 array($user_id,$a_data[
"sco_id"],$a_data[
"left"],$obj_id));
222 if ($rec = $ilDB->fetchAssoc($set)) {
223 if ($a_data[
"left"] ==
'cmi.core.lesson_status' && $a_data[
"right"] != $rec[
"rvalue"]) {
224 $b_updateStatus =
true;
226 $ilDB->update(
'scorm_tracking',
228 'rvalue' =>
array(
'clob', $a_data[
"right"]),
232 'user_id' =>
array(
'integer', $user_id),
233 'sco_id' =>
array(
'integer', $a_data[
"sco_id"]),
234 'lvalue' =>
array(
'text', $a_data[
"left"]),
235 'obj_id' =>
array(
'integer', $obj_id)
239 $ilLog->write(
"ScormAicc: storeJsApi Updated - L:".$a_data[
"left"].
",R:".
240 $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$a_data[
"sco_id"].
",user_id:".$user_id);
244 if ($a_data[
"left"] ==
'cmi.core.lesson_status') {
245 $b_updateStatus =
true;
247 $ilDB->insert(
'scorm_tracking',
array(
248 'obj_id' =>
array(
'integer', $obj_id),
249 'user_id' =>
array(
'integer', $user_id),
250 'sco_id' =>
array(
'integer', $a_data[
"sco_id"]),
251 'lvalue' =>
array(
'text', $a_data[
"left"]),
252 'rvalue' =>
array(
'clob', $a_data[
"right"]),
256 $ilLog->write(
"ScormAicc: storeJsApi Inserted - L:".$a_data[
"left"].
",R:".
257 $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$a_data[
"sco_id"].
",user_id:".$user_id);
276 $saved_global_status=
$data->saved_global_status;
277 $ilLog->write(
"saved_global_status=".$saved_global_status);
282 if (!
$data->packageAttempts) {
283 $val_set = $ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
285 $val_rec = $ilDB->fetchAssoc($val_set);
286 $attempts = $val_rec[
"package_attempts"];
288 $attempts=
$data->packageAttempts;
290 if ($attempts == null) $attempts = 1;
293 $totalTime=(int)
$data->totalTimeCentisec;
294 $totalTime=round($totalTime/100);
295 $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',
296 array(
'integer',
'integer',
'integer',
'integer',
'integer',
'integer'),
297 array($totalTime, $new_global_status,
$data->percentageCompleted, $attempts,
$packageId, $userId));
300 global $ilObjDataCache;
301 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
307 if ($new_global_status != null) {
308 include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
309 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
327 $val_set = $ilDB->queryF(
'SELECT package_attempts, total_time_sec, sco_total_time_sec, time_from_lms FROM sahs_user, sahs_lm ' 328 .
'WHERE sahs_user.obj_id = %s AND sahs_user.user_id = %s AND sahs_user.obj_id = sahs_lm.id',
329 array(
'integer',
'integer'),
330 array($a_obj_id,$a_user_id));
332 $val_rec = $ilDB->fetchAssoc($val_set);
334 if ($val_rec[
"package_attempts"] == null) {
335 $val_rec[
"package_attempts"]=
"";
337 $attempts = $val_rec[
"package_attempts"];
343 $time = (int)$val_rec[
"sco_total_time_sec"];
348 $sco_set = $ilDB->queryF(
' 349 SELECT sco_id, rvalue FROM scorm_tracking 354 array(
'integer',
'integer',
'text',
'integer'),
355 array($a_obj_id,$a_user_id,
'cmi.core.total_time',0));
357 while($sco_rec = $ilDB->fetchAssoc($sco_set))
359 $tarr = explode(
":", $sco_rec[
"rvalue"]);
360 $sec = (int) $tarr[2] + (
int) $tarr[1] * 60 +
361 (int) substr($tarr[0], strlen($tarr[0]) - 3) * 60 * 60;
366 include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
374 $ilDB->insert(
'scorm_tracking',
array(
375 'obj_id' =>
array(
'integer', $a_obj_id),
376 'user_id' =>
array(
'integer', $ilUser->getId()),
377 'sco_id' =>
array(
'integer', $a_sahs_id),
378 'lvalue' =>
array(
'text', $a_lval),
379 'rvalue' =>
array(
'clob', $a_rval),
383 if ($a_lval ==
"cmi.core.lesson_status")
385 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
397 public static function _getInProgress($scorm_item_id,$a_obj_id,$a_blocked_user_ids = null)
401 if(is_array($scorm_item_id))
403 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
405 $res = $ilDB->queryF(
'SELECT user_id,sco_id FROM scorm_tracking 408 GROUP BY user_id, sco_id',
414 $res = $ilDB->queryF(
'SELECT user_id,sco_id FROM scorm_tracking 417 array(
'integer',
'integer'),
array($scorm_item_id,$a_obj_id)
421 $in_progress =
array();
423 while(
$row = $ilDB->fetchObject(
$res))
426 if(!($a_blocked_user_ids &&
427 is_array($a_blocked_user_ids[
$row->sco_id]) &&
428 in_array(
$row->user_id, $a_blocked_user_ids[
$row->sco_id])))
430 $in_progress[
$row->sco_id][] =
$row->user_id;
446 if(is_array($scorm_item_id))
448 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
450 $res = $ilDB->queryF(
'SELECT DISTINCT(user_id) FROM scorm_tracking 454 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
')',
455 array(
'integer',
'text'),
456 array($a_obj_id,
'cmi.core.lesson_status'));
460 $res = $ilDB->queryF(
'SELECT DISTINCT(user_id) FROM scorm_tracking 464 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
')',
465 array(
'integer',
'integer',
'text'),
466 array($scorm_item_id,$a_obj_id,
'cmi.core.lesson_status'));
469 while(
$row = $ilDB->fetchObject(
$res))
471 $user_ids[] =
$row->user_id;
473 return $user_ids ? $user_ids :
array();
481 $status =
"not_attempted";
483 if (is_array($a_scos))
485 $in = $ilDB->in(
'sco_id', $a_scos,
false,
'integer');
487 $res = $ilDB->queryF(
'SELECT sco_id, rvalue FROM scorm_tracking 492 array(
'integer',
'text',
'integer'),
493 array($a_obj_id,
'cmi.core.lesson_status', $a_user_id));
498 while ($rec = $ilDB->fetchAssoc(
$res))
500 if ($rec[
"rvalue"] ==
"failed")
504 if ($rec[
"rvalue"] !=
"completed" && $rec[
"rvalue"] !=
"passed")
512 $status =
"in_progress";
514 if ($completed && $cnt == count($a_scos))
516 $status =
"completed";
532 if (is_array($a_scos))
534 $in = $ilDB->in(
'sco_id', $a_scos,
false,
'integer');
536 $res = $ilDB->queryF(
'SELECT sco_id, rvalue FROM scorm_tracking 541 array(
'integer',
'text',
'integer'),
542 array($a_obj_id,
'cmi.core.lesson_status', $a_user_id));
545 while ($rec = $ilDB->fetchAssoc(
$res))
547 if ($rec[
"rvalue"] ==
"completed" || $rec[
"rvalue"] ==
"passed")
566 $query =
'SELECT user_id, MAX(c_timestamp) tst '.
567 'FROM scorm_tracking '.
568 'WHERE obj_id = '.$ilDB->quote($a_obj_id,
'integer').
' '.
590 $res = $ilDB->queryF(
'SELECT DISTINCT user_id FROM scorm_tracking 593 array(
'integer',
'text'),
594 array($a_obj_id,
'cmi.core.lesson_status'));
597 while (
$row = $ilDB->fetchAssoc(
$res))
599 $users[] =
$row[
"user_id"];
614 if(is_array($scorm_item_id))
616 $in = $ilDB->in(
'sco_id', $scorm_item_id,
false,
'integer');
618 $res = $ilDB->queryF(
' 619 SELECT DISTINCT(user_id) FROM scorm_tracking 623 AND '.$ilDB->like(
'rvalue',
'clob',
'failed').
' ',
624 array(
'integer',
'text'),
625 array($a_obj_id,
'cmi.core.lesson_status'));
630 $res = $ilDB->queryF(
' 631 SELECT DISTINCT(user_id) FROM scorm_tracking 635 AND '.$ilDB->like(
'rvalue',
'clob',
'failed').
' ',
636 array(
'integer',
'integer',
'text'),
637 array($scorm_item_id,$a_obj_id,
'cmi.core.lesson_status'));
640 while(
$row = $ilDB->fetchObject(
$res))
642 $user_ids[] =
$row->user_id;
644 return $user_ids ? $user_ids :
array();
657 $in = $ilDB->in(
'sco_id', $a_scorm_item_ids,
false,
'integer');
661 $res = $ilDB->queryF(
' 662 SELECT user_id, COUNT(user_id) completed FROM scorm_tracking 666 AND ('.$ilDB->like(
'rvalue',
'clob',
'completed').
' OR '.$ilDB->like(
'rvalue',
'clob',
'passed').
') 668 array(
'integer',
'text'),
669 array($a_obj_id,
'cmi.core.lesson_status')
671 while(
$row = $ilDB->fetchObject(
$res))
673 $users[
$row->user_id] =
$row->completed;
675 return $users ? $users :
array();
688 $in = $ilDB->in(
'sco_id', $sco_item_ids,
false,
'integer');
690 $res = $ilDB->queryF(
' 691 SELECT * FROM scorm_tracking 695 array(
'integer',
'text'),
696 array($a_obj_id,
'cmi.core.lesson_status'));
702 while(
$row = $ilDB->fetchObject(
$res))
709 $user_ids[
$row->sco_id][] =
$row->user_id;
714 $user_ids[
$row->sco_id][] =
$row->user_id;
728 $user_id = (int)
$_GET[
"p"];
731 $obj_id = (int)
$_GET[
"package_id"];
733 $GLOBALS[
'ilLog']->write(__METHOD__.
' no valid obj_id');
735 $last_visited=
$_POST[
'last_visited'];
737 $ilDB->manipulateF(
'UPDATE sahs_user 738 SET last_visited = %s, hash_end =%s, last_access = %s 739 WHERE obj_id = %s AND user_id = %s',
740 array(
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
741 array($last_visited, $endDate,
date(
'Y-m-d H:i:s'), $obj_id, $user_id)
747 header(
'Content-Type: text/plain; charset=UTF-8');
753 $res = $ilDB->queryF(
'select hash from sahs_user where obj_id=%s AND user_id=%s AND hash_end>%s',
754 array(
'integer',
'integer',
'timestamp'),
757 $rowtmp=$ilDB->fetchAssoc(
$res);
758 if ($rowtmp[
'hash']==$hash)
return;
759 else die(
"not allowed");
static storeJsApiCmi($user_id, $obj_id, $data)
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.
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
Class ilObjSCORMTracking.
static storeJsApi($obj_id=0)
static _getTrackedUsers($a_obj_id)
Get all tracked users.
static now()
Return current timestamp in Y-m-d H:i:s format.
static _countCompleted($a_scos, $a_obj_id, $a_user_id)
static _getCountCompletedPerUser($a_scorm_item_ids, $a_obj_id)
Get users who have status completed or passed.
static _lookupObjId($a_id)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
static _getFailed($scorm_item_id, $a_obj_id)
like necessary because of Oracle
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.
Add a drawing to the header
static _syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id)
Synch read event table.
Create styles array
The data for the language used.
static _insertTrackData($a_sahs_id, $a_lval, $a_rval, $a_obj_id)
if(php_sapi_name() !='cli') $in
static lookupLastAccessTimes($a_obj_id)
Lookup last acccess time for all users of a scorm module ilDB $ilDB.
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
static _getInProgress($scorm_item_id, $a_obj_id, $a_blocked_user_ids=null)
static _getCollectionStatus($a_scos, $a_obj_id, $a_user_id)
static _getProgressInfo($sco_item_ids, $a_obj_id)
Get info about.
static scorm12PlayerUnload()
static syncGlobalStatus($userId, $packageId, $data, $new_global_status)
static checkIfAllowed($packageId, $userId, $hash)
store($obj_id=0, $sahs_id=0, $extractData=1)