20 $obj_ids = array_keys($obj_refs);
23 include_once
"Services/Object/classes/class.ilObjectLP.php";
24 include_once
"Services/Tracking/classes/class.ilLPStatus.php";
27 include_once
'Modules/Course/classes/class.ilObjCourse.php';
28 $view_modes = array();
29 $query =
"SELECT obj_id, view_mode FROM crs_settings".
30 " WHERE ".$ilDB->in(
"obj_id", $obj_ids ,
false,
"integer");
31 $set = $ilDB->query(
$query);
32 while($rec = $ilDB->fetchAssoc($set))
34 $view_modes[(int)$rec[
"obj_id"]] = (
int)$rec[
"view_mode"];
39 $query =
"SELECT object_data.obj_id, title, CASE WHEN status IS NULL THEN ".ilLPStatus::LP_STATUS_NOT_ATTEMPTED_NUM.
" ELSE status END AS status,".
40 " status_changed, percentage, read_count+childs_read_count AS read_count, spent_seconds+childs_spent_seconds AS spent_seconds,".
41 " u_mode, type, visits, mark, u_comment".
43 " LEFT JOIN ut_lp_settings ON (ut_lp_settings.obj_id = object_data.obj_id)".
44 " LEFT JOIN read_event ON (read_event.obj_id = object_data.obj_id AND read_event.usr_id = ".$ilDB->quote($a_user_id,
"integer").
")".
45 " LEFT JOIN ut_lp_marks ON (ut_lp_marks.obj_id = object_data.obj_id AND ut_lp_marks.usr_id = ".$ilDB->quote($a_user_id,
"integer").
")".
47 " WHERE ".$ilDB->in(
"object_data.obj_id", $obj_ids,
false,
"integer").
49 $set = $ilDB->query(
$query);
51 while($rec = $ilDB->fetchAssoc($set))
53 $rec[
"comment"] = $rec[
"u_comment"];
54 unset($rec[
"u_comment"]);
56 $rec[
"ref_ids"] = $obj_refs[(int)$rec[
"obj_id"]];
57 $rec[
"status"] = (int)$rec[
"status"];
58 $rec[
"percentage"] = (int)$rec[
"percentage"];
59 $rec[
"read_count"] = (int)$rec[
"read_count"];
60 $rec[
"spent_seconds"] = (int)$rec[
"spent_seconds"];
61 $rec[
"u_mode"] = (int)$rec[
"u_mode"];
63 if($rec[
"type"] ==
"sess")
65 $session = $sessions[$rec[
"obj_id"]];
66 $rec[
"title"] = $session[
"title"];
75 else if(!$rec[
"u_mode"])
78 $rec[
"u_mode"] = $olp->getCurrentMode();
95 include_once
"Modules/Course/classes/Objectives/class.ilLOUserResults.php";
98 $query =
"SELECT crs_id, crs_objectives.objective_id AS obj_id, title,".$ilDB->quote(
"lobj",
"text").
" AS type".
99 " FROM crs_objectives".
100 " WHERE ".$ilDB->in(
"crs_objectives.objective_id", $a_objective_ids,
false,
"integer").
101 " AND active = ".$ilDB->quote(1,
"integer").
102 " ORDER BY position";
103 $set = $ilDB->query(
$query);
105 while($rec = $ilDB->fetchAssoc($set))
107 if(array_key_exists($rec[
"obj_id"], $lo_lp_status))
109 $rec[
"status"] = $lo_lp_status[$rec[
"obj_id"]];
126 $scores_raw = $scores = array();
127 include_once
'./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php';
134 include_once
'./Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php';
136 $scores_raw = $module->getTrackingDataAgg($a_user_id);
140 include_once
'./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php';
142 $scores_raw = $module->getTrackingDataAgg($a_user_id);
147 foreach($scores_raw as $item)
149 $scores[$item[
"sco_id"]] = $item[
"score"];
155 include_once
'Services/Tracking/classes/class.ilLPStatusWrapper.php';
159 foreach($a_sco_ids as $sco_id)
162 if(in_array($a_user_id, $status_info[
"failed"][$sco_id]))
166 elseif(in_array($a_user_id, $status_info[
"completed"][$sco_id]))
170 elseif(in_array($a_user_id, $status_info[
"in_progress"][$sco_id]))
179 $items[$sco_id] = array(
180 "title" => $status_info[
"scos_title"][$sco_id],
183 "score" => (
int)$scores[$sco_id]
197 include_once
'./Services/Object/classes/class.ilObjectLP.php';
199 $collection = $olp->getCollectionInstance();
204 $item_data = $collection->getPossibleItems(
$ref_id);
212 include_once
'Services/Tracking/classes/class.ilLPStatusWrapper.php';
216 foreach($a_item_ids as $item_id)
218 if(!isset($item_data[$item_id]))
223 if(in_array($a_user_id, $status_info[
"completed"][$item_id]))
227 elseif(in_array($a_user_id, $status_info[
"in_progress"][$item_id]))
236 $items[$item_id] = array(
237 "title" => $item_data[$item_id][
"title"],
261 $a_offset = 0, $a_limit = 9999, array $a_filters = NULL, array $a_additional_fields = NULL,
262 $check_agreement =
false, $privacy_fields = NULL)
266 $fields = array(
"usr_data.usr_id",
"login",
"active");
270 $where[] =
"usr_data.usr_id <> ".$ilDB->quote(ANONYMOUS_USER_ID,
"integer");
279 if (is_array($a_users))
282 $where[] = $ilDB->in(
"usr_data.usr_id", $a_users,
false,
"integer");
285 $query =
" FROM usr_data ".$left.
" JOIN read_event ON (read_event.usr_id = usr_data.usr_id".
286 " AND read_event.obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
287 " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = usr_data.usr_id ".
288 " AND ut_lp_marks.obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
289 " LEFT JOIN usr_pref ON (usr_pref.usr_id = usr_data.usr_id AND keyword = ".$ilDB->quote(
"language",
"text").
")".
292 $queries = array(array(
"fields"=>$fields,
"query"=>
$query));
295 if($a_order_field ==
"language")
297 $a_order_field =
"usr_pref.value";
304 $a_order_field =
"login";
306 else if(substr($a_order_field, 0, 4) ==
"udf_")
308 $udf_order = $a_order_field;
309 $a_order_field = null;
320 include_once
"Services/Utilities/classes/class.ilStr.php";
322 $udf_order, $a_order_dir);
338 $a_check_agreement = null, array $a_privacy_fields = null, array $a_filters = null)
342 if(!$a_result[
"cnt"])
349 $query =
"SELECT usr_id, field_id, value FROM udf_text WHERE ".$ilDB->in(
"field_id", $a_udf,
false,
"integer");
350 $set = $ilDB->query(
$query);
352 while(
$row = $ilDB->fetchAssoc($set))
354 $udf[
$row[
"usr_id"]][
"udf_".$row[
"field_id"]] =
$row[
"value"];
359 if($a_check_agreement)
362 include_once
"Services/Membership/classes/class.ilMemberAgreement.php";
366 $query =
"SELECT usr_id FROM usr_pref WHERE keyword = ".$ilDB->quote(
"public_profile",
"text").
367 " AND value = ".$ilDB->quote(
"y",
"text").
" OR value = ".$ilDB->quote(
"g",
"text");
368 $set = $ilDB->query(
$query);
369 $all_public = array();
370 while(
$row = $ilDB->fetchAssoc($set))
372 $all_public[] =
$row[
"usr_id"];
374 $query =
"SELECT usr_id,keyword FROM usr_pref WHERE ".$ilDB->like(
"keyword",
"text",
"public_%",
false).
375 " AND value = ".$ilDB->quote(
"y",
"text").
" AND ".$ilDB->in(
"usr_id", $all_public,
"",
"integer");
376 $set = $ilDB->query(
$query);
378 while(
$row = $ilDB->fetchAssoc($set))
380 $public[
$row[
"usr_id"]][] = substr($row[
"keyword"], 7);
385 foreach($a_result[
"set"] as $idx =>
$row)
388 if(isset($udf[
$row[
"usr_id"]]))
390 $a_result[
"set"][$idx] = $row = array_merge($row, $udf[$row[
"usr_id"]]);
394 if(
sizeof($a_privacy_fields) && $a_check_agreement && !in_array($row[
"usr_id"], $agreements))
396 foreach($a_privacy_fields as $field)
399 if(isset($row[$field]) && (!isset($public[$row[
"usr_id"]]) ||
400 !in_array($field, $public[$row[
"usr_id"]])))
403 if(isset($a_filters[$field]))
406 foreach(array_keys($row) as $col_id)
408 $a_result[
"set"][$idx][$col_id] = null;
410 $a_result[
"set"][$idx][
"privacy_conflict"] =
true;
417 $a_result[
"set"][$idx][$field] =
false;
442 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,
443 array $a_filters = NULL, array $a_additional_fields = NULL, $use_collection =
true)
447 $fields = array(
"object_data.obj_id",
"title",
"type");
450 $objects =
self::getObjectIds($a_parent_obj_id, $a_parent_ref_id, $use_collection,
true, array($a_user_id));
452 $query =
" FROM object_data LEFT JOIN read_event ON (object_data.obj_id = read_event.obj_id AND".
453 " read_event.usr_id = ".$ilDB->quote($a_user_id,
"integer").
")".
454 " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = ".$ilDB->quote($a_user_id,
"integer").
" AND".
455 " ut_lp_marks.obj_id = object_data.obj_id)".
456 " WHERE ".$ilDB->in(
"object_data.obj_id", $objects[
"object_ids"],
false,
"integer").
460 $queries[] = array(
"fields"=>$fields,
"query"=>
$query);
463 if($objects[
"objectives_parent_id"])
465 $objective_fields = array(
"crs_objectives.objective_id AS obj_id",
"title",
466 $ilDB->quote(
"lobj",
"text").
" as type");
468 include_once
"Modules/Course/classes/Objectives/class.ilLOUserResults.php";
470 if (is_array($a_additional_fields))
472 foreach($a_additional_fields as $field)
474 if($field !=
"status")
476 $objective_fields[] =
"NULL AS ".$field;
480 include_once(
"Services/Tracking/classes/class.ilLPStatus.php");
482 " THEN ".ilLPStatus::LP_STATUS_COMPLETED_NUM.
484 " THEN ".ilLPStatus::LP_STATUS_FAILED_NUM.
485 " ELSE NULL END AS status";
491 $where[] =
"crs_objectives.crs_id = ".$ilDB->quote($objects[
"objectives_parent_id"],
"integer");
492 $where[] =
"crs_objectives.active = ".$ilDB->quote(1,
"integer");
494 $objectives_query =
" FROM crs_objectives".
495 " LEFT JOIN loc_user_results ON (crs_objectives.objective_id = loc_user_results.objective_id".
496 " AND loc_user_results.user_id = ".$ilDB->quote($a_user_id,
"integer").
500 $queries[] = array(
"fields"=>$objective_fields,
"query"=>$objectives_query,
"count"=>
"crs_objectives.objective_id");
503 if(!in_array($a_order_field, $fields))
505 $a_order_field =
"title";
514 foreach(
$result[
"set"] as $idx => $item)
516 if($item[
"type"] ==
"sess")
518 $session = $sessions[$item[
"obj_id"]];
519 $result[
"set"][$idx][
"title"] = $session[
"title"];
520 $result[
"set"][$idx][
"sort_title"] = $session[
"e_start"];
524 $result[
"set"][$idx][
"ref_id"] = $objects[
"ref_ids"][$item[
"obj_id"]];
528 if($objects[
"scorm"])
530 include_once(
"./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php");
532 if($subtype ==
"scorm2004")
534 include_once(
"./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php");
536 $scos_tracking = $sobj->getTrackingDataAgg($a_user_id,
true);
540 include_once(
"./Modules/ScormAicc/classes/class.ilObjSCORMLearningModule.php");
542 $scos_tracking = array();
543 foreach($sobj->getTrackingDataAgg($a_user_id) as $item)
548 $time = explode(
":", $item[
"time"]);
549 $item[
"time"] = $time[0]*60*60+$time[1]*60+$time[2];
551 $scos_tracking[$item[
"sco_id"]] = array(
"session_time"=>$item[
"time"]);
555 foreach($objects[
"scorm"][
"scos"] as $sco)
557 $row = array(
"title" => $objects[
"scorm"][
"scos_title"][$sco],
561 if(in_array($a_user_id, $objects[
"scorm"][
"completed"][$sco]))
565 else if(in_array($a_user_id, $objects[
"scorm"][
"failed"][$sco]))
569 else if(in_array($a_user_id, $objects[
"scorm"][
"in_progress"][$sco]))
573 $row[
"status"] = $status;
576 if(isset($scos_tracking[$sco]))
578 if(isset($scos_tracking[$sco][
"last_access"]))
583 $row[
"spent_seconds"] = $scos_tracking[$sco][
"session_time"];
605 $query =
"SELECT obj_id, title, e_start, e_end, CASE WHEN participated = 1 THEN 2 WHEN registered = 1 THEN 1 ELSE NULL END AS status,".
608 " JOIN event_appointment ON (event.obj_id = event_appointment.event_id)".
609 " LEFT JOIN event_participants ON (event_participants.event_id = event.obj_id AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
")".
610 " WHERE ".$ilDB->in(
"obj_id", $obj_ids ,
false,
"integer");
611 $set = $ilDB->query(
$query);
613 while($rec = $ilDB->fetchAssoc($set))
615 $rec[
"comment"] = $rec[
"e_comment"];
616 unset($rec[
"e_comment"]);
624 $rec[
"title"] = $date.
': '.$rec[
"title"];
628 $rec[
"title"] = $date;
630 $sessions[$rec[
"obj_id"]] = $rec;
651 static function getObjectsSummaryForObject($a_parent_obj_id, $a_parent_ref_id, $a_order_field =
"", $a_order_dir =
"", $a_offset = 0, $a_limit = 9999,
652 array $a_filters = NULL, array $a_additional_fields = NULL, $a_preselected_obj_ids = NULL)
660 if($a_preselected_obj_ids === NULL)
666 foreach($a_preselected_obj_ids as $obj_id => $ref_ids)
668 $objects[
"object_ids"][] = $obj_id;
669 $objects[
"ref_ids"][$obj_id] = array_pop($ref_ids);
677 $set = $ilDB->query(
"SELECT obj_id,title,type FROM object_data".
678 " WHERE ".$ilDB->in(
"obj_id", $objects[
"object_ids"],
false,
"integer"));
679 while($rec = $ilDB->fetchAssoc($set))
681 $object_data[$rec[
"obj_id"]] = $rec;
682 if($a_preselected_obj_ids)
684 $object_data[$rec[
"obj_id"]][
"ref_ids"] = $a_preselected_obj_ids[$rec[
"obj_id"]];
688 $object_data[$rec[
"obj_id"]][
"ref_ids"] = array($objects[
"ref_ids"][$rec[
"obj_id"]]);
692 foreach($objects[
"ref_ids"] as $object_id =>
$ref_id)
695 if(
sizeof($object_result))
697 if($object_data[$object_id])
699 $result[] = array_merge($object_data[$object_id], $object_result);
705 if($objects[
"objectives_parent_id"])
727 $where[] =
"usr_data.usr_id <> ".$ilDB->quote(ANONYMOUS_USER_ID,
"integer");
732 if (is_array($a_users))
735 $where[] = $ilDB->in(
"usr_data.usr_id", $a_users,
false,
"integer");
741 $query =
" FROM usr_data ".$left.
" JOIN read_event ON (read_event.usr_id = usr_data.usr_id".
742 " AND obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
743 " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = usr_data.usr_id ".
744 " AND ut_lp_marks.obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
745 " LEFT JOIN usr_pref ON (usr_pref.usr_id = usr_data.usr_id AND keyword = ".$ilDB->quote(
"language",
"text").
")".
748 $fields[] =
'COUNT(usr_data.usr_id) AS user_count';
751 $queries[] = array(
"fields"=>$fields,
"query"=>
$query,
"count"=>
"*");
755 $users_no =
$result[
"user_count"];
762 else if(isset($a_filters[
"user_total"]))
764 if($a_filters[
"user_total"][
"from"] && $users_no < $a_filters[
"user_total"][
"from"])
768 else if($a_filters[
"user_total"][
"to"] && $users_no > $a_filters[
"user_total"][
"to"])
791 $result[
"user_total"] = $users_no;
811 $field_alias = $field;
815 $field_alias = $alias;
816 $alias =
" AS ".$alias;
821 if(preg_match(
"/".preg_quote(
" [[--HAVING").
"(.+)".preg_quote(
"HAVING--]]").
"/", $base_query, $hits))
823 $having =
" HAVING ".$hits[1];
824 $base_query = str_replace($hits[0],
"", $base_query);
827 $query =
"SELECT COUNT(*) AS counter, ".$field.$alias.
" ".$base_query.
" GROUP BY ".$field.$having.
" ORDER BY counter DESC";
828 $set = $ilDB->query(
$query);
830 while($rec = $ilDB->fetchAssoc($set))
832 $result[$rec[$field_alias]] = (int)$rec[
"counter"];
854 include_once
"Modules/Course/classes/class.ilCourseParticipants.php";
856 return $member_obj->getMembers();
859 include_once
"Modules/Group/classes/class.ilGroupParticipants.php";
861 return $member_obj->getMembers();
865 $path = $tree->getPathId($a_ref_id);
867 foreach(array_reverse(
$path) as $path_ref_id)
870 if($type ==
"crs" || $type ==
"grp")
884 include_once(
"./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php");
886 if ($subtype ==
"scorm2004")
889 include_once(
"./Modules/Scorm2004/classes/class.ilObjSCORM2004LearningModule.php");
891 $all = $mod->getTrackedUsers(
"");
895 foreach($all as $item)
897 $a_users[] = $item[
"user_id"];
903 include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilObjSCORMTracking.php");
909 include_once(
"./Modules/Exercise/classes/class.ilExerciseMembers.php");
910 include_once(
"./Modules/Exercise/classes/class.ilObjExercise.php");
913 $a_users = $members->getMembers();
917 include_once
"Services/Tracking/classes/class.ilLPStatusFactory.php";
919 $a_users = $class::getParticipants($obj_id);
938 static protected function buildFilters(array $where, array $a_filters = NULL, $a_aggregate =
false)
944 if(
sizeof($a_filters))
946 foreach($a_filters as $id => $value)
957 case "matriculation":
961 $where[] = $ilDB->like(
"usr_data.".$id,
"text",
"%".$value.
"%");
967 $where[] =
"usr_data.".$id.
" = ".$ilDB->quote($value ,
"text");
971 $where[] = $ilDB->like(
"ut_lp_marks.".$id,
"text",
"%".$value.
"%");
979 " OR ut_lp_marks.status IS NULL)";
985 $where[] =
"ut_lp_marks.".$id.
" = ".$ilDB->quote($value ,
"text");
993 $where[] =
"ut_lp_marks.".$id.
" >= ".$ilDB->quote($value[
"from"] ,
"integer");
997 $where[] =
"(ut_lp_marks.".$id.
" <= ".$ilDB->quote($value[
"to"] ,
"integer").
998 " OR ut_lp_marks.".$id.
" IS NULL)";
1005 $having[] =
"ROUND(AVG(ut_lp_marks.".$id.
")) >= ".$ilDB->quote($value[
"from"] ,
"integer");
1009 $having[] =
"ROUND(AVG(ut_lp_marks.".$id.
")) <= ".$ilDB->quote($value[
"to"] ,
"integer");
1015 $where[] =
"usr_pref.value = ".$ilDB->quote($value ,
"text");
1022 $value[
"from"] = substr($value[
"from"], 0, -2).
"00";
1024 $value[
"from"] = $value[
"from"]->get(
IL_CAL_UNIX);
1028 if(strlen($value[
"to"]) == 19)
1030 $value[
"to"] = substr($value[
"to"], 0, -2).
"59";
1037 case 'status_changed':
1040 case "registration":
1041 if($id ==
"registration")
1043 $id =
"create_date";
1048 case "first_access":
1052 $where[] = $id.
" >= ".$ilDB->quote($value[
"from"] ,
"date");
1056 if(strlen($value[
"to"]) == 19)
1058 $value[
"to"] = substr($value[
"to"], 0, -2).
"59";
1060 $where[] = $id.
" <= ".$ilDB->quote($value[
"to"] ,
"date");
1069 $where[] =
"(read_event.".$id.
"+read_event.childs_".$id.
") >= ".$ilDB->quote($value[
"from"] ,
"integer");
1073 $where[] =
"((read_event.".$id.
"+read_event.childs_".$id.
") <= ".$ilDB->quote($value[
"to"] ,
"integer").
1074 " OR (read_event.".$id.
"+read_event.childs_".$id.
") IS NULL)";
1081 $having[] =
"SUM(read_event.".$id.
"+read_event.childs_".$id.
") >= ".$ilDB->quote($value[
"from"] ,
"integer");
1085 $having[] =
"SUM(read_event.".$id.
"+read_event.childs_".$id.
") <= ".$ilDB->quote($value[
"to"] ,
"integer");
1090 case "spent_seconds":
1095 $where[] =
"(read_event.".$id.
"+read_event.childs_".$id.
") >= ".$ilDB->quote($value[
"from"] ,
"integer");
1099 $where[] =
"((read_event.".$id.
"+read_event.childs_".$id.
") <= ".$ilDB->quote($value[
"to"] ,
"integer").
1100 " OR (read_event.".$id.
"+read_event.childs_".$id.
") IS NULL)";
1107 $having[] =
"ROUND(AVG(read_event.".$id.
"+read_event.childs_".$id.
")) >= ".$ilDB->quote($value[
"from"] ,
"integer");
1111 $having[] =
"ROUND(AVG(read_event.".$id.
"+read_event.childs_".$id.
")) <= ".$ilDB->quote($value[
"to"] ,
"integer");
1126 $sql .=
" WHERE ".implode(
" AND ", $where);
1131 $sql .=
" [[--HAVING ".implode(
" AND ", $having).
"HAVING--]]";
1145 static protected function buildColumns(array &$a_fields, array $a_additional_fields = NULL, $a_aggregate =
false)
1147 if(
sizeof($a_additional_fields))
1150 foreach($a_additional_fields as $field)
1152 if(substr($field, 0, 4) !=
"udf_")
1157 $pos = strrpos($field,
"_");
1162 $function = strtoupper(substr($field, $pos+1));
1163 $field = substr($field, 0, $pos);
1164 if(!in_array($function, array(
"MIN",
"MAX",
"SUM",
"AVG",
"COUNT")))
1175 $a_fields[] = $function.
"(value) ".$field.
"_".strtolower($function);
1179 $a_fields[] =
"value ".$field;
1184 case "spent_seconds":
1187 $a_fields[] =
"(".$field.
"+childs_".$field.
") ".$field;
1191 if($function ==
"AVG")
1193 $a_fields[] =
"ROUND(AVG(".$field.
"+childs_".$field.
"), 2) ".$field.
"_".strtolower($function);
1197 $a_fields[] = $function.
"(".$field.
"+childs_".$field.
") ".$field.
"_".strtolower($function);
1202 case "read_count_spent_seconds":
1203 if($function ==
"AVG")
1205 $a_fields[] =
"ROUND(AVG((spent_seconds+childs_spent_seconds)/(read_count+childs_read_count)), 2) ".$field.
"_".strtolower($function);
1212 if($function ==
"AVG")
1214 $a_fields[] =
"ROUND(AVG(".$field.
"), 2) ".$field.
"_".strtolower($function);
1218 $a_fields[] = $function.
"(".$field.
") ".$field.
"_".strtolower($function);
1223 $a_fields[] = $field;
1230 $udf[] = substr($field, 4);
1235 $a_fields = array_unique($a_fields);
1238 $udf = array_unique($udf);
1255 static public function getObjectIds($a_parent_obj_id, $a_parent_ref_id =
false, $use_collection =
true, $a_refresh_status =
true, $a_user_ids = null)
1257 include_once
"Services/Object/classes/class.ilObjectLP.php";
1259 $object_ids = array($a_parent_obj_id);
1260 $ref_ids = array($a_parent_obj_id => $a_parent_ref_id);
1261 $objectives_parent_id = $scorm = $subitems =
false;
1264 $mode = $olp->getCurrentMode();
1269 include_once
"Services/Tracking/classes/class.ilLPStatusFactory.php";
1271 $scorm = $status_scorm->_getStatusInfo($a_parent_obj_id);
1277 $objectives_parent_id = $a_parent_obj_id;
1282 include_once
"Services/Tracking/classes/class.ilLPStatusFactory.php";
1284 $subitems = $status_coll_man->_getStatusInfo($a_parent_obj_id);
1288 include_once
"Services/Tracking/classes/class.ilLPStatusFactory.php";
1290 $subitems = $status_coll_tlt->_getStatusInfo($a_parent_obj_id);
1297 $collection = $olp->getCollectionInstance();
1300 foreach($collection->getItems() as $child_ref_id)
1303 $object_ids[] = $child_id;
1304 $ref_ids[$child_id] = $child_ref_id;
1312 $object_ids = array_unique($object_ids);
1315 foreach($object_ids as $idx => $object_id)
1319 unset($object_ids[$idx]);
1325 if($a_refresh_status)
1330 return array(
"object_ids" => $object_ids,
1331 "ref_ids" => $ref_ids,
1332 "objectives_parent_id" => $objectives_parent_id,
1334 "subitems" => $subitems);
1344 static protected function getSubTree($a_parent_ref_id, array &$a_object_ids, array &$a_ref_ids)
1348 $children = $tree->getChilds($a_parent_ref_id);
1351 foreach($children as $child)
1353 if($child[
"type"] ==
"adm" || $child[
"type"] ==
"rolf")
1362 $cmode = $olp->getCurrentMode();
1379 $a_object_ids[] = $child[
"obj_id"];
1380 $a_ref_ids[$child[
"obj_id"]] = $child[
"ref_id"];
1398 static function executeQueries(array $queries, $a_order_field =
"", $a_order_dir =
"", $a_offset = 0, $a_limit = 9999)
1403 $subqueries = array();
1404 foreach($queries as $item)
1407 $item = str_replace(
"[[--HAVING",
"HAVING", $item);
1408 $item = str_replace(
"HAVING--]]",
"", $item);
1410 if(!isset($item[
"count"]))
1412 $count_field = $item[
"fields"];
1413 $count_field = array_shift($count_field);
1417 $count_field = $item[
"count"];
1419 $count_query =
"SELECT COUNT(".$count_field.
") AS cnt".$item[
"query"];
1420 $set = $ilDB->query($count_query);
1421 if ($rec = $ilDB->fetchAssoc($set))
1423 $cnt += $rec[
"cnt"];
1426 $subqueries[] =
"SELECT ".implode(
",", $item[
"fields"]).$item[
"query"];
1433 if(
sizeof($subqueries) > 1)
1435 $base = array_shift($subqueries);
1436 $query = $base.
" UNION (".implode(
") UNION (", $subqueries).
")";
1443 if ($a_order_dir !=
"asc" && $a_order_dir !=
"desc")
1445 $a_order_dir =
"asc";
1449 $query.=
" ORDER BY ".$a_order_field.
" ".strtoupper($a_order_dir);
1452 $offset = (int) $a_offset;
1453 $limit = (int) $a_limit;
1454 $ilDB->setLimit($limit, $offset);
1456 $set = $ilDB->query(
$query);
1457 while($rec = $ilDB->fetchAssoc($set))
1463 return array(
"cnt" => $cnt,
"set" =>
$result);
1478 array $a_additional_fields = null, array $a_privacy_fields = null, $a_check_agreement = null)
1482 $result = array(
"cnt"=>0,
"set"=>NULL);
1483 if(
sizeof($a_obj_ids))
1486 $where[] =
"usr_data.usr_id <> ".$ilDB->quote(ANONYMOUS_USER_ID,
"integer");
1489 $where[] = $ilDB->like(
"usr_data.login",
"text",
"%".$a_user_filter.
"%");
1495 if (is_array($a_users))
1498 $where[] = $ilDB->in(
"usr_data.usr_id", $a_users,
false,
"integer");
1504 $fields = array(
"usr_data.usr_id",
"login",
"active");
1507 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
1510 foreach($a_obj_ids as $obj_id)
1513 $query =
" FROM usr_data ".$left.
" JOIN read_event ON (read_event.usr_id = usr_data.usr_id".
1514 " AND read_event.obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
1515 " LEFT JOIN ut_lp_marks ON (ut_lp_marks.usr_id = usr_data.usr_id ".
1516 " AND ut_lp_marks.obj_id = ".$ilDB->quote($obj_id,
"integer").
")".
1517 " LEFT JOIN usr_pref ON (usr_pref.usr_id = usr_data.usr_id AND keyword = ".$ilDB->quote(
"language",
"text").
")".
1524 foreach($raw[
"set"] as
$row)
1526 $result[
"set"][$row[
"usr_id"]][
"login"] = $row[
"login"];
1527 $result[
"set"][$row[
"usr_id"]][
"usr_id"] = $row[
"usr_id"];
1530 $result[
"set"][$row[
"usr_id"]][
"obj_".$obj_id] = $row[
"status"];
1531 $result[
"set"][$row[
"usr_id"]][
"obj_".$obj_id.
"_perc"] = $row[
"percentage"];
1533 if($obj_id == $parent_obj_id)
1535 $result[
"set"][$row[
"usr_id"]][
"status_changed"] = $row[
"status_changed"];
1536 $result[
"set"][$row[
"usr_id"]][
"last_access"] = $row[
"last_access"];
1537 $result[
"set"][$row[
"usr_id"]][
"spent_seconds"] = $row[
"spent_seconds"];
1538 $result[
"set"][$row[
"usr_id"]][
"read_count"] = $row[
"read_count"];
1541 foreach($fields as $field)
1544 if(stristr($field,
"language"))
1546 $field =
"language";
1549 if(isset($row[$field]))
1552 if($obj_id == $parent_obj_id ||
1553 !in_array($field, array(
"mark",
"u_comment")))
1555 $result[
"set"][$row[
"usr_id"]][$field] = $row[$field];
1575 if($a_parent_obj_id && $a_users)
1579 include_once
"Services/Tracking/classes/class.ilLPStatus.php";
1580 include_once
"Modules/Course/classes/Objectives/class.ilLOUserResults.php";
1581 include_once
"Modules/Course/classes/class.ilCourseObjective.php";
1585 foreach($objective_ids as $objective_id)
1587 foreach($a_users as $user_id)
1593 $query =
"SELECT * FROM loc_user_results".
1594 " WHERE ".$ilDB->in(
"objective_id", $objective_ids,
"",
"integer").
1595 " AND ".$ilDB->in(
"user_id", $a_users,
"",
"integer").
1597 $set = $ilDB->query(
$query);
1598 while(
$row = $ilDB->fetchAssoc($set))
1600 $objective_id =
$row[
"objective_id"];
1601 $user_id =
$row[
"user_id"];
1622 $obj_ids = array_keys($a_ref_ids);
1634 $sql =
"SELECT obj_id,".$column.
",SUM(read_count) read_count,SUM(childs_read_count) childs_read_count,".
1635 "SUM(spent_seconds) spent_seconds,SUM(childs_spent_seconds) childs_spent_seconds".
1637 " WHERE ".$ilDB->in(
"obj_id", $obj_ids,
"",
"integer").
1638 " AND yyyy = ".$ilDB->quote($a_year,
"integer");
1641 $sql .=
" AND mm = ".$ilDB->quote($a_month,
"integer");
1643 $sql .=
" GROUP BY obj_id,".$column;
1644 $set = $ilDB->query($sql);
1645 while(
$row = $ilDB->fetchAssoc($set))
1647 $row[
"read_count"] +=
$row[
"childs_read_count"];
1648 $row[
"spent_seconds"] +=
$row[
"childs_spent_seconds"];
1649 $res[
$row[
"obj_id"]][
$row[$column]][
"read_count"] += $row[
"read_count"];
1650 $res[$row[
"obj_id"]][$row[$column]][
"spent_seconds"] += $row[
"spent_seconds"];
1656 $sql =
"SELECT obj_id,".$column.
",SUM(counter) counter".
1657 " FROM obj_user_stat".
1658 " WHERE ".$ilDB->in(
"obj_id", $obj_ids,
"",
"integer").
1659 " AND yyyy = ".$ilDB->quote($a_year,
"integer");
1662 $sql .=
" AND mm = ".$ilDB->quote($a_month,
"integer");
1664 $sql .=
" GROUP BY obj_id,".$column;
1665 $set = $ilDB->query($sql);
1666 while(
$row = $ilDB->fetchAssoc($set))
1668 $res[
$row[
"obj_id"]][
$row[$column]][
"users"] += $row[
"counter"];
1676 global
$ilDB, $objDefinition;
1681 include_once
"Services/Tree/classes/class.ilTree.php";
1683 $sql =
"SELECT ".$tree->table_obj_data.
".obj_id,".$tree->table_obj_data.
".type,".
1684 $tree->table_tree.
".".$tree->tree_pk.
",".$tree->table_obj_reference.
".ref_id".
1685 " FROM ".$tree->table_tree.
1686 " ".$tree->buildJoin().
1687 " WHERE ".$ilDB->in($tree->table_obj_data.
".type", $types,
"",
"text");
1688 $set = $ilDB->query($sql);
1690 while(
$row = $ilDB->fetchAssoc($set))
1692 $res[
$row[
"type"]][
"type"] = $row[
"type"];
1693 $res[$row[
"type"]][
"references"]++;
1694 $res[$row[
"type"]][
"objects"][] = $row[
"obj_id"];
1695 if($row[$tree->tree_pk] < 0)
1697 $res[$row[
"type"]][
"deleted"]++;
1701 foreach(
$res as $type => $values)
1703 $res[$type][
"objects"] =
sizeof(array_unique($values[
"objects"]));
1713 $obj_ids = array_keys($a_ref_ids);
1716 $sql =
"SELECT obj_id,hh,SUM(read_count) read_count,SUM(childs_read_count) childs_read_count,".
1717 "SUM(spent_seconds) spent_seconds,SUM(childs_spent_seconds) childs_spent_seconds".
1719 " WHERE ".$ilDB->in(
"obj_id", $obj_ids,
"",
"integer").
1720 " AND yyyy = ".$ilDB->quote($a_year,
"integer");
1723 $sql .=
" AND mm = ".$ilDB->quote($a_month,
"integer");
1725 $sql .=
" GROUP BY obj_id,hh";
1726 $set = $ilDB->query($sql);
1727 while(
$row = $ilDB->fetchAssoc($set))
1729 $row[
"read_count"] +=
$row[
"childs_read_count"];
1730 $row[
"spent_seconds"] +=
$row[
"childs_spent_seconds"];
1732 $res[
$row[
"obj_id"]][(int)
$row[
"hh"]][
"spent_seconds"] +=
$row[
"spent_seconds"];
1741 $set = $ilDB->query(
"SELECT COUNT(*) AS COUNTER,yyyy,mm".
1743 " GROUP BY yyyy, mm".
1744 " ORDER BY yyyy DESC, mm DESC");
1746 while(
$row = $ilDB->fetchAssoc($set))
1749 "count"=>$row[
"counter"]);
1759 $date_compare = $ilDB->in($ilDB->concat(array(array(
"yyyy",
""),
1760 array($ilDB->quote(
"-",
"text"),
""),
1761 array(
"mm",
""))), $a_months,
"",
"text");
1762 $sql =
"DELETE FROM obj_stat".
1763 " WHERE ".$date_compare;
1764 $ilDB->manipulate($sql);
1767 $tables = array(
"obj_lp_stat",
"obj_type_stat",
"obj_user_stat");
1768 foreach($a_months as $month)
1770 $year = substr($month, 0, 4);
1771 $month = substr($month, 5);
1772 $from = $year.str_pad($month, 2,
"0", STR_PAD_LEFT).
"01";
1773 $to = $year.str_pad($month, 2,
"0", STR_PAD_LEFT).
"31";
1775 foreach($tables as $table)
1777 $sql =
"DELETE FROM ".$table.
1778 " WHERE fulldate >= ".$ilDB->quote($from,
"integer").
1779 " AND fulldate <= ".$ilDB->quote($to,
"integer");
1780 $ilDB->manipulate($sql);
1785 static public function searchObjects($a_type, $a_title = null, $a_root = null, $a_hidden = null, $a_preset_obj_ids = null)
1787 global
$ilDB, $tree;
1789 if($a_type ==
"lres")
1791 $a_type = array(
'lm',
'sahs',
'htlm',
'dbk');
1794 $sql =
"SELECT r.ref_id,r.obj_id".
1795 " FROM object_data o".
1796 " JOIN object_reference r ON (o.obj_id = r.obj_id)".
1797 " JOIN tree t ON (t.child = r.ref_id)".
1798 " WHERE t.tree = ".$ilDB->quote(1,
"integer");
1800 if(!is_array($a_type))
1802 $sql .=
" AND o.type = ".$ilDB->quote($a_type,
"text");
1806 $sql .=
" AND ".$ilDB->in(
"o.type", $a_type,
"",
"text");
1811 $sql .=
" AND (".$ilDB->like(
"o.title",
"text",
"%".$a_title.
"%").
1812 " OR ".$ilDB->like(
"o.description",
"text",
"%".$a_title.
"%").
")";
1815 if(is_array($a_hidden))
1817 $sql .=
" AND ".$ilDB->in(
"o.obj_id", $a_hidden,
true,
"integer");
1820 if(is_array($a_preset_obj_ids))
1822 $sql .=
" AND ".$ilDB->in(
"o.obj_id", $a_preset_obj_ids,
false,
"integer");
1825 $set = $ilDB->query($sql);
1827 while(
$row = $ilDB->fetchAssoc($set))
1829 if($a_root && $a_root != ROOT_FOLDER_ID)
1833 if($tree->isGrandChild($a_root,
$ref_id))
1835 $res[
$row[
"obj_id"]][] = $row[
"ref_id"];
1842 $res[
$row[
"obj_id"]][] = $row[
"ref_id"];
1856 include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
1857 foreach($a_obj_ids as $obj_id)
1872 $set = $ilDB->query(
"SELECT COUNT(*) counter, MIN(tstamp) tstamp".
1873 " FROM obj_stat_log");
1874 return $ilDB->fetchAssoc($set);
1887 $column =
"mm,yyyy";
1891 $sql =
"SELECT obj_id,".$column.
",".
1892 "MIN(mem_cnt) mem_cnt_min,AVG(mem_cnt) mem_cnt_avg, MAX(mem_cnt) mem_cnt_max,".
1893 "MIN(in_progress) in_progress_min,AVG(in_progress) in_progress_avg,MAX(in_progress) in_progress_max,".
1894 "MIN(completed) completed_min,AVG(completed) completed_avg,MAX(completed) completed_max,".
1895 "MIN(failed) failed_min,AVG(failed) failed_avg,MAX(failed) failed_max,".
1896 "MIN(not_attempted) not_attempted_min,AVG(not_attempted) not_attempted_avg,MAX(not_attempted) not_attempted_max".
1897 " FROM obj_lp_stat".
1898 " WHERE ".$ilDB->in(
"obj_id", $a_obj_ids,
"",
"integer").
1899 " AND yyyy = ".$ilDB->quote($a_year,
"integer");
1902 $sql .=
" AND mm = ".$ilDB->quote($a_month,
"integer");
1904 $sql .=
" GROUP BY obj_id,".$column;
1905 $set = $ilDB->query($sql);
1906 while(
$row = $ilDB->fetchAssoc($set))
1920 $a_year = date(
"Y");
1923 $agg = strtoupper($a_aggregation);
1926 $sql =
"SELECT type,yyyy,mm,".$agg.
"(cnt_objects) cnt_objects,".$agg.
"(cnt_references) cnt_references,".
1927 "".$agg.
"(cnt_deleted) cnt_deleted FROM obj_type_stat".
1928 " WHERE yyyy = ".$ilDB->quote($a_year,
"integer").
1929 " GROUP BY type,yyyy,mm";
1930 $set = $ilDB->query($sql);
1931 while(
$row = $ilDB->fetchAssoc($set))
1933 $row[
"mm"] = str_pad(
$row[
"mm"], 2,
"0", STR_PAD_LEFT);
1935 "objects" => (
int)
$row[
"cnt_objects"],
1936 "references" => (
int)$row[
"cnt_references"],
1937 "deleted" => (
int)$row[
"cnt_deleted"]