42 $this->obj_id = $a_obj_id;
87 include_once
'Services/MetaData/classes/class.ilMDEducational.php';
195 function _updateStatus($a_obj_id, $a_usr_id, $a_obj = null, $a_percentage =
false, $a_force_raise =
false)
202 $changed = self::writeStatus($a_obj_id, $a_usr_id, $status, $percentage);
204 if(
$changed || (
bool)$a_force_raise)
206 self::raiseEvent($a_obj_id, $a_usr_id, $status, $percentage);
249 $sql =
"SELECT usr_id FROM ut_lp_marks WHERE ".
250 " obj_id = ".$ilDB->quote($a_obj_id,
"integer").
" AND ".
251 " status_dirty = ".$ilDB->quote(1,
"integer");
252 if(is_array($a_users) && count($a_users) > 0)
254 $sql .=
" AND ".$ilDB->in(
"usr_id", $a_users,
false,
"integer");
256 $set = $ilDB->query($sql);
258 if ($rec = $ilDB->fetchAssoc($set))
265 if (!$dirty && is_array($a_users) && count($a_users) > 0)
267 $set = $ilDB->query(
"SELECT count(usr_id) cnt FROM ut_lp_marks WHERE ".
268 " obj_id = ".$ilDB->quote($a_obj_id,
"integer").
" AND ".
269 $ilDB->in(
"usr_id", $a_users,
false,
"integer"));
270 $r = $ilDB->fetchAssoc($set);
271 if (
$r[
"cnt"] < count($a_users))
278 if ($dirty || $missing)
280 require_once
"Services/Tracking/classes/class.ilLPStatusFactory.php";
282 $trac_obj->refreshStatus($a_obj_id, $a_users);
286 protected function raiseEvent($a_obj_id, $a_usr_id, $a_status, $a_percentage)
288 global $ilAppEventHandler;
290 $ilAppEventHandler->raise(
"Services/Tracking",
"updateStatus", array(
291 "obj_id" => $a_obj_id,
292 "usr_id" => $a_usr_id,
293 "status" => $a_status,
294 "percentage" => $a_percentage
306 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
308 foreach ($not_attempted as $user_id)
311 if(self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_NOT_ATTEMPTED_NUM, $percentage,
true))
313 self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_NOT_ATTEMPTED_NUM, $percentage);
317 foreach ($in_progress as $user_id)
320 if(self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_IN_PROGRESS_NUM, $percentage,
true))
322 self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_IN_PROGRESS_NUM, $percentage);
326 foreach ($completed as $user_id)
329 if(self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_COMPLETED_NUM, $percentage,
true))
331 self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_COMPLETED_NUM, $percentage);
338 if(self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_FAILED_NUM, $percentage,
true))
340 self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_FAILED_NUM, $percentage);
345 $missing_users = array_diff($a_users, $not_attempted+$in_progress+$completed+
$failed);
348 foreach ($missing_users as $user_id)
362 static function writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage =
false, $a_force_per =
false)
366 $update_collections =
false;
369 $set = $ilDB->query(
"SELECT usr_id,status,status_dirty FROM ut_lp_marks WHERE ".
370 " obj_id = ".$ilDB->quote($a_obj_id,
"integer").
" AND ".
371 " usr_id = ".$ilDB->quote($a_user_id,
"integer")
373 $rec = $ilDB->fetchAssoc($set);
379 if ($rec[
"status"] != $a_status)
381 $ret = $ilDB->manipulate(
"UPDATE ut_lp_marks SET ".
382 " status = ".$ilDB->quote($a_status,
"integer").
",".
383 " status_changed = ".$ilDB->now().
",".
384 " status_dirty = ".$ilDB->quote(0,
"integer").
385 " WHERE usr_id = ".$ilDB->quote($a_user_id,
"integer").
386 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
390 $update_collections =
true;
394 else if ($rec[
"status_dirty"])
396 $ilDB->manipulate(
"UPDATE ut_lp_marks SET ".
397 " status_dirty = ".$ilDB->quote(0,
"integer").
398 " WHERE usr_id = ".$ilDB->quote($a_user_id,
"integer").
399 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
418 $ilDB->replace(
"ut_lp_marks",
420 "obj_id" => array(
"integer", $a_obj_id),
421 "usr_id" => array(
"integer", $a_user_id)
424 "status" => array(
"integer", $a_status),
425 "status_changed" => array(
"timestamp", date(
"Y-m-d H:i:s")),
426 "status_dirty" => array(
"integer", 0)
430 $update_collections =
true;
434 if ($a_percentage !==
false || $a_force_per)
436 $a_percentage = max(0, (
int) $a_percentage);
437 $a_percentage = min(100, $a_percentage);
438 $ret = $ilDB->manipulate(
"UPDATE ut_lp_marks SET ".
439 " percentage = ".$ilDB->quote($a_percentage,
"integer").
440 " WHERE usr_id = ".$ilDB->quote($a_user_id,
"integer").
441 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
446 if ($update_collections)
449 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
452 $set = $ilDB->query(
"SELECT ut_lp_collections.obj_id obj_id FROM ".
453 "object_reference JOIN ut_lp_collections ON ".
454 "(object_reference.obj_id = ".$ilDB->quote($a_obj_id,
"integer").
455 " AND object_reference.ref_id = ut_lp_collections.item_id)");
456 while ($rec = $ilDB->fetchAssoc($set))
468 return $update_collections;
482 $needs_update =
false;
484 $set = $ilDB->query(
"SELECT usr_id, status FROM ut_lp_marks WHERE ".
485 " obj_id = ".$ilDB->quote($a_obj_id,
"integer").
" AND ".
486 " usr_id = ".$ilDB->quote($a_user_id,
"integer")
488 if ($rec = $ilDB->fetchAssoc($set))
491 if($rec[
"status"] == self::LP_STATUS_NOT_ATTEMPTED_NUM)
493 $needs_update =
true;
499 $needs_update =
true;
504 require_once
"Services/Tracking/classes/class.ilLPStatusWrapper.php";
519 $ilDB->manipulate(
"UPDATE ut_lp_marks SET ".
520 " status_dirty = ".$ilDB->quote(1,
"integer")
535 $ilDB->manipulate(
"UPDATE ut_lp_marks SET ".
536 " status_dirty = ".$ilDB->quote(1,
"integer").
537 " WHERE obj_id = ".$ilDB->quote($a_obj_id,
"integer")
548 public static function _lookupStatus($a_obj_id, $a_user_id, $a_create =
true)
552 $set = $ilDB->query(
"SELECT status FROM ut_lp_marks WHERE ".
553 " status_dirty = ".$ilDB->quote(0,
"integer").
554 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
555 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
557 if ($rec = $ilDB->fetchAssoc($set))
559 return $rec[
"status"];
561 else if((
bool)$a_create)
563 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
565 $set = $ilDB->query(
"SELECT status FROM ut_lp_marks WHERE ".
566 " status_dirty = ".$ilDB->quote(0,
"integer").
567 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
568 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
570 if ($rec = $ilDB->fetchAssoc($set))
572 return $rec[
"status"];
587 $set = $ilDB->query(
"SELECT percentage FROM ut_lp_marks WHERE ".
588 " status_dirty = ".$ilDB->quote(0,
"integer").
589 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
590 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
592 if ($rec = $ilDB->fetchAssoc($set))
594 return $rec[
"percentage"];
607 return (self::_lookupStatus($a_obj_id, $a_user_id) == self::LP_STATUS_COMPLETED_NUM);
620 $set = $ilDB->query(
"SELECT status_changed FROM ut_lp_marks WHERE ".
621 " status_dirty = ".$ilDB->quote(0,
"integer").
622 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
623 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
625 if ($rec = $ilDB->fetchAssoc($set))
627 return $rec[
"status_changed"];
631 include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
633 $set = $ilDB->query(
"SELECT status_changed FROM ut_lp_marks WHERE ".
634 " status_dirty = ".$ilDB->quote(0,
"integer").
635 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer").
636 " AND obj_id = ".$ilDB->quote($a_obj_id,
"integer")
638 if ($rec = $ilDB->fetchAssoc($set))
640 return $rec[
"status_changed"];
657 $sql =
"SELECT usr_id, status, status_dirty FROM ut_lp_marks".
658 " WHERE obj_id = ".$ilDB->quote($a_obj_id,
"integer").
659 " AND status = ".$ilDB->quote($a_status,
"integer");
662 $sql .=
" AND ".$ilDB->in(
"usr_id", $a_user_ids,
"",
"integer");
665 $set = $ilDB->query($sql);
667 while($rec = $ilDB->fetchAssoc($set))
669 if(
$res[
"status_dirty"])
672 if(self::_lookupStatus($a_obj_id, $rec[
"usr_id"]) != $a_status)
677 $res[] = $rec[
"usr_id"];
692 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_COMPLETED_NUM, $a_user_ids);
704 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_FAILED_NUM, $a_user_ids);
716 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_IN_PROGRESS_NUM, $a_user_ids);
734 $lp_invalid = array();
736 include_once
"Services/Object/classes/class.ilObjectLP.php";
738 foreach($memberships as $obj_id => $status)
746 return array_diff($a_obj_ids, $lp_invalid);
760 include_once
"Services/Tracking/classes/collection/class.ilLPCollection.php";
763 include_once
"Services/Tracking/classes/class.ilLPObjSettings.php";
767 foreach($existing as $obj_id => $obj_mode)
773 if(in_array($obj_mode, $coll_modes))
781 include_once
"Services/Object/classes/class.ilObjectLP.php";
782 if(
sizeof($existing) !=
sizeof($a_obj_ids))
784 foreach(array_diff($a_obj_ids, $existing) as $obj_id)
787 $mode = $olp->getCurrentMode();
797 if(in_array($mode, $coll_modes))
806 return array_values(
$valid);
823 $sql =
"SELECT status, status_dirty, obj_id FROM ut_lp_marks".
824 " WHERE ".$ilDB->in(
"obj_id", $a_obj_ids,
"",
"integer").
825 " AND usr_id = ".$ilDB->quote($a_user_id,
"integer");
826 $set = $ilDB->query($sql);
827 while(
$row = $ilDB->fetchAssoc($set))
829 if(!
$row[
"status_dirty"])
831 $res[
$row[
"obj_id"]] = $row[
"status"];
835 $res[
$row[
"obj_id"]] = self::_lookupStatus($row[
"obj_id"], $a_user_id);
840 foreach($a_obj_ids as $obj_id)
842 if(!isset(
$res[$obj_id]))
844 $res[
$obj_id] = self::_lookupStatus($obj_id, $a_user_id);
845 if(
$res[$obj_id] === null)
859 $user_id = $ilUser->getId();
863 include_once(
"Services/Tracking/classes/class.ilObjUserTracking.php");
864 if($ilUser->getId() != ANONYMOUS_USER_ID &&
872 $a_obj_ids = self::validateLPForObjects($user_id, $a_obj_ids, (
int)
$_GET[
"ref_id"]);
875 $coll_obj_ids = array();
876 $a_obj_ids = self::checkLPModesForObjects($a_obj_ids, $coll_obj_ids);
881 $res = self::getLPStatusForObjects($user_id, $a_obj_ids);
887 $lng->loadLanguageModule(
"trac");
888 include_once(
"./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
889 foreach(
$res as $obj_id => $status)
897 self::$list_gui_cache =
$res;
902 return self::$list_gui_cache[$a_obj_id];
const LP_STATUS_COMPLETED_NUM
static _lookupFailedForObject($a_obj_id, $a_user_ids=null)
Get failed users for object.
refreshStatus($a_obj_id, $a_users=null)
Refresh status.
determineStatus($a_obj_id, $a_usr_id, $a_obj=null)
Determine status.
_getTypicalLearningTimeSeconds($a_rbac_id, $a_obj_id=0)
_getTypicalLearningTime($a_obj_id)
static preloadListGUIData($a_obj_ids)
static checkStatusForObject($a_obj_id, $a_users=false)
This function checks whether the status for a given number of users is dirty and must be recalculated...
static _hasLearningProgressLearner()
const LP_STATUS_PARTICIPATED
const LP_STATUS_NOT_ATTEMPTED
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _lookupPercentage($a_obj_id, $a_user_id)
Lookup percentage.
static validateLPForObjects($a_user_id, $a_obj_ids, $a_parent_ref_id)
Process given objects for lp-relevance.
const LP_STATUS_IN_PROGRESS_NUM
_getImagePathForStatus($a_status)
Get image path for status.
static getListGUIStatus($a_obj_id)
_getNotAttempted($a_obj_id)
Static function to read the number of user who have the status 'not_attempted'.
const LP_STATUS_IN_PROGRESS
_getCountCompleted($a_obj_id)
static _enabledLearningProgress()
check wether learing progress is enabled or not
const LP_STATUS_NOT_PARTICIPATED
raiseEvent($a_obj_id, $a_usr_id, $a_status, $a_percentage)
_getFailed($a_obj_id)
Static function to read the users who have the status 'completed'.
_getInstance($a_obj_id, $a_mode=NULL)
static _hasUserCompleted($a_obj_id, $a_user_id)
Lookup user object completion.
_getNotAttempted($a_obj_id)
_getStatusText($a_status, $a_lng=null)
Get status alt text.
_getCountNotAttempted($a_obj_id)
static _lookupStatusForObject($a_obj_id, $a_status, $a_user_ids=null)
Get users with given status for object.
_getCompleted($a_obj_id)
Static function to read the users who have the status 'completed'.
static checkLPModesForObjects($a_obj_ids, array &$a_coll_obj_ids)
Process lp modes for given objects.
_updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
New status handling (st: status, nr: accesses, p: percentage, t: time spent, m: mark) ...
static _lookupDBModeForObjects(array $a_obj_ids)
static _lookupType($a_id, $a_reference=false)
lookup object type
static _removeStatusCache($a_obj_id, $a_usr_id)
_getInProgress($a_obj_id)
static _hasLearningProgressListGUI()
const LP_STATUS_NOT_ATTEMPTED_NUM
static _lookupInProgressForObject($a_obj_id, $a_user_ids=null)
Get in progress users for object.
const LP_STATUS_REGISTERED
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
static setDirty($a_obj_id)
Sets status of an object to dirty.
const LP_MODE_DEACTIVATED
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
static getLPStatusForObjects($a_user_id, $a_obj_ids)
Get LP status for given objects (and user)
static setInProgressIfNotAttempted($a_obj_id, $a_user_id)
This function shoudl be clalled for normal "read events".
Abstract class ilLPStatus for all learning progress modes E.g ilLPStatusManual, ilLPStatusObjectives ...
static _lookupCompletedForObject($a_obj_id, $a_user_ids=null)
Get completed users for object.
_getInProgress($a_obj_id)
Static function to read users who have the status 'in_progress'.
determinePercentage($a_obj_id, $a_usr_id, $a_obj=null)
Determine percentage.
static setAllDirty()
Sets all status to dirty.
static getLPMemberships($a_usr_id, array $a_obj_ids, $a_parent_ref_id=null, $a_mapped_ref_ids=false)
Get all objects where given user is member (from LP POV)
_getCountInProgress($a_obj_id)
const LP_STATUS_COMPLETED
static getInstance($a_obj_id)
_lookupStatusChanged($a_obj_id, $a_user_id)
Lookup status changed.
static getCollectionModes()
const LP_STATUS_NOT_REGISTERED
static _lookupStatus($a_obj_id, $a_user_id, $a_create=true)
Lookup status.
_getStatusInfo($a_obj_id)
const LP_STATUS_FAILED_NUM