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));
 
   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                $in = file_get_contents(
"php://input");
 
  180                header(
'Content-Type: text/plain; charset=UTF-8');
 
  184                        print(
"storeJsApiCmi failed");
 
  187                        if($rval!=
true) 
print(
"syncGlobalStatus failed");
 
  189                if($rval==
true) 
print(
"ok");
 
  195                $b_updateStatus=
false;
 
  198                if (
$ilLog->current_log_level == 30)
 
  202                        $ilLog->write(
"ScormAicc: CALLING SCORM storeJsApi() ".
$_POST);
 
  211                for ($i=0;$i<count(
$data->cmi);$i++) {
 
  212                        $aa_data[] = array(
"sco_id" => (
int) 
$data->cmi[$i][0], 
"left" => 
$data->cmi[$i][1], 
"right" => 
$data->cmi[$i][2]);
 
  217                        $ilLog->write(
"ScormAicc: storeJsApi: Error: No valid obj_id given.");
 
  220                        foreach($aa_data as $a_data) {
 
  221                                $set = 
$ilDB->queryF(
' 
  222                                SELECT rvalue FROM scorm_tracking  
  227                                array(
'integer',
'integer',
'text',
'integer'), 
 
  228                                array($user_id,$a_data[
"sco_id"],$a_data[
"left"],$obj_id));
 
  229                                if ($rec = 
$ilDB->fetchAssoc($set)) {
 
  230                                        if ($a_data[
"left"] == 
'cmi.core.lesson_status' && $a_data[
"right"] != $rec[
"rvalue"]) {
 
  231                                                $b_updateStatus = 
true;
 
  233                                        $ilDB->update(
'scorm_tracking',
 
  235                                                        'rvalue'                => array(
'clob', $a_data[
"right"]),
 
  239                                                        'user_id'               => array(
'integer', $user_id),
 
  240                                                        'sco_id'                => array(
'integer', $a_data[
"sco_id"]),
 
  241                                                        'lvalue'                => array(
'text', $a_data[
"left"]),
 
  242                                                        'obj_id'                => array(
'integer', $obj_id)
 
  246                                                $ilLog->write(
"ScormAicc: storeJsApi Updated - L:".$a_data[
"left"].
",R:".
 
  247                                                $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$a_data[
"sco_id"].
",user_id:".$user_id);
 
  251                                        if ($a_data[
"left"] == 
'cmi.core.lesson_status') {
 
  252                                                $b_updateStatus = 
true;
 
  254                                        $ilDB->insert(
'scorm_tracking', array(
 
  255                                                'obj_id'                => array(
'integer', $obj_id),
 
  256                                                'user_id'               => array(
'integer', $user_id),
 
  257                                                'sco_id'                => array(
'integer', $a_data[
"sco_id"]),
 
  258                                                'lvalue'                => array(
'text', $a_data[
"left"]),
 
  259                                                'rvalue'                => array(
'clob', $a_data[
"right"]),
 
  263                                                $ilLog->write(
"ScormAicc: storeJsApi Inserted - L:".$a_data[
"left"].
",R:".
 
  264                                                $a_data[
"right"].
" for obj_id:".$obj_id.
",sco_id:".$$a_data[
"sco_id"].
",user_id:".$user_id);
 
  283                $saved_global_status=
$data->saved_global_status;
 
  284                $ilLog->write(
"saved_global_status=".$saved_global_status);
 
  289                if (!
$data->packageAttempts) {
 
  290                        $val_set = 
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  291                                array(
'integer',
'integer'), array(
$packageId,$userId));
 
  292                        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
  293                        $attempts = $val_rec[
"package_attempts"];
 
  295                        $attempts=
$data->packageAttempts;
 
  297                if ($attempts == 
null) $attempts = 1;
 
  300                $totalTime=(int)
$data->totalTimeCentisec;
 
  301                $totalTime=round($totalTime/100);
 
  302                $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',
 
  303                        array(
'integer', 
'integer', 
'integer', 
'integer', 
'integer', 
'integer'), 
 
  304                        array($totalTime, $new_global_status, 
$data->percentageCompleted, $attempts, 
$packageId, $userId));
 
  307                global $ilObjDataCache;
 
  308                include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
 
  314                if ($new_global_status != 
null) {
 
  315                        include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
 
  316                        include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
 
  336                $val_set = 
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  337                array(
'integer',
'integer'),
 
  338                array($a_obj_id,$a_user_id));
 
  340                $val_rec = 
$ilDB->fetchAssoc($val_set);
 
  342                if ($val_rec[
"package_attempts"] == 
null) {
 
  343                        $val_rec[
"package_attempts"]=
"";
 
  345                $attempts = $val_rec[
"package_attempts"];
 
  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));
 
  358                while($sco_rec = 
$ilDB->fetchAssoc($sco_set))           
 
  360                        $tarr = explode(
":", $sco_rec[
"rvalue"]);
 
  361                        $sec = (int) $tarr[2] + (
int) $tarr[1] * 60 +
 
  362                                (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',
 
  409                        array(
'integer'),array($a_obj_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();
 
  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'));
 
  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));
 
  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";
 
  524                        if ($status == 
"in_progress" && self::_hasMaxAttempts($a_obj_id, $a_user_id))
 
  537                $val_set = 
$ilDB->queryF(
'SELECT max_attempt FROM sahs_lm WHERE id = %s',
 
  538                        array(
'integer'), array($a_obj_id));
 
  539                $val_rec = 
$ilDB->fetchAssoc($val_set);
 
  540                $max_attempts = $val_rec[
"max_attempt"]; 
 
  544                        $val_set = 
$ilDB->queryF(
'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  545                                array(
'integer',
'integer'),
 
  546                                array($a_obj_id,$a_user_id));
 
  547                        $val_rec = 
$ilDB->fetchAssoc($val_set); 
 
  548                        if ($val_rec[
"package_attempts"] == 
null) 
 
  550                                $val_rec[
"package_attempts"] = 0;
 
  552                        $act_attempts = $val_rec[
"package_attempts"];
 
  554                        if ($act_attempts >= $max_attempts)
 
  567                if (is_array($a_scos))
 
  569                        $in = 
$ilDB->in(
'sco_id', $a_scos, 
false, 
'integer');
 
  571                        $res = 
$ilDB->queryF(
'SELECT sco_id, rvalue FROM scorm_tracking  
  576                        array(
'integer',
'text', 
'integer'),
 
  577                        array($a_obj_id,
'cmi.core.lesson_status', $a_user_id));
 
  582                                if ($rec[
"rvalue"] == 
"completed" || $rec[
"rvalue"] == 
"passed")
 
  601                $query = 
'SELECT user_id, MAX(c_timestamp) tst '.
 
  602                        'FROM scorm_tracking '.
 
  603                        'WHERE obj_id = '.$ilDB->quote($a_obj_id,
'integer').
' '.
 
  625                $res = 
$ilDB->queryF(
'SELECT DISTINCT user_id FROM scorm_tracking  
  628                        array(
'integer',
'text'),
 
  629                        array($a_obj_id,
'cmi.core.lesson_status'));
 
  634                        $users[] = 
$row[
"user_id"];
 
  649                if(is_array($scorm_item_id))
 
  651                        $in = 
$ilDB->in(
'sco_id', $scorm_item_id, 
false, 
'integer');
 
  654                                SELECT DISTINCT(user_id) FROM scorm_tracking  
  658                                AND '.
$ilDB->like(
'rvalue', 
'clob', 
'failed').
' ',
 
  659                        array(
'integer',
'text'),
 
  660                        array($a_obj_id,
'cmi.core.lesson_status'));
 
  666                                SELECT DISTINCT(user_id) FROM scorm_tracking  
  670                                AND '.
$ilDB->like(
'rvalue', 
'clob', 
'failed').
' ',
 
  671                        array(
'integer',
'integer',
'text'),
 
  672                        array($scorm_item_id,$a_obj_id,
'cmi.core.lesson_status'));
 
  677                        $user_ids[] = 
$row->user_id;
 
  679                return $user_ids ? $user_ids : array();
 
  692                $in = 
$ilDB->in(
'sco_id', $a_scorm_item_ids, 
false, 
'integer');
 
  697                        SELECT user_id, COUNT(user_id) completed FROM scorm_tracking 
  701                        AND ('.
$ilDB->like(
'rvalue', 
'clob', 
'completed').
' OR '.
$ilDB->like(
'rvalue', 
'clob', 
'passed').
') 
  703                        array(
'integer', 
'text'),
 
  704                        array($a_obj_id, 
'cmi.core.lesson_status')
 
  708                        $users[
$row->user_id] = 
$row->completed;
 
  726                return $users ? $users : array();
 
  739                $in = 
$ilDB->in(
'sco_id', $sco_item_ids, 
false, 
'integer');
 
  742                SELECT * FROM scorm_tracking  
  746                array(
'integer',
'text'), 
 
  747                array($a_obj_id,
'cmi.core.lesson_status'));
 
  749                $info[
'completed'] = array();
 
  750                $info[
'failed'] = array();
 
  759                                        $info[
'completed'][
$row->sco_id][] = 
$row->user_id;
 
  760                                        $user_ids[
$row->sco_id][] = 
$row->user_id;
 
  764                                        $info[
'failed'][
$row->sco_id][] = 
$row->user_id;
 
  765                                        $user_ids[
$row->sco_id][] = 
$row->user_id;
 
  782                        $GLOBALS[
'ilLog']->write(__METHOD__.
' no valid obj_id');
 
  784                        $last_visited=
$_POST[
'last_visited'];
 
  785                        $ilDB->manipulateF(
'UPDATE sahs_user  
  786                                SET last_visited = %s, last_access = %s 
  787                                WHERE obj_id = %s AND user_id = %s',  
 
  788                                array(
'text', 
'timestamp', 
'integer', 
'integer'),
 
  789                                array($last_visited, date(
'Y-m-d H:i:s'), $obj_id, $user_id)
 
  831                header(
'Content-Type: text/plain; charset=UTF-8');
 
const DB_FETCHMODE_OBJECT
_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 _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_no_raise=false, $a_force_raise=false)
Update status.
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
Class ilObjSCORMTracking.
static _getProgressInfo($sco_item_ids, $a_obj_id)
Get info about.
static _getCompleted($scorm_item_id, $a_obj_id)
like necessary because of Oracle
static _countCompleted($a_scos, $a_obj_id, $a_user_id)
static _getInProgress($scorm_item_id, $a_obj_id, $a_blocked_user_ids=null)
static _getCollectionStatus($a_scos, $a_obj_id, $a_user_id)
_syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id)
Synch read event table.
_getFailed($scorm_item_id, $a_obj_id)
like necessary because of Oracle
static lookupLastAccessTimes($a_obj_id)
Lookup last acccess time for all users of a scorm module @global ilDB $ilDB.
_insertTrackData($a_sahs_id, $a_lval, $a_rval, $a_obj_id)
storeJsApiCmi($user_id, $obj_id, $data)
ilObjSCORMTracking()
Constructor @access public.
static _getCountCompletedPerUser($a_scorm_item_ids, $a_obj_id)
Get users who have status completed or passed.
store($obj_id=0, $sahs_id=0, $extractData=1)
static _hasMaxAttempts($a_obj_id, $a_user_id)
syncGlobalStatus($userId, $packageId, $data, $new_global_status)
_getTrackedUsers($a_obj_id)
Get all tracked users.
static _lookupObjId($a_id)
static now()
Return current timestamp in Y-m-d H:i:s format.