4include_once 
'./Modules/ScormAicc/classes/class.ilSCORMTrackingItems.php';
 
    5include_once 
'./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
 
   33        $this->db = 
$DIC->database();
 
   34        $this->lng = 
$DIC->language();
 
   42        $query = 
'SELECT cp_item.cp_node_id, cp_item.title ' 
   43            . 
'FROM cp_item, cmi_node, cp_node ' 
   44            . 
'WHERE cp_node.slm_id = %s ' 
   45            . 
'AND cp_item.cp_node_id = cmi_node.cp_node_id ' 
   46            . 
'AND cp_node.cp_node_id = cmi_node.cp_node_id ' 
   47            . 
'GROUP BY cp_item.cp_node_id, cp_item.title';
 
   54            $scoTitles[
$row[
'cp_node_id']] = 
$row[
'title'];
 
   64        $lng->loadLanguageModule(
"scormtrac");
 
   70            'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title,' . $udh[
"cols"]
 
   71            . 
',audio_captioning,audio_level,completion_status,completion_threshold,credit,delivery_speed' 
   72            . 
',c_entry,c_exit,c_language,c_location,c_mode,progress_measure,c_max,c_min,c_raw,scaled' 
   73            . 
',scaled_passing_score,session_time,session_time_seconds,success_status,total_time,total_time_seconds,c_timestamp,suspend_data,launch_data' 
   75        $a_true = explode(
',', $udh[
"default"] . 
",sco_title,success_status,completion_status");
 
   76        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
   77            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
   79        for (
$i = 0;
$i < count($a_true);
$i++) {
 
   80            $cols[$a_true[
$i]][
"default"] = 
true;
 
   85    public function exportSelectedCore($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
   89        $lng->loadLanguageModule(
"scormtrac");
 
   91        $returnData = array();
 
   99        $query = 
'SELECT user_id, cp_node_id, ' 
  100            . 
'audio_captioning, audio_level, completion_status, completion_threshold, credit, delivery_speed, ' 
  101            . 
'c_entry, c_exit, c_language, location as c_location, c_mode, progress_measure, c_max, c_min, c_raw, scaled, ' 
  102            . 
'scaled_passing_score, session_time, success_status, total_time, c_timestamp, suspend_data, launch_data ' 
  104            . 
'WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
' ' 
  105            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  108            $query .= 
'cp_node_id, user_id';
 
  110            $query .= 
'user_id, cp_node_id';
 
  116        foreach ($dbdata as 
$data) {
 
  117            $data[
"lm_id"] = $obj_id;
 
  118            $data[
"lm_title"] = $lmTitle;
 
  119            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  120            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  121            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  122            $data[
"audio_captioning"] = 
"" . 
$data[
"audio_captioning"];
 
  123            $data[
"audio_level"] = 
"" . 
$data[
"audio_level"];
 
  124            $data[
"completion_status"] = 
"" . 
$data[
"completion_status"];
 
  125            $data[
"completion_threshold"] = 
"" . 
$data[
"completion_threshold"];
 
  127            $data[
"delivery_speed"] = 
"" . 
$data[
"delivery_speed"];
 
  130            $data[
"c_language"] = 
"" . 
$data[
"c_language"];
 
  131            $data[
"c_location"] = 
"" . str_replace(
'"', 
'', 
$data[
"c_location"]);
 
  133            $data[
"progress_measure"] = 
"" . 
$data[
"progress_measure"];
 
  138            $data[
"scaled_passing_score"] = 
"" . 
$data[
"scaled_passing_score"];
 
  139            $data[
"session_time"] = 
"" . 
$data[
"session_time"];
 
  140            $data[
"session_time_seconds"] = 
"";
 
  141            if (
$data[
"session_time"] != 
"") {
 
  144            $data[
"success_status"] = 
"" . 
$data[
"success_status"];
 
  145            $data[
"total_time"] = 
"" . 
$data[
"total_time"];
 
  146            $data[
"total_time_seconds"] = 
"";
 
  147            if (
$data[
"total_time"] != 
"") {
 
  151            $data[
"suspend_data"] = 
"" . 
$data[
"suspend_data"];
 
  152            $data[
"launch_data"] = 
"" . 
$data[
"launch_data"];
 
  162            $returnData[] = 
$data;
 
  173        $lng->loadLanguageModule(
"scormtrac");
 
  178            'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title,' . $udh[
"cols"]
 
  179            . 
',id,description,weighting,c_type,result,latency,latency_seconds,c_timestamp,learner_response' 
  181        $a_true = explode(
',', $udh[
"default"] . 
",sco_title,id,result,learner_response");
 
  182        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  183            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  185        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  186            $cols[$a_true[
$i]][
"default"] = 
true;
 
  191    public function exportSelectedInteractions($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
  195        $lng->loadLanguageModule(
"scormtrac");
 
  197        $returnData = array();
 
  204        $query = 
'SELECT cmi_node.user_id, cmi_node.cp_node_id, 
  205                                cmi_interaction.cmi_interaction_id, 
  207                                cmi_interaction.description,  
  208                                cmi_interaction.weighting,  
  209                                cmi_interaction.c_type,  
  210                                cmi_interaction.result,  
  211                                cmi_interaction.latency,  
  212                                cmi_interaction.c_timestamp,  
  213                                cmi_interaction.learner_response,  
  214                                cmi_interaction.cmi_interaction_id,  
  215                                cmi_interaction.cmi_node_id  
  216                                FROM cmi_interaction, cmi_node  
  217                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  218                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  219                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id 
  222            $query .= 
'cmi_node.cp_node_id, cmi_node.user_id';
 
  224            $query .= 
'cmi_node.user_id, cmi_node.cp_node_id';
 
  226        $query .= 
', cmi_interaction.cmi_interaction_id, cmi_interaction.cmi_node_id';
 
  231        foreach ($dbdata as 
$data) {
 
  232            $data[
"lm_id"] = $obj_id;
 
  233            $data[
"lm_title"] = $lmTitle;
 
  234            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  235            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  236            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  237            $data[
"description"] = 
"" . 
$data[
"description"];
 
  242            $data[
"latency_seconds"] = 
"";
 
  243            if (
$data[
"latency"] != 
"") {
 
  246            $data[
"c_timestamp"] = 
"" . 
$data[
"c_timestamp"];
 
  247            $data[
"learner_response"] = 
"" . str_replace(
'"', 
'', 
$data[
"learner_response"]);
 
  248            $returnData[] = 
$data;
 
  259        $lng->loadLanguageModule(
"scormtrac");
 
  264            'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title,' . $udh[
"cols"]
 
  265            . 
',id,description,completion_status,progress_measure,success_status,scaled,c_max,c_min,c_raw,scope' 
  267        $a_true = explode(
',', $udh[
"default"] . 
",sco_title,id,completion_status,success_status");
 
  268        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  269            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  271        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  272            $cols[$a_true[
$i]][
"default"] = 
true;
 
  277    public function exportSelectedObjectives($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
  281        $lng->loadLanguageModule(
"scormtrac");
 
  283        $returnData = array();
 
  290        $query = 
'SELECT cmi_node.user_id, cmi_node.cp_node_id, 
  291                                cmi_objective.cmi_objective_id, 
  293                                cmi_objective.description,  
  294                                cmi_objective.completion_status, 
  295                                cmi_objective.progress_measure, 
  296                                cmi_objective.success_status, 
  297                                cmi_objective.scaled, 
  302                                FROM cmi_objective, cmi_node  
  303                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  304                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  305                                AND cmi_node.cmi_node_id = cmi_objective.cmi_node_id  
  306                                AND cmi_interaction_id is null  
  309            $query .= 
'cmi_node.cp_node_id, cmi_node.user_id';
 
  311            $query .= 
'cmi_node.user_id, cmi_node.cp_node_id';
 
  313        $query .= 
', cmi_objective.cmi_node_id';
 
  318        foreach ($dbdata as 
$data) {
 
  319            $data[
"lm_id"] = $obj_id;
 
  320            $data[
"lm_title"] = $lmTitle;
 
  321            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  322            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  323            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  324            $data[
"description"] = 
"" . 
$data[
"description"];
 
  325            $data[
"completion_status"] = 
"" . 
$data[
"completion_status"];
 
  326            $data[
"progress_measure"] = 
"" . 
$data[
"progress_measure"];
 
  327            $data[
"success_status"] = 
"" . 
$data[
"success_status"];
 
  333            $returnData[] = 
$data;
 
  344        $lng->loadLanguageModule(
"scormtrac");
 
  349            'lm_id,lm_title,' . $udh[
"cols"]
 
  350            . 
',Status,satisfied,measure,c_raw,c_min,c_max,completion_status,progress_measure' 
  352        $a_true = explode(
',', $udh[
"default"] . 
",lm_title,Status,satisfied,completion_status");
 
  353        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  354            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  356        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  357            $cols[$a_true[
$i]][
"default"] = 
true;
 
  366        $lng->loadLanguageModule(
"scormtrac");
 
  367        $returnData = array();
 
  369        $query = 
'SELECT user_id, scope_id, 
  380                                AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' 
  381                                ORDER BY user_id, scope_id';
 
  386        foreach ($dbdata as 
$data) {
 
  388            $data[
"lm_title"] = $lmTitle;
 
  389            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  396            $data[
"completion_status"] = 
"" . 
$data[
"completion_status"];
 
  397            $data[
"progress_measure"] = 
"" . 
$data[
"progress_measure"];
 
  398            $returnData[] = 
$data;
 
  410        $lng->loadLanguageModule(
"scormtrac");
 
  414            'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title' 
  415            . 
',id,description,counter_all' 
  416            . 
',counter_correct,counter_correct_percent' 
  417            . 
',counter_incorrect,counter_incorrect_percent' 
  418            . 
',counter_other,counter_other_percent' 
  420        $a_true = explode(
',', 
"sco_title,description,counter_correct,counter_incorrect");
 
  421        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  422            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  424        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  425            $cols[$a_true[
$i]][
"default"] = 
true;
 
  430    public function tracInteractionItem($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
  434        $lng->loadLanguageModule(
"scormtrac");
 
  436        $returnData = array();
 
  442        $a_correct = array();
 
  443        $a_incorrect = array();
 
  444        $query = 
'SELECT cmi_node.cp_node_id, cmi_interaction.id, count(*) as counter 
  445                                FROM cmi_interaction, cmi_node  
  446                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  447                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  448                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id  
  449                                AND cmi_interaction.result = %s  
  450                                GROUP BY cmi_node.cp_node_id,cmi_interaction.id';
 
  454            $a_correct[
$row[
'cp_node_id'] . 
':' . 
$row[
'id']] = 
$row[
'counter'];
 
  459            $a_incorrect[
$row[
'cp_node_id'] . 
':' . 
$row[
'id']] = 
$row[
'counter'];
 
  463        $query = 
'SELECT cmi_node.cp_node_id, cmi_interaction.id, cmi_interaction.description, count(*) as counter_all 
  464                                FROM cmi_interaction, cmi_node  
  465                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  466                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  467                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id 
  468                                GROUP BY cmi_node.cp_node_id,cmi_interaction.id,cmi_interaction.description';
 
  473        foreach ($dbdata as 
$data) {
 
  474            $skey = 
$data[
"cp_node_id"] . 
':' . 
$data[
"id"];
 
  475            $all = 
$data[
"counter_all"];
 
  477            if ($a_correct[$skey] != 
null) {
 
  478                $correct = $a_correct[$skey];
 
  481            if ($a_incorrect[$skey] != 
null) {
 
  482                $incorrect = $a_incorrect[$skey];
 
  484            $other = $all - ($correct + $incorrect);
 
  485            $data[
"lm_id"] = $obj_id;
 
  486            $data[
"lm_title"] = $lmTitle;
 
  487            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  488            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  490            $data[
"description"] = 
"" . 
$data[
"description"];
 
  492            $data[
"counter_correct"] = $correct;
 
  493            $data[
"counter_correct_percent"] = $correct * 100 / $all;
 
  494            $data[
"counter_incorrect"] = $incorrect;
 
  495            $data[
"counter_incorrect_percent"] = $incorrect * 100 / $all;
 
  496            $data[
"counter_other"] = $other;
 
  497            $data[
"counter_other_percent"] = $other * 100 / $all;
 
  498            $returnData[] = 
$data;
 
  508        $lng->loadLanguageModule(
"scormtrac");
 
  514            'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title,' . $udh[
"cols"]
 
  515            . 
',counter_i_correct,counter_i_correct_percent' 
  516            . 
',counter_i_incorrect,counter_i_incorrect_percent' 
  517            . 
',counter_i_other,counter_i_other_percent' 
  518            . 
',audio_captioning,audio_level,completion_status,completion_threshold,credit,delivery_speed' 
  519            . 
',c_entry,c_exit,c_language,c_location,c_mode,progress_measure,c_max,c_min,c_raw,scaled' 
  520            . 
',scaled_passing_score,session_time,session_time_seconds,success_status,total_time,total_time_seconds,c_timestamp,suspend_data,launch_data' 
  522        $a_true = explode(
',', $udh[
"default"] . 
',sco_title' 
  523            . 
',counter_i_correct,counter_i_correct_percent' 
  524            . 
',counter_i_incorrect,counter_i_incorrect_percent' 
  525            . 
',counter_i_other,counter_i_other_percent' 
  527        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  528            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  530        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  531            $cols[$a_true[
$i]][
"default"] = 
true;
 
  536    public function tracInteractionUser($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
  540        $lng->loadLanguageModule(
"scormtrac");
 
  542        $returnData = array();
 
  548        $a_correct = array();
 
  549        $a_incorrect = array();
 
  551        $query = 
'SELECT cmi_node.user_id, cmi_node.cp_node_id, count(*) as counter 
  552                                FROM cmi_interaction, cmi_node  
  553                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  554                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  555                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id  
  556                                AND cmi_interaction.result = %s  
  557                                GROUP BY cmi_node.user_id,cmi_node.cp_node_id';
 
  561            $a_correct[
$row[
'user_id'] . 
':' . 
$row[
'cp_node_id']] = 
$row[
'counter'];
 
  566            $a_incorrect[
$row[
'user_id'] . 
':' . 
$row[
'cp_node_id']] = 
$row[
'counter'];
 
  569        $query = 
'SELECT cmi_node.user_id, cmi_node.cp_node_id, count(*) as counter 
  570                                FROM cmi_interaction, cmi_node  
  571                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  572                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  573                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id  
  574                                AND cmi_interaction.result <> %s AND  cmi_interaction.result <> %s 
  575                                GROUP BY cmi_node.user_id,cmi_node.cp_node_id';
 
  576        $res = 
$ilDB->queryF(
$query, array(
'text',
'text'), array(
'correct',
'incorrect'));
 
  578            $a_other[
$row[
'user_id'] . 
':' . 
$row[
'cp_node_id']] = 
$row[
'counter'];
 
  582        $query = 
'SELECT user_id, cp_node_id, ' 
  583            . 
'audio_captioning, audio_level, completion_status, completion_threshold, credit, delivery_speed, ' 
  584            . 
'c_entry, c_exit, c_language, location as c_location, c_mode, progress_measure, c_max, c_min, c_raw, scaled, ' 
  585            . 
'scaled_passing_score, session_time, success_status, total_time, c_timestamp, suspend_data, launch_data ' 
  587            . 
'WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
' ' 
  588            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  591            $query .= 
'cp_node_id, user_id';
 
  593            $query .= 
'user_id, cp_node_id';
 
  599        foreach ($dbdata as 
$data) {
 
  600            $skey = 
$data[
"user_id"] . 
':' . 
$data[
"cp_node_id"];
 
  602            if ($a_correct[$skey] != 
null) {
 
  603                $correct = $a_correct[$skey];
 
  606            if ($a_incorrect[$skey] != 
null) {
 
  607                $incorrect = $a_incorrect[$skey];
 
  610            if ($a_other[$skey] != 
null) {
 
  611                $other = $a_other[$skey];
 
  613            $all = $correct + $incorrect + $other;
 
  614            $data[
"lm_id"] = $obj_id;
 
  615            $data[
"lm_title"] = $lmTitle;
 
  616            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  617            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  618            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  619            $data[
"counter_i_correct"] = $correct;
 
  621                $data[
"counter_i_correct_percent"] = $correct * 100 / $all;
 
  623                $data[
"counter_i_correct_percent"] = 0;
 
  625            $data[
"counter_i_incorrect"] = $incorrect;
 
  627                $data[
"counter_i_incorrect_percent"] = $incorrect * 100 / $all;
 
  629                $data[
"counter_i_incorrect_percent"] = 0;
 
  631            $data[
"counter_i_other"] = $other;
 
  633                $data[
"counter_i_other_percent"] = $other * 100 / $all;
 
  635                $data[
"counter_i_other_percent"] = 0;
 
  637            $data[
"audio_captioning"] = 
"" . 
$data[
"audio_captioning"];
 
  638            $data[
"audio_level"] = 
"" . 
$data[
"audio_level"];
 
  639            $data[
"completion_status"] = 
"" . 
$data[
"completion_status"];
 
  640            $data[
"completion_threshold"] = 
"" . 
$data[
"completion_threshold"];
 
  642            $data[
"delivery_speed"] = 
"" . 
$data[
"delivery_speed"];
 
  645            $data[
"c_language"] = 
"" . 
$data[
"c_language"];
 
  646            $data[
"c_location"] = 
"" . str_replace(
'"', 
'', 
$data[
"c_location"]);
 
  648            $data[
"progress_measure"] = 
"" . 
$data[
"progress_measure"];
 
  653            $data[
"scaled_passing_score"] = 
"" . 
$data[
"scaled_passing_score"];
 
  654            $data[
"session_time"] = 
"" . 
$data[
"session_time"];
 
  655            $data[
"session_time_seconds"] = 
"";
 
  656            if (
$data[
"session_time"] != 
"") {
 
  659            $data[
"success_status"] = 
"" . 
$data[
"success_status"];
 
  660            $data[
"total_time"] = 
"" . 
$data[
"total_time"];
 
  661            $data[
"total_time_seconds"] = 
"";
 
  662            if (
$data[
"total_time"] != 
"") {
 
  666            $data[
"suspend_data"] = 
"" . 
$data[
"suspend_data"];
 
  667            $data[
"launch_data"] = 
"" . 
$data[
"launch_data"];
 
  677            $returnData[] = 
$data;
 
  689        $lng->loadLanguageModule(
"scormtrac");
 
  692        $a_interaction = array();
 
  693        $a_interactionDescription = array();
 
  695        $query = 
'SELECT cmi_node.cp_node_id, 
  696                                cmi_interaction.cmi_interaction_id,  
  698                                cmi_interaction.description  
  699                                FROM cmi_interaction, cmi_node  
  700                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  701                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  702                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id 
  705            $query .= 
'cmi_node.cp_node_id, cmi_node.user_id';
 
  707            $query .= 
'cmi_node.user_id, cmi_node.cp_node_id';
 
  709        $query .= 
', cmi_interaction.cmi_interaction_id, cmi_interaction.id';
 
  715        foreach ($dbdata as 
$data) {
 
  718            for (
$i = 0;
$i < count($a_interaction);
$i++) {
 
  719                if ($a_interaction[
$i] == 
$key) {
 
  723            if ($exist == 
false) {
 
  724                $a_interaction[] = 
$key;
 
  726            if ($a_interactionDescription[
$key] == 
null) {
 
  727                $a_interactionDescription[
$key] = 
"" . 
$data[
"description"];
 
  731        $a_cols = explode(
',', 
'lm_id,lm_title,cp_node_id,sco_marked_for_learning_progress,sco_title,' . $udh[
"cols"]);
 
  732        $a_true = explode(
',', $udh[
"default"] . 
",sco_title");
 
  733        for (
$i = 0;
$i < count($a_cols);
$i++) {
 
  734            $cols[$a_cols[
$i]] = array(
"txt" => 
$lng->txt($a_cols[
$i]),
"default" => 
false);
 
  736        for (
$i = 0;
$i < count($a_true);
$i++) {
 
  737            $cols[$a_true[
$i]][
"default"] = 
true;
 
  739        for (
$i = 0;
$i < count($a_interaction);
$i++) {
 
  745            $cols[
"interaction_value" . 
$i . 
" " . $a_interactionDescription[$a_interaction[
$i]]] = array(
"txt" => sprintf(
$lng->txt(
"interaction_value"), 
$i) . 
" " . $a_interactionDescription[$a_interaction[
$i]],
"default" => 
true);
 
  750    public function tracInteractionUserAnswers($a_user = array(), $a_sco = array(), $b_orderBySCO = 
false, $allowExportPrivacy = 
false, $obj_id, $lmTitle)
 
  754        $lng->loadLanguageModule(
"scormtrac");
 
  756        $returnData = array();
 
  762        $a_interaction = array();
 
  763        $a_interactionId = array();
 
  764        $a_interactionDescription = array();
 
  765        $a_interactionUser = array();
 
  767        $query = 
'SELECT cmi_node.user_id, cmi_node.cp_node_id, 
  768                                cmi_interaction.cmi_interaction_id,  
  770                                cmi_interaction.result,  
  771                                cmi_interaction.description  
  772                                FROM cmi_interaction, cmi_node  
  773                                WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
'  
  774                                AND ' . 
$ilDB->in(
'cmi_node.user_id', $a_user, 
false, 
'integer') . 
' 
  775                                AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id 
  778            $query .= 
'cmi_node.cp_node_id, cmi_node.user_id';
 
  780            $query .= 
'cmi_node.user_id, cmi_node.cp_node_id';
 
  782        $query .= 
', cmi_interaction.cmi_interaction_id, cmi_interaction.id';
 
  787        foreach ($dbdata as 
$data) {
 
  790            for (
$i = 0;
$i < count($a_interaction);
$i++) {
 
  791                if ($a_interaction[
$i] == 
$key) {
 
  798            if ($exist == 
false) {
 
  799                $a_interaction[] = 
$key;
 
  800                $a_interactionId[
$key] = 
"" . 
$data[
"id"];
 
  801                $a_interactionDescription[
$key] = 
"" . 
$data[
"description"];
 
  804            $a_interactionUser[
$key] = 
"" . 
$data[
"result"];
 
  809        $query = 
'SELECT user_id, cp_node_id ' 
  811            . 
'WHERE ' . 
$ilDB->in(
'cp_node_id', $a_sco, 
false, 
'integer') . 
' ' 
  812            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  816            $query .= 
'cp_node_id, user_id';
 
  818            $query .= 
'user_id, cp_node_id';
 
  824        foreach ($dbdata as 
$data) {
 
  825            for (
$i = 0;
$i < count($a_interaction);
$i++) {
 
  831                $intdesc = 
"interaction_value" . 
$i . 
" " . $a_interactionDescription[$a_interaction[
$i]];
 
  832                $data[$intdesc] = 
"";
 
  833                $ukey = $a_interaction[
$i] . 
':' . 
$data[
"user_id"];
 
  834                if ($a_interactionUser[$ukey] != 
null) {
 
  835                    $data[$intdesc] = $a_interactionUser[$ukey];
 
  838            $data[
"lm_id"] = $obj_id;
 
  839            $data[
"lm_title"] = $lmTitle;
 
  840            $data = array_merge(
$data, self::userDataArrayForExport(
$data[
"user_id"], $allowExportPrivacy));
 
  841            $data[
"sco_marked_for_learning_progress"] = $scoProgress[
$data[
"cp_node_id"]];
 
  842            $data[
"sco_title"] = $scoTitles[
$data[
"cp_node_id"]];
 
  843            $returnData[] = 
$data;
 
  855        $query = 
'SELECT count(distinct(cp_node.cp_node_id)) counter ' 
  856            . 
'FROM cp_node, cp_resource, cp_item ' 
  857            . 
'WHERE cp_item.cp_node_id = cp_node.cp_node_id ' 
  858            . 
'AND cp_item.resourceid = cp_resource.id AND scormtype = %s ' 
  859            . 
'AND nodename = %s AND cp_node.slm_id = %s';
 
  862            array(
'text', 
'text', 
'integer'),
 
  863            array(
'sco', 
'item', $obj_id)
 
  866            $scoCounter = 
$row[
'counter'];
 
  869        $u_startedSCO = array();
 
  870        $u_completedSCO = array();
 
  871        $u_passedSCO = array();
 
  872        for (
$i = 0; 
$i < count($a_user); 
$i++) {
 
  873            $u_startedSCO[$a_user[
$i]] = 0;
 
  874            $u_completedSCO[$a_user[
$i]] = 0;
 
  875            $u_passedSCO[$a_user[
$i]] = 0;
 
  878        $query = 
'SELECT user_id, count(*) counter ' 
  879            . 
'FROM cmi_node, cp_node ' 
  880            . 
'WHERE cmi_node.cp_node_id = cp_node.cp_node_id ' 
  881            . 
'AND cp_node.slm_id = %s ' 
  882            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  883            . 
'GROUP BY user_id';
 
  890            $u_startedSCO[
$data[
'user_id']] = 
$data[
'counter'];
 
  893        $query = 
'SELECT user_id, count(*) counter ' 
  894            . 
'FROM cmi_node, cp_node ' 
  895            . 
'WHERE cmi_node.cp_node_id = cp_node.cp_node_id ' 
  896            . 
'AND cp_node.slm_id = %s ' 
  897            . 
"AND cmi_node.completion_status = 'completed' " 
  898            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  899            . 
'GROUP BY user_id';
 
  906            $u_completedSCO[
$data[
'user_id']] = 
$data[
'counter'];
 
  909        $query = 
'SELECT user_id, count(*) counter ' 
  910            . 
'FROM cmi_node, cp_node ' 
  911            . 
'WHERE cmi_node.cp_node_id = cp_node.cp_node_id ' 
  912            . 
'AND cp_node.slm_id = %s ' 
  913            . 
"AND cmi_node.success_status = 'passed' " 
  914            . 
'AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer') . 
' ' 
  915            . 
'GROUP BY user_id';
 
  922            $u_passedSCO[
$data[
'user_id']] = 
$data[
'counter'];
 
  927        $query = 
'SELECT * FROM sahs_user WHERE obj_id = ' . 
$ilDB->quote($obj_id, 
'integer')
 
  928            . 
' AND ' . 
$ilDB->in(
'user_id', $a_user, 
false, 
'integer')
 
  929            . 
' ORDER BY user_id';
 
  935        return self::exportSelectedSuccessRows($a_user, $allowExportPrivacy, $dbdata, $scoCounter, $u_startedSCO, $u_completedSCO, $u_passedSCO, $obj_id, $lmTitle);
 
An exception for terminatinating execution or to throw for unit testing.
static _ISODurationToCentisec($str)
convert ISO 8601 Timeperiods to centiseconds ta
Class ilSCORM2004TrackingItems.
tracInteractionItem($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
tracInteractionUser($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
__construct()
Constructor.
static exportSelectedObjectivesColumns()
exportSelectedCore($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
scoTitlesForExportSelected($obj_id)
tracInteractionUserAnswers($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
exportObjGlobalToSystem($a_user=array(), $allowExportPrivacy=false, $obj_id, $lmTitle)
static tracInteractionItemColumns($b_orderBySCO, $b_allowExportPrivacy)
static tracInteractionUserColumns($b_orderBySCO, $b_allowExportPrivacy)
exportSelectedObjectives($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
static exportSelectedCoreColumns($b_orderBySCO, $b_allowExportPrivacy)
exportSelectedSuccess($a_user=array(), $allowExportPrivacy=false, $obj_id, $lmTitle)
static exportObjGlobalToSystemColumns()
static tracInteractionUserAnswersColumns($a_user=array(), $a_sco=array(), $b_orderBySCO, $b_allowExportPrivacy)
static exportSelectedInteractionsColumns()
exportSelectedInteractions($a_user=array(), $a_sco=array(), $b_orderBySCO=false, $allowExportPrivacy=false, $obj_id, $lmTitle)
Class ilSCORMTrackingItems.
exportSelectedSuccessRows($a_user=array(), $allowExportPrivacy=false, $dbdata=array(), $scoCounter, $u_startedSCO, $u_completedSCO, $u_passedSCO, $obj_id, $lmTitle)
static userDataHeaderForExport()
markedLearningStatusForExportSelected($a_scos, $obj_id)
foreach($_POST as $key=> $value) $res