function insertTrackData($a_lval, $a_rval, $a_obj_id) { require_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php"; ilObjSCORMTracking::_insertTrackData($this->getId(), $a_lval, $a_rval, $a_obj_id); }
/** * Export selected user tracking data * @global ilDB $ilDB * @global ilObjUser $ilUser * @param bool $a_all * @param array $a_users */ public function exportSelected($a_all, $a_users = array()) { global $ilDB, $ilUser, $ilSetting; $inst_id = $ilSetting->get('inst_id', 0); // Get all scos $scos = array(); //get all SCO's of this object $query = 'SELECT scorm_object.obj_id, scorm_object.title, ' . 'scorm_object.c_type, scorm_object.slm_id, scorm_object.obj_id scoid ' . 'FROM scorm_object, sc_item, sc_resource ' . 'WHERE (scorm_object.slm_id = %s ' . 'AND scorm_object.obj_id = sc_item.obj_id ' . 'AND sc_item.identifierref = sc_resource.import_id ' . 'AND sc_resource.scormtype = %s) ' . 'GROUP BY scorm_object.obj_id, scorm_object.title, scorm_object.c_type, ' . 'scorm_object.slm_id, scorm_object.obj_id '; $res = $ilDB->queryF($query, array('integer', 'text'), array($this->getId(), 'sco')); while ($row = $ilDB->fetchAssoc($res)) { $scos[] = $row['scoid']; } $users = array(); if ($a_all) { $query = 'SELECT user_id FROM scorm_tracking ' . 'WHERE obj_id = ' . $ilDB->quote($this->getId(), 'integer') . ' ' . 'GROUP BY user_id'; $res = $ilDB->query($query); while ($row = $ilDB->fetchAssoc($res)) { $users[] = $row['user_id']; } } else { $users = $a_users; } // get all completed include_once './Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php'; $completed = ilObjSCORMTracking::_getCompleted($scos, $this->getId()); $last = ilObjSCORMTracking::lookupLastAccessTimes($this->getId()); include_once './Services/Utilities/classes/class.ilCSVWriter.php'; $csv = new ilCSVWriter(); $csv->setSeparator(';'); foreach (array('Department', 'Login', 'Lastname', 'Firstname', 'Email', 'Date', 'Status') as $col) { $csv->addColumn($col); } // Read user data $query = 'SELECT usr_id,login,firstname,lastname,department,email ' . 'FROM usr_data ' . 'WHERE ' . $ilDB->in('usr_id', $users, false, 'integer'); $res = $ilDB->query($query); while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { $csv->addRow(); $csv->addColumn((string) $row->department); $csv->addColumn((string) $row->login); $csv->addColumn((string) $row->lastname); $csv->addColumn((string) $row->firstname); $csv->addColumn((string) $row->email); if (isset($last[$row->usr_id])) { $dt = new ilDateTime($last[$row->usr_id], IL_CAL_DATETIME); $csv->addColumn((string) $dt->get(IL_CAL_FKT_DATE, 'd.m.Y')); } else { $csv->addColumn(''); } $csv->addColumn(in_array($row->usr_id, $completed) ? 1 : 0); } ilUtil::deliverData($csv->getCSVString(), 'scorm_tracking_' . $this->getRefId() . '_' . time() . '.csv'); }
/** * Get participant ids for given object * * @param int $a_ref_id * @return array */ public static function getParticipantsForObject($a_ref_id) { global $tree; $obj_id = ilObject::_lookupObjectId($a_ref_id); $obj_type = ilObject::_lookupType($obj_id); // try to get participants from (parent) course/group switch ($obj_type) { case "crs": include_once "Modules/Course/classes/class.ilCourseParticipants.php"; $member_obj = ilCourseParticipants::_getInstanceByObjId($obj_id); return $member_obj->getMembers(); case "grp": include_once "Modules/Group/classes/class.ilGroupParticipants.php"; $member_obj = ilGroupParticipants::_getInstanceByObjId($obj_id); return $member_obj->getMembers(); default: // walk path to find course or group object and use members of that object $path = $tree->getPathId($a_ref_id); array_pop($path); foreach (array_reverse($path) as $path_ref_id) { $type = ilObject::_lookupType($path_ref_id, true); if ($type == "crs" || $type == "grp") { return self::getParticipantsForObject($path_ref_id); } } break; } $a_users = null; // no participants possible: use tracking/object data where possible switch ($obj_type) { case "sahs": include_once "./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php"; $subtype = ilObjSAHSLearningModule::_lookupSubType($obj_id); if ($subtype == "scorm2004") { // based on cmi_node/cp_node, used for scorm tracking data views include_once "./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php"; $mod = new ilObjSCORM2004LearningModule($obj_id, false); $all = $mod->getTrackedUsers(""); if ($all) { $a_users = array(); foreach ($all as $item) { $a_users[] = $item["user_id"]; } } } else { include_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php"; $a_users = ilObjSCORMTracking::_getTrackedUsers($obj_id); } break; case "exc": include_once "./Modules/Exercise/classes/class.ilExerciseMembers.php"; include_once "./Modules/Exercise/classes/class.ilObjExercise.php"; $exc = new ilObjExercise($obj_id, false); $members = new ilExerciseMembers($exc); $a_users = $members->getMembers(); break; case "tst": include_once "./Services/Tracking/classes/class.ilLPStatusTestFinished.php"; $a_users = ilLPStatusTestFinished::getParticipants($obj_id); break; default: // no sensible data: return null break; } return $a_users; }
function refreshStatus($a_obj_id) { parent::refreshStatus($a_obj_id); // this is restricted to SCOs in the current collection include_once "./Services/Tracking/classes/class.ilLPStatusWrapper.php"; $in_progress = ilLPStatusWrapper::_getInProgress($a_obj_id); $completed = ilLPStatusWrapper::_getCompleted($a_obj_id); $failed = ilLPStatusWrapper::_getFailed($a_obj_id); $all_active_users = array_unique(array_merge($in_progress, $completed, $failed)); // get all tracked users regardless of SCOs include_once './Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php'; $subtype = ilObjSAHSLearningModule::_lookupSubType($a_obj_id); if ($subtype != "scorm2004") { include_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php"; $all_tracked_users = ilObjSCORMTracking::_getTrackedUsers($a_obj_id); } else { include_once "./Modules/Scorm2004/classes/class.ilSCORM2004Tracking.php"; $all_tracked_users = ilSCORM2004Tracking::_getTrackedUsers($a_obj_id); } $not_attempted_users = array_diff($all_tracked_users, $all_active_users); unset($all_tracked_users); unset($all_active_users); // reset all users which have no data for the current SCOs if ($not_attempted_users) { foreach ($not_attempted_users as $usr_id) { // this will update any (parent) collections if necessary ilLPStatus::writeStatus($a_obj_id, $usr_id, self::LP_STATUS_NOT_ATTEMPTED_NUM, 0); } } }
function scorm12PlayerUnload() { global $ilUser, $ilDB; $user_id = $ilUser->getID(); $ref_id = $_GET["ref_id"]; $obj_id = ilObject::_lookupObjId($ref_id); if ($obj_id <= 1) { $GLOBALS['ilLog']->write(__METHOD__ . ' no valid obj_id'); } else { $data = $_POST['last_visited']; // $GLOBALS['ilLog']->write(__METHOD__.' last_visited: '.$data); if ($data) { $set = $ilDB->queryF(' SELECT rvalue FROM scorm_tracking WHERE user_id = %s AND sco_id = %s AND lvalue = %s AND obj_id = %s', array('integer', 'integer', 'text', 'integer'), array($user_id, 0, 'last_visited', $obj_id)); if ($rec = $ilDB->fetchAssoc($set)) { $ilDB->update('scorm_tracking', array('rvalue' => array('clob', $data), 'c_timestamp' => array('timestamp', ilUtil::now())), array('user_id' => array('integer', $user_id), 'sco_id' => array('integer', 0), 'lvalue' => array('text', 'last_visited'), 'obj_id' => array('integer', $obj_id))); } else { $ilDB->insert('scorm_tracking', array('obj_id' => array('integer', $obj_id), 'user_id' => array('integer', $user_id), 'sco_id' => array('integer', 0), 'lvalue' => array('text', 'last_visited'), 'rvalue' => array('clob', $data), 'c_timestamp' => array('timestamp', ilUtil::now()))); } } // update time and numbers of attempts in change event //NOTE: here it is correct (not count of commit with changed values); be careful to performance issues ilObjSCORMTracking::_syncReadEvent($obj_id, $user_id, "sahs", $ref_id); } header('Content-Type: text/plain; charset=UTF-8'); print ""; }
function sop2il() { // sleep(5); global $ilDB, $ilUser; $in = file_get_contents("php://input"); $GLOBALS['ilLog']->write($in); $ret = array('msg' => array(), 'err' => array()); if (!$in || $in == "") { $ret['err'][] = "no post data recieved"; print json_encode($ret); exit; } $userId = $ilUser->getID(); $result = true; if ($this->type == 'scorm2004') { $lm_set = $ilDB->queryF('SELECT default_lesson_mode, interactions, objectives, comments FROM sahs_lm WHERE id = %s', array('integer'), array($this->obj_id)); while ($lm_rec = $ilDB->fetchAssoc($lm_set)) { $defaultLessonMode = $lm_rec["default_lesson_mode"]; $interactions = ilUtil::yn2tf($lm_rec["interactions"]); $objectives = ilUtil::yn2tf($lm_rec["objectives"]); $comments = ilUtil::yn2tf($lm_rec["comments"]); } include_once './Modules/Scorm2004/classes/class.ilSCORM2004StoreData.php'; $data = json_decode($in); $GLOBALS['ilLog']->write('cmi_count=' . count($data->cmi)); for ($i = 0; $i < count($data->cmi); $i++) { if ($result == true) { //$a_r=array(); $cdata = $data->cmi[$i]; $a_r = ilSCORM2004StoreData::setCMIData($userId, $this->obj_id, $data->cmi[$i], $comments, $interactions, $objectives); if (!is_array($a_r)) { $result = false; } } } if ($result == true) { $result = ilSCORM2004StoreData::syncGlobalStatus($userId, $this->obj_id, $data, $data->now_global_status); } } else { include_once "./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php"; $data = json_decode($in); $result = ilObjSCORMTracking::storeJsApiCmi($userId, $this->obj_id, $data); if ($result == true) { $result = ilObjSCORMTracking::syncGlobalStatus($userId, $this->obj_id, $data, $data->now_global_status); } } if ($result == true) { $result = self::scormPlayerUnloadForSOP2il($data); } if ($result == false) { $ret['err'][] = "invalid post data recieved"; } else { $ret['msg'][] = "post data recieved"; } header('Content-Type: text/plain; charset=UTF-8'); print json_encode($ret); }