18 $ilDB = $DIC->database();
21 $data = json_decode(file_get_contents(
'php://input'));
25 if ($userId == null) {
26 $userId = (int)
$data->p;
30 if (
$data->last !=
"") {
31 $last_visited =
$data->last;
33 $endDate = date(
'Y-m-d H:i:s', mktime(date(
'H'), date(
'i') + 5, date(
's'), date(
'm'), date(
'd'), date(
'Y')));
34 $total_time_sec = null;
35 if (
$data->total_time_sec !=
"") {
36 $total_time_sec =
$data->total_time_sec;
39 SET total_time_sec = %s, last_visited = %s, hash_end =%s, last_access = %s 40 WHERE obj_id = %s AND user_id = %s',
41 array(
'integer',
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
42 array($total_time_sec,$last_visited, $endDate, date(
'Y-m-d H:i:s'),
$packageId, $userId)
44 if ($time_from_lms ==
true) {
45 self::ensureObjectDataCacheExistence();
48 $ilObjDataCache = $DIC[
"ilObjDataCache"];
50 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Tracking.php");
57 SET last_visited = %s, hash_end =%s, last_access = %s 58 WHERE obj_id = %s AND user_id = %s',
59 array(
'text',
'timestamp',
'timestamp',
'integer',
'integer'),
60 array($last_visited, $endDate, date(
'Y-m-d H:i:s'),
$packageId, $userId)
64 header(
'Content-Type: text/plain; charset=UTF-8');
69 public static function persistCMIData($userId = null,
$packageId, $defaultLessonMode, $comments, $interactions, $objectives, $time_from_lms,
$data = null)
75 if ($defaultLessonMode ==
"browse") {
79 $jsMode = strpos(
$_SERVER[
'HTTP_ACCEPT'],
'text/javascript') !==
false;
81 $data = json_decode(is_string(
$data) ?
$data : file_get_contents(
'php://input'));
82 $ilLog->write(
"dataTo_setCMIData: " . file_get_contents(
'php://input'));
86 if ($userId == null) {
87 $userId = (int)
$data->p;
103 $new_global_status =
$data->now_global_status;
104 $return[
"new_global_status"] = $new_global_status;
107 $score_scaled =
$data->node[0][35];
108 if ($score_scaled != null) {
116 $ilLog->write(
"SCORM: return of persistCMIData: " . json_encode($return));
118 header(
'Content-Type: text/javascript; charset=UTF-8');
119 print(json_encode($return));
121 header(
'Content-Type: text/html; charset=UTF-8');
122 print(var_export($return,
true));
130 $ilDB = $DIC->database();
132 'select hash from sahs_user where obj_id=%s AND user_id=%s AND hash_end>%s',
133 array(
'integer',
'integer',
'timestamp'),
137 if ($rowtmp[
'hash'] == $hash) {
148 $ilDB = $DIC->database();
157 $i_check =
$data->i_check;
158 $i_set =
$data->i_set;
159 $b_node_update =
false;
161 $a_map_cmi_interaction_id = array();
163 $tables = array(
'node',
'comment',
'interaction',
'objective',
'correct_response');
165 foreach ($tables as
$table) {
166 if (!is_array(
$data->$table)) {
170 $ilLog->write(
"SCORM: setCMIData, table -" . $table .
"-");
174 $ilLog->write(
"Checking table: " . $table);
180 'SELECT cmi_node_id FROM cmi_node WHERE cp_node_id = %s and user_id = %s',
181 array(
'integer',
'integer'),
182 array($row[19],$userId)
185 $cmi_node_id = $rowtmp[
'cmi_node_id'];
186 if ($cmi_node_id != null) {
187 $b_node_update =
true;
189 $cmi_node_id =
$ilDB->nextId(
'cmi_node');
190 $b_node_update =
false;
192 $ilLog->write(
"setCMIdata with cmi_node_id = " . $cmi_node_id);
194 'accesscount' => array(
'integer', $row[0]),
195 'accessduration' => array(
'text', $row[1]),
196 'accessed' => array(
'text', $row[2]),
197 'activityabsduration' => array(
'text', $row[3]),
198 'activityattemptcount' => array(
'integer', $row[4]),
199 'activityexpduration' => array(
'text', $row[5]),
200 'activityprogstatus' => array(
'integer', $row[6]),
201 'attemptabsduration' => array(
'text', $row[7]),
202 'attemptcomplamount' => array(
'float', $row[8]),
203 'attemptcomplstatus' => array(
'integer', $row[9]),
204 'attemptexpduration' => array(
'text', $row[10]),
205 'attemptprogstatus' => array(
'integer', $row[11]),
206 'audio_captioning' => array(
'integer', $row[12]),
207 'audio_level' => array(
'float', $row[13]),
208 'availablechildren' => array(
'text', $row[14]),
209 'cmi_node_id' => array(
'integer', $cmi_node_id),
210 'completion' => array(
'float', $row[16]),
211 'completion_status' => array(
'text', $row[17]),
212 'completion_threshold' => array(
'text', $row[18]),
213 'cp_node_id' => array(
'integer', $row[19]),
214 'created' => array(
'text', $row[20]),
215 'credit' => array(
'text', $row[21]),
216 'delivery_speed' => array(
'float', $row[22]),
217 'c_entry' => array(
'text', $row[23]),
218 'c_exit' => array(
'text', $row[24]),
219 'c_language' => array(
'text', $row[25]),
220 'launch_data' => array(
'clob', $row[26]),
221 'learner_name' => array(
'text', $row[27]),
222 'location' => array(
'text', $row[28]),
223 'c_max' => array(
'float', $row[29]),
224 'c_min' => array(
'float', $row[30]),
225 'c_mode' => array(
'text', $row[31]),
226 'modified' => array(
'text', $row[32]),
227 'progress_measure' => array(
'float', $row[33]),
228 'c_raw' => array(
'float', $row[34]),
229 'scaled' => array(
'float', $row[35]),
230 'scaled_passing_score' => array(
'float', $row[36]),
231 'session_time' => array(
'text', $row[37]),
232 'success_status' => array(
'text', $row[38]),
233 'suspend_data' => array(
'clob', $row[39]),
234 'total_time' => array(
'text', $row[40]),
235 'user_id' => array(
'integer', $userId),
236 'c_timestamp' => array(
'timestamp', date(
'Y-m-d H:i:s')),
237 'additional_tables' => array(
'integer', $i_check)
240 if ($b_node_update ==
false) {
241 $ilDB->insert(
'cmi_node', $a_data);
242 $ilLog->write(
"inserted");
244 $ilDB->update(
'cmi_node', $a_data, array(
'cmi_node_id' => array(
'integer', $cmi_node_id)));
248 if ($b_node_update ==
true) {
253 $q =
'DELETE FROM cmi_comment WHERE cmi_node_id = %s';
254 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
259 if ($getInteractions) {
260 $q =
'DELETE FROM cmi_correct_response 261 WHERE cmi_interaction_id IN ( 262 SELECT cmi_interaction.cmi_interaction_id FROM cmi_interaction WHERE cmi_interaction.cmi_node_id = %s)';
263 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
268 if ($getInteractions) {
269 $q =
'DELETE FROM cmi_interaction WHERE cmi_node_id = %s';
270 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
275 if ($getObjectives) {
276 $q =
'DELETE FROM cmi_objective WHERE cmi_node_id = %s';
277 $ilDB->manipulateF($q, array(
'integer'), array($cmi_node_id));
283 $result[(string) $row[19]] = $cmi_node_id;
287 $row[0] =
$ilDB->nextId(
'cmi_comment');
289 $ilDB->insert(
'cmi_comment', array(
290 'cmi_comment_id' => array(
'integer', $row[0]),
291 'cmi_node_id' => array(
'integer', $cmi_node_id),
292 'c_comment' => array(
'clob', $row[2]),
293 'c_timestamp' => array(
'text', $row[3]),
294 'location' => array(
'text', $row[4]),
295 'sourceislms' => array(
'integer', $row[5])
300 $cmi_interaction_id =
$ilDB->nextId(
'cmi_interaction');
301 $a_map_cmi_interaction_id[] = array($row[0],$cmi_interaction_id);
302 $ilDB->insert(
'cmi_interaction', array(
303 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
304 'cmi_node_id' => array(
'integer', $cmi_node_id),
305 'description' => array(
'clob', $row[2]),
306 'id' => array(
'text', $row[3]),
307 'latency' => array(
'text', $row[4]),
308 'learner_response' => array(
'clob', $row[5]),
309 'result' => array(
'text', $row[6]),
310 'c_timestamp' => array(
'text', $row[7]),
311 'c_type' => array(
'text', $row[8]),
312 'weighting' => array(
'float', $row[9])
317 $row[2] =
$ilDB->nextId(
'cmi_objective');
318 $cmi_interaction_id = null;
319 if ($row[0] != null) {
320 for (
$i = 0;
$i < count($a_map_cmi_interaction_id);
$i++) {
321 if ($row[0] == $a_map_cmi_interaction_id[
$i][0]) {
322 $cmi_interaction_id = $a_map_cmi_interaction_id[
$i][1];
326 $ilDB->insert(
'cmi_objective', array(
327 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
328 'cmi_node_id' => array(
'integer', $cmi_node_id),
329 'cmi_objective_id' => array(
'integer', $row[2]),
330 'completion_status' => array(
'text', $row[3]),
331 'description' => array(
'clob', $row[4]),
332 'id' => array(
'text', $row[5]),
333 'c_max' => array(
'float', $row[6]),
334 'c_min' => array(
'float', $row[7]),
335 'c_raw' => array(
'float', $row[8]),
336 'scaled' => array(
'float', $row[9]),
337 'progress_measure' => array(
'float', $row[10]),
338 'success_status' => array(
'text', $row[11]),
339 'scope' => array(
'text', $row[12])
343 case 'correct_response':
344 $cmi_interaction_id = null;
345 if ($row[1] !== null) {
346 for (
$i = 0;
$i < count($a_map_cmi_interaction_id);
$i++) {
347 if ($row[1] == $a_map_cmi_interaction_id[
$i][0]) {
348 $cmi_interaction_id = $a_map_cmi_interaction_id[
$i][1];
351 $row[0] =
$ilDB->nextId(
'cmi_correct_response');
352 $ilDB->insert(
'cmi_correct_response', array(
353 'cmi_correct_resp_id' => array(
'integer', $row[0]),
354 'cmi_interaction_id' => array(
'integer', $cmi_interaction_id),
355 'pattern' => array(
'text', $row[2])
397 $changed_seq_utilities =
$data->changed_seq_utilities;
398 $ilLog->write(
"SCORM2004 adl_seq_utilities changed: " . $changed_seq_utilities);
399 if ($changed_seq_utilities == 1) {
408 $ilDB = $DIC->database();
410 $saved_global_status =
$data->saved_global_status;
411 $ilLog->write(
"saved_global_status=" . $saved_global_status);
415 $totalTime = (int)
$data->totalTimeCentisec;
416 $totalTime = round($totalTime / 100);
418 'UPDATE sahs_user SET sco_total_time_sec=%s, status=%s, percentage_completed=%s WHERE obj_id = %s AND user_id = %s',
419 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
420 array($totalTime, $new_global_status,
$data->percentageCompleted,
$packageId, $userId)
423 self::ensureObjectDataCacheExistence();
426 $ilObjDataCache = $DIC[
"ilObjDataCache"];
429 if ($new_global_status != null) {
430 include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
431 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
437 if ($time_from_lms ==
false) {
438 include_once(
"./Modules/Scorm2004/classes/class.ilSCORM2004Tracking.php");
453 $ilDB = $DIC->database();
455 $ilLog->write(
"SCORM2004 writeGObjective");
457 $returnAr = array(null,null,null);
460 if ($g_data == null) {
464 $rows_to_insert = array();
466 foreach ($g_data as
$key => $value) {
467 $ilLog->write(
"SCORM2004 writeGObjective -key: " .
$key);
471 foreach ($value as $skey => $svalue) {
472 $ilLog->write(
"SCORM2004 writeGObjective -skey: " . $skey);
474 if ($g_data->$key->$skey->$user->$package) {
475 $o_value = $g_data->$key->$skey->$user->$package;
479 $o_value = $g_data->$key->$skey->$user->{
"null"};
485 $objective_id = $skey;
489 if (
$key ==
"status") {
492 $completed = $g_data->$key->$skey->$user->{
"completed"};
493 $measure = $g_data->$key->$skey->$user->{
"measure"};
494 $satisfied = $g_data->$key->$skey->$user->{
"satisfied"};
496 $returnAr = array($completed, $satisfied, $measure);
498 $obj =
'-course_overall_status-';
503 SELECT user_id FROM cmi_gobjective 504 WHERE objective_id =%s 507 array(
'text',
'integer',
'integer'),
508 array($obj, $dbuser, $pkg_id)
514 INSERT INTO cmi_gobjective 515 (user_id, status, scope_id, measure, satisfied, objective_id) 516 VALUES (%s, %s, %s, %s, %s, %s)',
517 array(
'integer',
'text',
'integer',
'text',
'text',
'text'),
518 array($dbuser, $completed, $pkg_id, $measure, $satisfied, $obj)
520 $ilLog->write(
"SCORM2004 cmi_gobjective Insert status=" . $completed .
" scope_id=" . $pkg_id .
" measure=" . $measure .
" satisfied=" . $satisfied .
" objective_id=" . $obj);
524 UPDATE cmi_gobjective 528 WHERE objective_id = %s 531 array(
'text',
'text',
'text',
'text',
'integer',
'integer'),
532 array($completed, $measure, $satisfied, $obj, $dbuser, $pkg_id)
534 $ilLog->write(
"SCORM2004 cmi_gobjective Update status=" . $completed .
" scope_id=" . $pkg_id .
" measure=" . $measure .
" satisfied=" . $satisfied .
" objective_id=" . $obj);
538 if ($rows_to_insert[$objective_id] == null) {
539 $rows_to_insert[$objective_id] = array();
541 $rows_to_insert[$objective_id][
$key] = $toset;
548 "SELECT global_to_system 555 $scope_id = (
$ilDB->fetchObject(
$res)->global_to_system) ? 0 : $package;
558 $existing_key_template =
"";
559 foreach (array_keys($rows_to_insert) as $obj_id) {
560 $existing_key_template .=
"'{$obj_id}',";
563 $existing_key_template = substr($existing_key_template, 0, strlen($existing_key_template) - 1);
564 $existing_keys = array();
566 if ($existing_key_template !=
"") {
573 AND objective_id IN ($existing_key_template)",
574 array(
'integer',
'integer'),
575 array($dbuser, $scope_id)
579 $existing_keys[] =
$row[
'objective_id'];
583 foreach ($rows_to_insert as $obj_id => $vals) {
584 if (in_array($obj_id, $existing_keys)) {
586 "UPDATE cmi_gobjective 592 completion_status=%s, 594 WHERE objective_id = %s 597 array(
'text',
'text',
'text',
'text',
'text',
'text',
598 'text',
'text',
'integer',
'integer'),
599 array($vals[
'satisfied'], $vals[
"measure"], $vals[
"score_raw"],
600 $vals[
"score_min"], $vals[
"score_max"],
601 $vals[
"completion_status"], $vals[
"progress_measure"],
602 $obj_id, $dbuser, $scope_id)
606 "INSERT INTO cmi_gobjective 607 (user_id, satisfied, measure, scope_id, status, objective_id, 608 score_raw, score_min, score_max, progress_measure, completion_status) 609 VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
610 array(
'integer',
'text',
'text',
'integer',
'text',
'text',
611 'text',
'text',
'text',
'text',
'text'),
612 array($dbuser, $vals[
'satisfied'], $vals[
'measure'],
613 $scope_id, null, $obj_id, $vals[
'score_raw'],
614 $vals[
'score_min'], $vals[
'score_max'],
615 $vals[
'progress_measure'], $vals[
'completion_status'])
628 protected static function ensureObjectDataCacheExistence()
635 $ilObjDataCache = $DIC[
"ilObjDataCache"];
641 require_once
'./Services/Object/classes/class.ilObjectDataCache.php';
642 $ilObjDataCache =
new ilObjectDataCache();
643 $GLOBALS[
'DIC'][
'ilObjDataCache'] = $ilObjDataCache;
static syncGlobalStatus($userId, $packageId, $data, $new_global_status, $time_from_lms)
static checkIfAllowed($packageId, $userId, $hash)
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']
static setGlobalObjectives($userId, $packageId, $data)
static scormPlayerUnload($userId=null, $packageId, $time_from_lms)
Class ilSCORM2004StoreData.
foreach($_POST as $key=> $value) $res
static getQuantityOfSCOs(int $a_slm_id)
static persistCMIData($userId=null, $packageId, $defaultLessonMode, $comments, $interactions, $objectives, $time_from_lms, $data=null)
static handleOutcomeWithoutLP($a_obj_id, $a_usr_id, $a_percentage)
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
static setCMIData($userId, $packageId, $data, $getComments, $getInteractions, $getObjectives)
if(empty($password)) $table
static _syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id, $time_from_lms=null)
Synch read event table.
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
static writeGObjective($g_data, $user, $package)