/** * Get all object-based tracking data for user and parent object * * @param int $a_user_id * @param int $a_parent_obj_id * @param int $a_parent_ref_id * @param string $a_order_field * @param string $a_order_dir * @param int $a_offset * @param int $a_limit * @param array $a_filters * @param array $a_additional_fields * @param bool $use_collection * @return array cnt, set */ static function getObjectsDataForUser($a_user_id, $a_parent_obj_id, $a_parent_ref_id, $a_order_field = "", $a_order_dir = "", $a_offset = 0, $a_limit = 9999, array $a_filters = NULL, array $a_additional_fields = NULL, $use_collection = true) { global $ilDB; $fields = array("object_data.obj_id", "title", "type"); self::buildColumns($fields, $a_additional_fields); $objects = self::getObjectIds($a_parent_obj_id, $a_parent_ref_id, $use_collection, true, array($a_user_id)); $query = " FROM object_data LEFT JOIN read_event ON (object_data.obj_id = read_event.obj_id AND" . " read_event.usr_id = " . $ilDB->quote($a_user_id, "integer") . ")" . " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = " . $ilDB->quote($a_user_id, "integer") . " AND" . " ut_lp_marks.obj_id = object_data.obj_id)" . " WHERE " . $ilDB->in("object_data.obj_id", $objects["object_ids"], false, "integer") . self::buildFilters(array(), $a_filters); $queries = array(); $queries[] = array("fields" => $fields, "query" => $query); // objectives data if ($objects["objectives_parent_id"]) { $objective_fields = array("crs_objectives.objective_id AS obj_id", "title", $ilDB->quote("lobj", "text") . " as type"); if (is_array($a_additional_fields)) { foreach ($a_additional_fields as $field) { if ($field != "status") { $objective_fields[] = "NULL AS " . $field; } else { include_once "Services/Tracking/classes/class.ilLPStatus.php"; $objective_fields[] = "CASE WHEN status IS NOT NULL THEN " . LP_STATUS_COMPLETED_NUM . " ELSE NULL END AS status"; } } } $where = array(); $where[] = "crs_objectives.crs_id = " . $ilDB->quote($objects["objectives_parent_id"], "integer"); $objectives_query = " FROM crs_objectives" . " LEFT JOIN crs_objective_status ON (crs_objectives.objective_id = crs_objective_status.objective_id" . " AND crs_objective_status.user_id = " . $ilDB->quote($a_user_id, "integer") . ")" . self::buildFilters($where, $a_filters); $queries[] = array("fields" => $objective_fields, "query" => $objectives_query, "count" => "crs_objectives.objective_id"); } if (!in_array($a_order_field, $fields)) { $a_order_field = "title"; } $result = self::executeQueries($queries, $a_order_field, $a_order_dir, $a_offset, $a_limit); if ($result["cnt"]) { // session data $sessions = self::getSessionData($a_user_id, $objects["object_ids"]); foreach ($result["set"] as $idx => $item) { if ($item["type"] == "sess") { $session = $sessions[$item["obj_id"]]; $result["set"][$idx]["title"] = $session["title"]; $result["set"][$idx]["sort_title"] = $session["e_start"]; // $result["set"][$idx]["status"] = (int)$session["status"]; } $result["set"][$idx]["ref_id"] = $objects["ref_ids"][$item["obj_id"]]; } // scos data (:TODO: will not be part of offset/limit) if ($objects["scorm"]) { include_once "./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php"; $subtype = ilObjSAHSLearningModule::_lookupSubType($a_parent_obj_id); if ($subtype == "scorm2004") { include_once "./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php"; $sobj = new ilObjSCORM2004LearningModule($a_parent_ref_id, true); $scos_tracking = $sobj->getTrackingDataAgg($a_user_id, true); } else { include_once "./Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php"; $sobj = new ilObjSCORMLearningModule($a_parent_ref_id, true); $scos_tracking = array(); foreach ($sobj->getTrackingDataAgg($a_user_id) as $item) { // format: hhhh:mm:ss ?! if ($item["time"]) { $time = explode(":", $item["time"]); $item["time"] = $time[0] * 60 * 60 + $time[1] * 60 + $time[2]; } $scos_tracking[$item["sco_id"]] = array("session_time" => $item["time"]); } } foreach ($objects["scorm"]["scos"] as $sco) { $row = array("title" => $objects["scorm"]["scos_title"][$sco], "type" => "sco"); $status = LP_STATUS_NOT_ATTEMPTED_NUM; if (in_array($a_user_id, $objects["scorm"]["completed"][$sco])) { $status = LP_STATUS_COMPLETED_NUM; } else { if (in_array($a_user_id, $objects["scorm"]["failed"][$sco])) { $status = LP_STATUS_FAILED_NUM; } else { if (in_array($a_user_id, $objects["scorm"]["in_progress"][$sco])) { $status = LP_STATUS_IN_PROGRESS_NUM; } } } $row["status"] = $status; // add available tracking data if (isset($scos_tracking[$sco])) { if (isset($scos_tracking[$sco]["last_access"])) { $date = new ilDateTime($scos_tracking[$sco]["last_access"], IL_CAL_DATETIME); $row["last_access"] = $date->get(IL_CAL_UNIX); } $row["spent_seconds"] = $scos_tracking[$sco]["session_time"]; } $result["set"][] = $row; $result["cnt"]++; } } } return $result; }