20 $data = json_decode(is_string(
$data) ?
$data : file_get_contents(
'php://input'));
24 if ($userId ==
null) {
25 $userId=(int)
$data->p;
29 if (
$data->last !=
"") {
30 $last_visited =
$data->last;
33 $total_time_sec =
null;
34 if (
$data->total_time_sec !=
"") {
35 $total_time_sec =
$data->total_time_sec;
38 SET total_time_sec = %s, last_visited = %s, hash_end =%s, last_access = %s
39 WHERE obj_id = %s AND user_id = %s',
40 array(
'integer',
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
41 array($total_time_sec,$last_visited, $endDate,
date(
'Y-m-d H:i:s'),
$packageId, $userId)
43 if ($time_from_lms==
true) {
44 self::ensureObjectDataCacheExistence();
47 $ilObjDataCache =
$DIC[
"ilObjDataCache"];
49 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Tracking.php");
56 SET last_visited = %s, hash_end =%s, last_access = %s
57 WHERE obj_id = %s AND user_id = %s',
58 array(
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
59 array($last_visited, $endDate,
date(
'Y-m-d H:i:s'),
$packageId, $userId)
63 header(
'Content-Type: text/plain; charset=UTF-8');
68 public static function persistCMIData($userId=
null,
$packageId, $defaultLessonMode, $comments, $interactions, $objectives, $time_from_lms,
$data =
null)
74 if ($defaultLessonMode ==
"browse") {
78 $jsMode = strpos(
$_SERVER[
'HTTP_ACCEPT'],
'text/javascript')!==
false;
80 $data = json_decode(is_string(
$data) ?
$data : file_get_contents(
'php://input'));
81 $ilLog->write(
"dataTo_setCMIData: " . file_get_contents(
'php://input'));
85 if ($userId ==
null) {
86 $userId=(int)
$data->p;
102 $new_global_status =
$data->now_global_status;
103 $return[
"new_global_status"] = $new_global_status;
107 $ilLog->write(
"SCORM: return of persistCMIData: " . json_encode($return));
109 header(
'Content-Type: text/javascript; charset=UTF-8');
110 print(json_encode($return));
112 header(
'Content-Type: text/html; charset=UTF-8');
113 print(var_export($return,
true));
123 'select hash from sahs_user where obj_id=%s AND user_id=%s AND hash_end>%s',
124 array(
'integer',
'integer',
'timestamp'),
128 if ($rowtmp[
'hash']==$hash) {
148 $i_check=
$data->i_check;
150 $b_node_update=
false;
152 $a_map_cmi_interaction_id=array();
154 $tables = array(
'node',
'comment',
'interaction',
'objective',
'correct_response');
156 foreach ($tables as
$table) {
157 if (!is_array(
$data->$table)) {
161 $ilLog->write(
"SCORM: setCMIData, table -" .
$table .
"-");
171 'SELECT cmi_node_id FROM cmi_node WHERE cp_node_id = %s and user_id = %s',
172 array(
'integer',
'integer'),
173 array(
$row[19],$userId)
176 $cmi_node_id=$rowtmp[
'cmi_node_id'];
177 if ($cmi_node_id!=
null) {
180 $cmi_node_id =
$ilDB->nextId(
'cmi_node');
181 $b_node_update=
false;
183 $ilLog->write(
"setCMIdata with cmi_node_id = " . $cmi_node_id);
185 'accesscount' => array(
'integer',
$row[0]),
186 'accessduration' => array(
'text',
$row[1]),
187 'accessed' => array(
'text',
$row[2]),
188 'activityabsduration' => array(
'text',
$row[3]),
189 'activityattemptcount' => array(
'integer',
$row[4]),
190 'activityexpduration' => array(
'text',
$row[5]),
191 'activityprogstatus' => array(
'integer',
$row[6]),
192 'attemptabsduration' => array(
'text',
$row[7]),
193 'attemptcomplamount' => array(
'float',
$row[8]),
194 'attemptcomplstatus' => array(
'integer',
$row[9]),
195 'attemptexpduration' => array(
'text',
$row[10]),
196 'attemptprogstatus' => array(
'integer',
$row[11]),
197 'audio_captioning' => array(
'integer',
$row[12]),
198 'audio_level' => array(
'float',
$row[13]),
199 'availablechildren' => array(
'text',
$row[14]),
200 'cmi_node_id' => array(
'integer', $cmi_node_id),
201 'completion' => array(
'float',
$row[16]),
202 'completion_status' => array(
'text',
$row[17]),
203 'completion_threshold' => array(
'text',
$row[18]),
204 'cp_node_id' => array(
'integer',
$row[19]),
205 'created' => array(
'text',
$row[20]),
206 'credit' => array(
'text',
$row[21]),
207 'delivery_speed' => array(
'float',
$row[22]),
208 'c_entry' => array(
'text',
$row[23]),
209 'c_exit' => array(
'text',
$row[24]),
210 'c_language' => array(
'text',
$row[25]),
211 'launch_data' => array(
'clob',
$row[26]),
212 'learner_name' => array(
'text',
$row[27]),
213 'location' => array(
'text',
$row[28]),
214 'c_max' => array(
'float',
$row[29]),
215 'c_min' => array(
'float',
$row[30]),
216 'c_mode' => array(
'text',
$row[31]),
217 'modified' => array(
'text',
$row[32]),
218 'progress_measure' => array(
'float',
$row[33]),
219 'c_raw' => array(
'float',
$row[34]),
220 'scaled' => array(
'float',
$row[35]),
221 'scaled_passing_score' => array(
'float',
$row[36]),
222 'session_time' => array(
'text',
$row[37]),
223 'success_status' => array(
'text',
$row[38]),
224 'suspend_data' => array(
'clob',
$row[39]),
225 'total_time' => array(
'text',
$row[40]),
226 'user_id' => array(
'integer', $userId),
227 'c_timestamp' => array(
'timestamp',
date(
'Y-m-d H:i:s')),
228 'additional_tables' => array(
'integer', $i_check)
231 if ($b_node_update==
false) {
232 $ilDB->insert(
'cmi_node', $a_data);
233 $ilLog->write(
"inserted");
235 $ilDB->update(
'cmi_node', $a_data, array(
'cmi_node_id' => array(
'integer', $cmi_node_id)));
239 if ($b_node_update==
true) {
244 $q =
'DELETE FROM cmi_comment WHERE cmi_node_id = %s';
245 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
250 if ($getInteractions) {
251 $q =
'DELETE FROM cmi_correct_response
252 WHERE cmi_interaction_id IN (
253 SELECT cmi_interaction.cmi_interaction_id FROM cmi_interaction WHERE cmi_interaction.cmi_node_id = %s)';
254 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
259 if ($getInteractions) {
260 $q =
'DELETE FROM cmi_interaction WHERE cmi_node_id = %s';
261 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
266 if ($getObjectives) {
267 $q =
'DELETE FROM cmi_objective WHERE cmi_node_id = %s';
268 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
280 $ilDB->insert(
'cmi_comment', array(
281 'cmi_comment_id' => array(
'integer',
$row[0]),
282 'cmi_node_id' => array(
'integer', $cmi_node_id),
283 'c_comment' => array(
'clob',
$row[2]),
284 'c_timestamp' => array(
'text',
$row[3]),
285 'location' => array(
'text',
$row[4]),
286 'sourceislms' => array(
'integer',
$row[5])
291 $cmi_interaction_id =
$ilDB->nextId(
'cmi_interaction');
292 $a_map_cmi_interaction_id[]=array(
$row[0],$cmi_interaction_id);
293 $ilDB->insert(
'cmi_interaction', array(
294 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
295 'cmi_node_id' => array(
'integer', $cmi_node_id),
296 'description' => array(
'clob',
$row[2]),
297 'id' => array(
'text',
$row[3]),
298 'latency' => array(
'text',
$row[4]),
299 'learner_response' => array(
'clob',
$row[5]),
300 'result' => array(
'text',
$row[6]),
301 'c_timestamp' => array(
'text',
$row[7]),
302 'c_type' => array(
'text',
$row[8]),
303 'weighting' => array(
'float',
$row[9])
308 $row[2] =
$ilDB->nextId(
'cmi_objective');
309 $cmi_interaction_id =
null;
310 if (
$row[0] !=
null) {
311 for (
$i=0;
$i<count($a_map_cmi_interaction_id);
$i++) {
312 if (
$row[0] == $a_map_cmi_interaction_id[
$i][0]) {
313 $cmi_interaction_id=$a_map_cmi_interaction_id[
$i][1];
317 $ilDB->insert(
'cmi_objective', array(
318 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
319 'cmi_node_id' => array(
'integer', $cmi_node_id),
320 'cmi_objective_id' => array(
'integer',
$row[2]),
321 'completion_status' => array(
'text',
$row[3]),
322 'description' => array(
'clob',
$row[4]),
323 'id' => array(
'text',
$row[5]),
324 'c_max' => array(
'float',
$row[6]),
325 'c_min' => array(
'float',
$row[7]),
326 'c_raw' => array(
'float',
$row[8]),
327 'scaled' => array(
'float',
$row[9]),
328 'progress_measure' => array(
'float',
$row[10]),
329 'success_status' => array(
'text',
$row[11]),
330 'scope' => array(
'text',
$row[12])
334 case 'correct_response':
335 $cmi_interaction_id =
null;
336 if (
$row[1] !==
null) {
337 for (
$i=0;
$i<count($a_map_cmi_interaction_id);
$i++) {
338 if (
$row[1] == $a_map_cmi_interaction_id[
$i][0]) {
339 $cmi_interaction_id=$a_map_cmi_interaction_id[
$i][1];
342 $row[0] =
$ilDB->nextId(
'cmi_correct_response');
343 $ilDB->insert(
'cmi_correct_response', array(
344 'cmi_correct_resp_id' => array(
'integer',
$row[0]),
345 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
346 'pattern' => array(
'text',
$row[2])
387 $changed_seq_utilities=
$data->changed_seq_utilities;
388 $ilLog->write(
"SCORM2004 adl_seq_utilities changed: " . $changed_seq_utilities);
389 if ($changed_seq_utilities == 1) {
400 $saved_global_status=
$data->saved_global_status;
401 $ilLog->write(
"saved_global_status=" . $saved_global_status);
405 $totalTime=(int)
$data->totalTimeCentisec;
406 $totalTime=round($totalTime/100);
408 'UPDATE sahs_user SET sco_total_time_sec=%s, status=%s, percentage_completed=%s WHERE obj_id = %s AND user_id = %s',
409 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
410 array($totalTime, $new_global_status,
$data->percentageCompleted,
$packageId, $userId)
413 self::ensureObjectDataCacheExistence();
416 $ilObjDataCache =
$DIC[
"ilObjDataCache"];
419 if ($new_global_status !=
null) {
420 include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
421 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
427 if ($time_from_lms==
false) {
428 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Tracking.php");
445 $ilLog->write(
"SCORM2004 writeGObjective");
447 $returnAr=array(
null,
null,
null);
450 if ($g_data ==
null) {
454 $rows_to_insert = array();
456 foreach ($g_data as
$key => $value) {
457 $ilLog->write(
"SCORM2004 writeGObjective -key: " .
$key);
461 foreach ($value as $skey => $svalue) {
462 $ilLog->write(
"SCORM2004 writeGObjective -skey: " . $skey);
464 if ($g_data->$key->$skey->$user->$package) {
465 $o_value = $g_data->$key->$skey->$user->$package;
469 $o_value = $g_data->$key->$skey->$user->{
"null"};
475 $objective_id = $skey;
479 if (
$key ==
"status") {
482 $completed = $g_data->$key->$skey->$user->{completed};
483 $measure = $g_data->$key->$skey->$user->{measure};
484 $satisfied = $g_data->$key->$skey->$user->{satisfied};
486 $returnAr=array($completed, $satisfied, $measure);
488 $obj =
'-course_overall_status-';
493 SELECT user_id FROM cmi_gobjective
494 WHERE objective_id =%s
497 array(
'text',
'integer',
'integer'),
498 array($obj, $dbuser, $pkg_id)
504 INSERT INTO cmi_gobjective
505 (user_id, status, scope_id, measure, satisfied, objective_id)
506 VALUES (%s, %s, %s, %s, %s, %s)',
507 array(
'integer',
'text',
'integer',
'text',
'text',
'text'),
508 array($dbuser, $completed, $pkg_id, $measure, $satisfied, $obj)
510 $ilLog->write(
"SCORM2004 cmi_gobjective Insert status=" . $completed .
" scope_id=" . $pkg_id .
" measure=" . $measure .
" satisfied=" . $satisfied .
" objective_id=" . $obj);
514 UPDATE cmi_gobjective
518 WHERE objective_id = %s
521 array(
'text',
'text',
'text',
'text',
'integer',
'integer'),
522 array($completed, $measure, $satisfied, $obj, $dbuser, $pkg_id)
524 $ilLog->write(
"SCORM2004 cmi_gobjective Update status=" . $completed .
" scope_id=" . $pkg_id .
" measure=" . $measure .
" satisfied=" . $satisfied .
" objective_id=" . $obj);
528 if ($rows_to_insert[$objective_id] ==
null) {
529 $rows_to_insert[$objective_id] = array();
531 $rows_to_insert[$objective_id][
$key] = $toset;
538 "SELECT global_to_system
545 $scope_id = (
$ilDB->fetchObject(
$res)->global_to_system) ? 0 : $package;
548 $existing_key_template =
"";
549 foreach (array_keys($rows_to_insert) as $obj_id) {
550 $existing_key_template .=
"'{$obj_id}',";
553 $existing_key_template = substr($existing_key_template, 0, strlen($existing_key_template) - 1);
554 $existing_keys = array();
556 if ($existing_key_template !=
"") {
563 AND objective_id IN ($existing_key_template)",
564 array(
'integer',
'integer'),
565 array($dbuser, $scope_id)
569 $existing_keys[] =
$row[
'objective_id'];
573 foreach ($rows_to_insert as $obj_id => $vals) {
574 if (in_array($obj_id, $existing_keys)) {
576 "UPDATE cmi_gobjective
582 completion_status=%s,
584 WHERE objective_id = %s
587 array(
'text',
'text',
'text',
'text',
'text',
'text',
588 'text',
'text',
'integer',
'integer'),
589 array($vals[
'satisfied'], $vals[
"measure"], $vals[
"score_raw"],
590 $vals[
"score_min"], $vals[
"score_max"],
591 $vals[
"completion_status"], $vals[
"progress_measure"],
592 $obj_id, $dbuser, $scope_id)
596 "INSERT INTO cmi_gobjective
597 (user_id, satisfied, measure, scope_id, status, objective_id,
598 score_raw, score_min, score_max, progress_measure, completion_status)
599 VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
600 array(
'integer',
'text',
'text',
'integer',
'text',
'text',
601 'text',
'text',
'text',
'text',
'text'),
602 array($dbuser, $vals[
'satisfied'], $vals[
'measure'],
603 $scope_id,
null, $obj_id, $vals[
'score_raw'],
604 $vals[
'score_min'], $vals[
'score_max'],
605 $vals[
'progress_measure'], $vals[
'completion_status'])
618 protected static function ensureObjectDataCacheExistence()
625 $ilObjDataCache =
$DIC[
"ilObjDataCache"];
631 require_once
'./Services/Object/classes/class.ilObjectDataCache.php';
633 $GLOBALS[
'ilObjDataCache'] = $ilObjDataCache;
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
An exception for terminatinating execution or to throw for unit testing.
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
Class ilSCORM2004StoreData.
static writeGObjective($g_data, $user, $package)
static setCMIData($userId, $packageId, $data, $getComments, $getInteractions, $getObjectives)
static syncGlobalStatus($userId, $packageId, $data, $new_global_status, $time_from_lms)
static persistCMIData($userId=null, $packageId, $defaultLessonMode, $comments, $interactions, $objectives, $time_from_lms, $data=null)
static checkIfAllowed($packageId, $userId, $hash)
static scormPlayerUnload($userId=null, $packageId, $time_from_lms)
static setGlobalObjectives($userId, $packageId, $data)
static _syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id, $time_from_lms=null)
Synch read event table.
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
if(empty($password)) $table
foreach($_POST as $key=> $value) $res
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']