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));
 
  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) {
 
  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 . 
"-");
 
  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));
 
  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) {
 
  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");
 
  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';
 
  643        $GLOBALS[
'DIC'][
'ilObjDataCache'] = $ilObjDataCache;
 
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.
static handleOutcomeWithoutLP($a_obj_id, $a_usr_id, $a_percentage)
static getQuantityOfSCOs(int $a_slm_id)
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['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
if(empty($password)) $table
foreach($_POST as $key=> $value) $res
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']