/** * should be avoided; store value to increase performance for further requests */ function getSumTotalTimeSecondsFromScos($a_obj_id, $a_user_id, $a_write = false) { global $ilDB, $ilLog; $scos = array(); $val_set = $ilDB->queryF('SELECT cp_node_id FROM cp_node WHERE nodename = %s AND cp_node.slm_id = %s', array('text', 'integer'), array('item', $a_obj_id)); while ($val_rec = $ilDB->fetchAssoc($val_set)) { array_push($scos, $val_rec['cp_node_id']); } $time = 0; foreach ($scos as $sco) { include_once "./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php"; $data_set = $ilDB->queryF(' SELECT total_time FROM cmi_node WHERE cp_node_id = %s AND user_id = %s', array('integer', 'integer'), array($sco, $a_user_id)); while ($data_rec = $ilDB->fetchAssoc($data_set)) { $sec = ilObjSCORM2004LearningModule::_ISODurationToCentisec($data_rec["total_time"]) / 100; } $time += (int) $sec; $sec = 0; //$ilLog->write("++".$time); } if ($a_write && $time > 0) { $ilDB->queryF('UPDATE sahs_user SET sco_total_time_sec=%s WHERE obj_id = %s AND user_id = %s', array('integer', 'integer', 'integer'), array($time, $a_obj_id, $a_user_id)); } return $time; }
/** * Synch read event table * * @param * @return */ function _syncReadEvent($a_obj_id, $a_user_id, $a_type, $a_ref_id) { global $ilDB, $ilLog; // get attempts $val_set = $ilDB->queryF(' SELECT rvalue FROM cmi_custom WHERE user_id = %s AND sco_id = %s AND lvalue = %s AND obj_id = %s', array('integer', 'integer', 'text', 'integer'), array($a_user_id, 0, 'package_attempts', $a_obj_id)); $val_rec = $ilDB->fetchAssoc($val_set); $val_rec["rvalue"] = str_replace("\r\n", "\n", $val_rec["rvalue"]); if ($val_rec["rvalue"] == null) { $val_rec["rvalue"] = ""; } $attempts = $val_rec["rvalue"]; // time $scos = array(); $val_set = $ilDB->queryF('SELECT cp_node_id FROM cp_node WHERE nodename = %s AND cp_node.slm_id = %s', array('text', 'integer'), array('item', $a_obj_id)); while ($val_rec = $ilDB->fetchAssoc($val_set)) { array_push($scos, $val_rec['cp_node_id']); } $time = 0; foreach ($scos as $sco) { include_once "./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php"; $data_set = $ilDB->queryF(' SELECT total_time FROM cmi_node WHERE cp_node_id = %s AND user_id = %s', array('integer', 'integer'), array($sco, $a_user_id)); while ($data_rec = $ilDB->fetchAssoc($data_set)) { // see bug report 7246 // $sec = ilObjSCORM2004LearningModule::_ISODurationToCentisec($data_rec["session_time"]) / 100; $sec = ilObjSCORM2004LearningModule::_ISODurationToCentisec($data_rec["total_time"]) / 100; } $time += (int) $sec; $sec = 0; //$ilLog->write("++".$time); } include_once "./Services/Tracking/classes/class.ilChangeEvent.php"; ilChangeEvent::_recordReadEvent($a_type, $a_ref_id, $a_obj_id, $a_user_id, false, $attempts, $time); }
function tracInteractionUser($a_user = array(), $a_sco = array(), $b_orderBySCO = false, $allowExportPrivacy = false) { global $ilDB, $lng; $lng->loadLanguageModule("scormtrac"); $returnData = array(); $scoTitles = self::scoTitlesForExportSelected(); $scoProgress = self::markedLearningStatusForExportSelected($scoTitles); $a_correct = array(); $a_incorrect = array(); $a_other = array(); $query = 'SELECT cmi_node.user_id, cmi_node.cp_node_id, count(*) as counter FROM cmi_interaction, cmi_node WHERE ' . $ilDB->in('cp_node_id', $a_sco, false, 'integer') . ' AND ' . $ilDB->in('cmi_node.user_id', $a_user, false, 'integer') . ' AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id AND cmi_interaction.result = %s GROUP BY cmi_node.user_id,cmi_node.cp_node_id'; $res = $ilDB->queryF($query, array('text'), array('correct')); while ($row = $ilDB->fetchAssoc($res)) { $a_correct[$row['user_id'] . ':' . $row['cp_node_id']] = $row['counter']; } $res = $ilDB->queryF($query, array('text'), array('incorrect')); while ($row = $ilDB->fetchAssoc($res)) { $a_incorrect[$row['user_id'] . ':' . $row['cp_node_id']] = $row['counter']; } $query = 'SELECT cmi_node.user_id, cmi_node.cp_node_id, count(*) as counter FROM cmi_interaction, cmi_node WHERE ' . $ilDB->in('cp_node_id', $a_sco, false, 'integer') . ' AND ' . $ilDB->in('cmi_node.user_id', $a_user, false, 'integer') . ' AND cmi_node.cmi_node_id = cmi_interaction.cmi_node_id AND cmi_interaction.result <> %s AND cmi_interaction.result <> %s GROUP BY cmi_node.user_id,cmi_node.cp_node_id'; $res = $ilDB->queryF($query, array('text', 'text'), array('correct', 'incorrect')); while ($row = $ilDB->fetchAssoc($res)) { $a_other[$row['user_id'] . ':' . $row['cp_node_id']] = $row['counter']; } $dbdata = array(); $query = 'SELECT user_id, cp_node_id, ' . 'audio_captioning, audio_level, completion_status, completion_threshold, credit, delivery_speed, ' . 'c_entry, c_exit, c_language, location as c_location, c_mode, progress_measure, c_max, c_min, c_raw, scaled, ' . 'scaled_passing_score, session_time, success_status, total_time, c_timestamp, suspend_data, launch_data ' . 'FROM cmi_node ' . 'WHERE ' . $ilDB->in('cp_node_id', $a_sco, false, 'integer') . ' ' . 'AND ' . $ilDB->in('user_id', $a_user, false, 'integer') . ' ' . 'ORDER BY '; if ($b_orderBySCO) { $query .= 'cp_node_id, user_id'; } else { $query .= 'user_id, cp_node_id'; } $res = $ilDB->query($query); while ($row = $ilDB->fetchAssoc($res)) { $dbdata[] = $row; } foreach ($dbdata as $data) { $skey = $data["user_id"] . ':' . $data["cp_node_id"]; $correct = 0; if ($a_correct[$skey] != null) { $correct = $a_correct[$skey]; } $incorrect = 0; if ($a_incorrect[$skey] != null) { $incorrect = $a_incorrect[$skey]; } $other = 0; if ($a_other[$skey] != null) { $other = $a_other[$skey]; } $all = $correct + $incorrect + $other; $data["lm_id"] = $this->getObjId(); $data["lm_title"] = $this->lmTitle; $data = array_merge($data, self::userDataArrayForExport($data["user_id"], $allowExportPrivacy)); $data["sco_marked_for_learning_progress"] = $scoProgress[$data["cp_node_id"]]; $data["sco_title"] = $scoTitles[$data["cp_node_id"]]; $data["counter_i_correct"] = $correct; if ($all > 0) { $data["counter_i_correct_percent"] = $correct * 100 / $all; } else { $data["counter_i_correct_percent"] = 0; } $data["counter_i_incorrect"] = $incorrect; if ($all > 0) { $data["counter_i_incorrect_percent"] = $incorrect * 100 / $all; } else { $data["counter_i_incorrect_percent"] = 0; } $data["counter_i_other"] = $other; if ($all > 0) { $data["counter_i_other_percent"] = $other * 100 / $all; } else { $data["counter_i_other_percent"] = 0; } $data["audio_captioning"] = "" . $data["audio_captioning"]; $data["audio_level"] = "" . $data["audio_level"]; $data["completion_status"] = "" . $data["completion_status"]; $data["completion_threshold"] = "" . $data["completion_threshold"]; $data["credit"] = "" . $data["credit"]; $data["delivery_speed"] = "" . $data["delivery_speed"]; $data["c_entry"] = "" . $data["c_entry"]; $data["c_exit"] = "" . $data["c_exit"]; $data["c_language"] = "" . $data["c_language"]; $data["c_location"] = "" . str_replace('"', '', $data["c_location"]); $data["c_mode"] = "" . $data["c_mode"]; $data["progress_measure"] = "" . $data["progress_measure"]; $data["c_max"] = "" . $data["c_max"]; $data["c_min"] = "" . $data["c_min"]; $data["c_raw"] = "" . $data["c_raw"]; $data["scaled"] = "" . $data["scaled"]; //$data["scaled"]*100) $data["scaled_passing_score"] = "" . $data["scaled_passing_score"]; $data["session_time"] = "" . $data["session_time"]; $data["session_time_seconds"] = ""; if ($data["session_time"] != "") { $data["session_time_seconds"] = round(ilObjSCORM2004LearningModule::_ISODurationToCentisec($data["session_time"]) / 100); } $data["success_status"] = "" . $data["success_status"]; $data["total_time"] = "" . $data["total_time"]; $data["total_time_seconds"] = ""; if ($data["total_time"] != "") { $data["total_time_seconds"] = round(ilObjSCORM2004LearningModule::_ISODurationToCentisec($data["total_time"]) / 100); } $data["c_timestamp"] = $data["c_timestamp"]; //ilDatePresentation::formatDate(new ilDateTime($data["c_timestamp"],IL_CAL_UNIX)); $data["suspend_data"] = "" . $data["suspend_data"]; $data["launch_data"] = "" . $data["launch_data"]; // if ($data["success_status"]!="" && $data["success_status"]!="unknown") { // $status = $data["success_status"]; // } else { // if ($data["completion_status"]=="") { // $status="unknown"; // } else { // $status = $data["completion_status"]; // } // } $returnData[] = $data; } return $returnData; }