コード例 #1
0
 /**
  * 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;
 }