Exemplo n.º 1
0
 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;
 }
Exemplo n.º 4
0
 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 "";
    }
Exemplo n.º 6
0
 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);
 }