protected function resetCustomLPDataForUserIds(array $a_user_ids, $a_recursive = true) { /* @var ilObjTest $testOBJ */ require_once 'Services/Object/classes/class.ilObjectFactory.php'; $testOBJ = ilObjectFactory::getInstanceByObjId($this->obj_id); $testOBJ->removeTestResults($a_user_ids); // :TODO: there has to be a better way $test_ref_id = (int) $_REQUEST["ref_id"]; if ($test_ref_id) { require_once "Modules/Course/classes/Objectives/class.ilLOSettings.php"; $course_obj_id = ilLOSettings::isObjectiveTest($test_ref_id); if ($course_obj_id) { // is test initial and/or qualified? $lo_settings = ilLOSettings::getInstanceByObjId($course_obj_id); $is_i = $lo_settings->getInitialTest() == $test_ref_id; $is_q = $lo_settings->getQualifiedTest() == $test_ref_id; // remove objective results data require_once "Modules/Course/classes/Objectives/class.ilLOUserResults.php"; ilLOUserResults::deleteResultsFromLP($course_obj_id, $a_user_ids, $is_i, $is_q); // refresh LP - see ilLPStatusWrapper::_updateStatus() require_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; $lp_status = ilLPStatusFactory::_getInstance($course_obj_id); if (strtolower(get_class($lp_status)) != "illpstatus") { foreach ($a_user_ids as $user_id) { $lp_status->_updateStatus($course_obj_id, $user_id); } } } } }
/** * This function checks whether the status for a given number of users is dirty and must be * recalculated. "Missing" records are not inserted! * * @param * @return */ static function checkStatusForObject($a_obj_id, $a_users = false) { global $ilDB; //@todo: there maybe the need to add extra handling for sessions here, since the // "in progress" status is time dependent here. On the other hand, if they registered // to the session, they already accessed the course and should have a "in progress" // anyway. But the status on the session itself may not be correct. $sql = "SELECT usr_id FROM ut_lp_marks WHERE " . " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " . " status_dirty = " . $ilDB->quote(1, "integer"); if (is_array($a_users) && count($a_users) > 0) { $sql .= " AND " . $ilDB->in("usr_id", $a_users, false, "integer"); } $set = $ilDB->query($sql); $dirty = false; if ($rec = $ilDB->fetchAssoc($set)) { $dirty = true; } // check if any records are missing $missing = false; if (!$dirty && is_array($a_users) && count($a_users) > 0) { $set = $ilDB->query("SELECT count(usr_id) cnt FROM ut_lp_marks WHERE " . " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " . $ilDB->in("usr_id", $a_users, false, "integer")); $r = $ilDB->fetchAssoc($set); if ($r["cnt"] < count($a_users)) { $missing = true; } } // refresh status, if records are dirty or missing if ($dirty || $missing) { require_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; // #13330 $trac_obj = ilLPStatusFactory::_getInstance($a_obj_id); $trac_obj->refreshStatus($a_obj_id, $a_users); } }
/** * Determine status * * @param * @return */ public static function _determineStatus($a_obj_id, $a_usr_id) { if (isset(self::$status_cache[$a_obj_id][$a_usr_id])) { return self::$status_cache[$a_obj_id][$a_usr_id]; } $trac_obj = ilLPStatusFactory::_getInstance($a_obj_id); $st = $trac_obj->determineStatus($a_obj_id, $a_usr_id); self::$status_cache[$a_obj_id][$a_usr_id] = $st; return $st; }
/** * Get (sub)objects for given object, also handles learning objectives (course only) * * @param int $a_parent_obj_id * @param int $a_parent_ref_id * @param int $use_collection * @param bool $a_refresh_status * @param array $a_user_ids * @return array object_ids, objectives_parent_id */ public static function getObjectIds($a_parent_obj_id, $a_parent_ref_id = false, $use_collection = true, $a_refresh_status = true, $a_user_ids = null) { include_once "Services/Object/classes/class.ilObjectLP.php"; $object_ids = array($a_parent_obj_id); $ref_ids = array($a_parent_obj_id => $a_parent_ref_id); $objectives_parent_id = $scorm = $subitems = false; $olp = ilObjectLP::getInstance($a_parent_obj_id); $mode = $olp->getCurrentMode(); switch ($mode) { // what about LP_MODE_SCORM_PACKAGE ? case ilLPObjSettings::LP_MODE_SCORM: include_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; $status_scorm = ilLPStatusFactory::_getInstance($a_parent_obj_id, ilLPObjSettings::LP_MODE_SCORM); $scorm = $status_scorm->_getStatusInfo($a_parent_obj_id); break; case ilLPObjSettings::LP_MODE_OBJECTIVES: if (ilObject::_lookupType($a_parent_obj_id) == "crs") { $objectives_parent_id = $a_parent_obj_id; } break; case ilLPObjSettings::LP_MODE_COLLECTION_MANUAL: include_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; $status_coll_man = ilLPStatusFactory::_getInstance($a_parent_obj_id, ilLPObjSettings::LP_MODE_COLLECTION_MANUAL); $subitems = $status_coll_man->_getStatusInfo($a_parent_obj_id); break; case ilLPObjSettings::LP_MODE_COLLECTION_TLT: include_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; $status_coll_tlt = ilLPStatusFactory::_getInstance($a_parent_obj_id, ilLPObjSettings::LP_MODE_COLLECTION_TLT); $subitems = $status_coll_tlt->_getStatusInfo($a_parent_obj_id); break; default: // lp collection if ($use_collection) { $collection = $olp->getCollectionInstance(); if ($collection) { foreach ($collection->getItems() as $child_ref_id) { $child_id = ilObject::_lookupObjId($child_ref_id); $object_ids[] = $child_id; $ref_ids[$child_id] = $child_ref_id; } } } else { self::getSubTree($a_parent_ref_id, $object_ids, $ref_ids); $object_ids = array_unique($object_ids); } foreach ($object_ids as $idx => $object_id) { if (!$object_id) { unset($object_ids[$idx]); } } break; } if ($a_refresh_status) { self::refreshObjectsStatus($object_ids, $a_user_ids); } return array("object_ids" => $object_ids, "ref_ids" => $ref_ids, "objectives_parent_id" => $objectives_parent_id, "scorm" => $scorm, "subitems" => $subitems); }