ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
class.ilLPStatus.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
16{
17 public $obj_id = null;
18
19 public $db = null;
20
21 public static $list_gui_cache;
22
23 const LP_STATUS_NOT_ATTEMPTED = 'trac_no_attempted';
24 const LP_STATUS_IN_PROGRESS = 'trac_in_progress';
25 const LP_STATUS_COMPLETED = 'trac_completed';
26 const LP_STATUS_FAILED = 'trac_failed';
27
32
33 const LP_STATUS_REGISTERED = 'trac_registered';
34 const LP_STATUS_NOT_REGISTERED = 'trac_not_registered';
35 const LP_STATUS_PARTICIPATED = 'trac_participated';
36 const LP_STATUS_NOT_PARTICIPATED = 'trac_not_participated';
37
38 public function __construct($a_obj_id)
39 {
40 global $ilDB;
41
42 $this->obj_id = $a_obj_id;
43 $this->db = $ilDB;
44 }
45
46 public static function _getCountNotAttempted($a_obj_id)
47 {
48 return 0;
49 }
50
51 public static function _getNotAttempted($a_obj_id)
52 {
53 return array();
54 }
55
56 public static function _getCountInProgress($a_obj_id)
57 {
58 return 0;
59 }
60
61 public static function _getInProgress($a_obj_id)
62 {
63 return array();
64 }
65
66 public static function _getCountCompleted($a_obj_id)
67 {
68 return 0;
69 }
70
71 public static function _getCompleted($a_obj_id)
72 {
73 return array();
74 }
75
76 public static function _getFailed($a_obj_id)
77 {
78 return array();
79 }
80
81 public static function _getCountFailed()
82 {
83 return 0;
84 }
85
86 public static function _getStatusInfo($a_obj_id)
87 {
88 return array();
89 }
90
91 public static function _getTypicalLearningTime($a_obj_id)
92 {
93 include_once 'Services/MetaData/classes/class.ilMDEducational.php';
95 }
96
97
201 public function _updateStatus($a_obj_id, $a_usr_id, $a_obj = null, $a_percentage = false, $a_force_raise = false)
202 {
204 $log->debug(sprintf(
205 "obj_id: %s, user id: %s, object: %s",
206 $a_obj_id,
207 $a_usr_id,
208 (is_object($a_obj) ? get_class($a_obj) : 'null')
209 ));
210
211 $status = $this->determineStatus($a_obj_id, $a_usr_id, $a_obj);
212 $percentage = $this->determinePercentage($a_obj_id, $a_usr_id, $a_obj);
213 $changed = self::writeStatus($a_obj_id, $a_usr_id, $status, $percentage);
214
215 // ak: I don't think that this is a good way to fix 15529, we should not
216 // raise the event, if the status does not change imo.
217 // for now the changes in the next line just prevent the event being raised twice
218 if (!$changed && (bool) $a_force_raise) { // #15529
219 self::raiseEvent($a_obj_id, $a_usr_id, $status, $percentage);
220 }
221 }
222
229 public function determinePercentage($a_obj_id, $a_usr_id, $a_obj = null)
230 {
231 return false;
232 }
233
240 public function determineStatus($a_obj_id, $a_usr_id, $a_obj = null)
241 {
242 return false;
243 }
244
245
253 public static function checkStatusForObject($a_obj_id, $a_users = false)
254 {
255 global $ilDB;
256
257 //@todo: there maybe the need to add extra handling for sessions here, since the
258 // "in progress" status is time dependent here. On the other hand, if they registered
259 // to the session, they already accessed the course and should have a "in progress"
260 // anyway. But the status on the session itself may not be correct.
261
262 $sql = "SELECT usr_id FROM ut_lp_marks WHERE " .
263 " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
264 " status_dirty = " . $ilDB->quote(1, "integer");
265 if (is_array($a_users) && count($a_users) > 0) {
266 $sql .= " AND " . $ilDB->in("usr_id", $a_users, false, "integer");
267 }
268 $set = $ilDB->query($sql);
269 $dirty = false;
270 if ($rec = $ilDB->fetchAssoc($set)) {
271 $dirty = true;
272 }
273
274 // check if any records are missing
275 $missing = false;
276 if (!$dirty && is_array($a_users) && count($a_users) > 0) {
277 $set = $ilDB->query("SELECT count(usr_id) cnt FROM ut_lp_marks WHERE " .
278 " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
279 $ilDB->in("usr_id", $a_users, false, "integer"));
280 $r = $ilDB->fetchAssoc($set);
281 if ($r["cnt"] < count($a_users)) {
282 $missing = true;
283 }
284 }
285
286 // refresh status, if records are dirty or missing
287 if ($dirty || $missing) {
288 require_once "Services/Tracking/classes/class.ilLPStatusFactory.php"; // #13330
289 $trac_obj = ilLPStatusFactory::_getInstance($a_obj_id);
290 $trac_obj->refreshStatus($a_obj_id, $a_users);
291 }
292 }
293
294 protected static function raiseEvent($a_obj_id, $a_usr_id, $a_status, $a_percentage)
295 {
296 global $ilAppEventHandler;
297
299 $log->debug("obj_id: " . $a_obj_id . ", user id: " . $a_usr_id . ", status: " .
300 $a_status . ", percentage: " . $a_percentage);
301
302 $ilAppEventHandler->raise("Services/Tracking", "updateStatus", array(
303 "obj_id" => $a_obj_id,
304 "usr_id" => $a_usr_id,
305 "status" => $a_status,
306 "percentage" => $a_percentage
307 ));
308 }
309
316 public function refreshStatus($a_obj_id, $a_users = null)
317 {
318 include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
319 $not_attempted = ilLPStatusWrapper::_getNotAttempted($a_obj_id);
320 foreach ($not_attempted as $user_id) {
321 $percentage = $this->determinePercentage($a_obj_id, $user_id);
322 if (self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_NOT_ATTEMPTED_NUM, $percentage, true)) {
323 //self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_NOT_ATTEMPTED_NUM, $percentage);
324 }
325 }
326 $in_progress = ilLPStatusWrapper::_getInProgress($a_obj_id);
327 foreach ($in_progress as $user_id) {
328 $percentage = $this->determinePercentage($a_obj_id, $user_id);
329 if (self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_IN_PROGRESS_NUM, $percentage, true)) {
330 //self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_IN_PROGRESS_NUM, $percentage);
331 }
332 }
333 $completed = ilLPStatusWrapper::_getCompleted($a_obj_id);
334 foreach ($completed as $user_id) {
335 $percentage = $this->determinePercentage($a_obj_id, $user_id);
336 if (self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_COMPLETED_NUM, $percentage, true)) {
337 //self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_COMPLETED_NUM, $percentage);
338 }
339 }
341 foreach ($failed as $user_id) {
342 $percentage = $this->determinePercentage($a_obj_id, $user_id);
343 if (self::writeStatus($a_obj_id, $user_id, self::LP_STATUS_FAILED_NUM, $percentage, true)) {
344 //self::raiseEvent($a_obj_id, $user_id, self::LP_STATUS_FAILED_NUM, $percentage);
345 }
346 }
347 if ($a_users) {
348 $missing_users = array_diff($a_users, $not_attempted+$in_progress+$completed+$failed);
349 if ($missing_users) {
350 foreach ($missing_users as $user_id) {
351 ilLPStatusWrapper::_updateStatus($a_obj_id, $user_id);
352 }
353 }
354 }
355 }
356
363 public static function writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage = false, $a_force_per = false)
364 {
365 global $ilDB;
366
368 $log->debug("obj_id: " . $a_obj_id . ", user id: " . $a_user_id . ", status: " .
369 $a_status . ", percentage: " . $a_percentage . ", force: " . $a_force_per);
370
371 $update_collections = false;
372
373 // get status in DB
374 $set = $ilDB->query(
375 "SELECT usr_id,status,status_dirty FROM ut_lp_marks WHERE " .
376 " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
377 " usr_id = " . $ilDB->quote($a_user_id, "integer")
378 );
379 $rec = $ilDB->fetchAssoc($set);
380
381 // update
382 if ($rec) {
383 // status has changed: update
384 if ($rec["status"] != $a_status) {
385 $ret = $ilDB->manipulate(
386 "UPDATE ut_lp_marks SET " .
387 " status = " . $ilDB->quote($a_status, "integer") . "," .
388 " status_changed = " . $ilDB->now() . "," .
389 " status_dirty = " . $ilDB->quote(0, "integer") .
390 " WHERE usr_id = " . $ilDB->quote($a_user_id, "integer") .
391 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
392 );
393 if ($ret != 0) {
394 $update_collections = true;
395 }
396 }
397 // status has not changed: reset dirty flag
398 elseif ($rec["status_dirty"]) {
399 $ilDB->manipulate(
400 "UPDATE ut_lp_marks SET " .
401 " status_dirty = " . $ilDB->quote(0, "integer") .
402 " WHERE usr_id = " . $ilDB->quote($a_user_id, "integer") .
403 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
404 );
405 }
406 }
407 // insert
408 else {
409 /*
410 $ilDB->manipulate("INSERT INTO ut_lp_marks ".
411 "(status, status_changed, usr_id, obj_id, status_dirty) VALUES (".
412 $ilDB->quote($a_status, "integer").",".
413 $ilDB->now().",".
414 $ilDB->quote($a_user_id, "integer").",".
415 $ilDB->quote($a_obj_id, "integer").",".
416 $ilDB->quote(0, "integer").
417 ")");
418 */
419
420 // #13783
421 $ilDB->replace(
422 "ut_lp_marks",
423 array(
424 "obj_id" => array("integer", $a_obj_id),
425 "usr_id" => array("integer", $a_user_id)
426 ),
427 array(
428 "status" => array("integer", $a_status),
429 "status_changed" => array("timestamp", date("Y-m-d H:i:s")), // was $ilDB->now()
430 "status_dirty" => array("integer", 0)
431 )
432 );
433
434 $update_collections = true;
435 }
436
437 // update percentage
438 if ($a_percentage !== false || $a_force_per) {
439 $a_percentage = max(0, (int) $a_percentage);
440 $a_percentage = min(100, $a_percentage);
441 $ret = $ilDB->manipulate(
442 "UPDATE ut_lp_marks SET " .
443 " percentage = " . $ilDB->quote($a_percentage, "integer") .
444 " WHERE usr_id = " . $ilDB->quote($a_user_id, "integer") .
445 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
446 );
447 }
448
449 // update collections
450 if ($update_collections) {
451 // a change occured - remove existing cache entry
452 include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
453 ilLPStatusWrapper::_removeStatusCache($a_obj_id, $a_user_id);
454
455 $set = $ilDB->query("SELECT ut_lp_collections.obj_id obj_id FROM " .
456 "object_reference JOIN ut_lp_collections ON " .
457 "(object_reference.obj_id = " . $ilDB->quote($a_obj_id, "integer") .
458 " AND object_reference.ref_id = ut_lp_collections.item_id)");
459 while ($rec = $ilDB->fetchAssoc($set)) {
460 if (in_array(ilObject::_lookupType($rec["obj_id"]), array("crs", "grp", "fold"))) {
461 // just to make sure - remove existing cache entry
462 ilLPStatusWrapper::_removeStatusCache($rec["obj_id"], $a_user_id);
463
464 ilLPStatusWrapper::_updateStatus($rec["obj_id"], $a_user_id);
465 }
466 }
467
468 self::raiseEvent($a_obj_id, $a_user_id, $a_status, $a_percentage);
469 }
470
471 return $update_collections;
472 }
473
479 public static function setInProgressIfNotAttempted($a_obj_id, $a_user_id)
480 {
481 global $ilDB;
482
483 // #11513
484
485 $needs_update = false;
486
487 $set = $ilDB->query(
488 "SELECT usr_id, status FROM ut_lp_marks WHERE " .
489 " obj_id = " . $ilDB->quote($a_obj_id, "integer") . " AND " .
490 " usr_id = " . $ilDB->quote($a_user_id, "integer")
491 );
492 if ($rec = $ilDB->fetchAssoc($set)) {
493 // current status is not attempted, so we need to update
494 if ($rec["status"] == self::LP_STATUS_NOT_ATTEMPTED_NUM) {
495 $needs_update = true;
496 }
497 } else {
498 // no ut_lp_marks yet, we should update
499 $needs_update = true;
500 }
501
502 if ($needs_update) {
503 require_once "Services/Tracking/classes/class.ilLPStatusWrapper.php";
504 ilLPStatusWrapper::_updateStatus($a_obj_id, $a_user_id);
505 }
506 }
507
514 public static function setAllDirty()
515 {
516 global $ilDB;
517
518 $ilDB->manipulate(
519 "UPDATE ut_lp_marks SET " .
520 " status_dirty = " . $ilDB->quote(1, "integer")
521 );
522 }
523
530 public static function setDirty($a_obj_id)
531 {
532 global $ilDB;
533
534 $ilDB->manipulate(
535 "UPDATE ut_lp_marks SET " .
536 " status_dirty = " . $ilDB->quote(1, "integer") .
537 " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer")
538 );
539 }
540
548 public static function _lookupStatus($a_obj_id, $a_user_id, $a_create = true)
549 {
550 global $ilDB;
551
552 $set = $ilDB->query(
553 "SELECT status FROM ut_lp_marks WHERE " .
554 " status_dirty = " . $ilDB->quote(0, "integer") .
555 " AND usr_id = " . $ilDB->quote($a_user_id, "integer") .
556 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
557 );
558 if ($rec = $ilDB->fetchAssoc($set)) {
559 return $rec["status"];
560 } elseif ((bool) $a_create) {
561 include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
562 ilLPStatusWrapper::_updateStatus($a_obj_id, $a_user_id);
563 $set = $ilDB->query(
564 "SELECT status FROM ut_lp_marks WHERE " .
565 " status_dirty = " . $ilDB->quote(0, "integer") .
566 " AND usr_id = " . $ilDB->quote($a_user_id, "integer") .
567 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
568 );
569 if ($rec = $ilDB->fetchAssoc($set)) {
570 return $rec["status"];
571 }
572 }
573 }
574
581 public static function _lookupPercentage($a_obj_id, $a_user_id)
582 {
583 global $ilDB;
584
585 $set = $ilDB->query(
586 "SELECT percentage FROM ut_lp_marks WHERE " .
587 " status_dirty = " . $ilDB->quote(0, "integer") .
588 " AND usr_id = " . $ilDB->quote($a_user_id, "integer") .
589 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
590 );
591 if ($rec = $ilDB->fetchAssoc($set)) {
592 return $rec["percentage"];
593 }
594 }
595
603 public static function _hasUserCompleted($a_obj_id, $a_user_id)
604 {
605 return (self::_lookupStatus($a_obj_id, $a_user_id) == self::LP_STATUS_COMPLETED_NUM);
606 }
607
614 public static function _lookupStatusChanged($a_obj_id, $a_user_id)
615 {
616 global $ilDB;
617
618 $set = $ilDB->query(
619 "SELECT status_changed FROM ut_lp_marks WHERE " .
620 " status_dirty = " . $ilDB->quote(0, "integer") .
621 " AND usr_id = " . $ilDB->quote($a_user_id, "integer") .
622 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
623 );
624 if ($rec = $ilDB->fetchAssoc($set)) {
625 return $rec["status_changed"];
626 } else {
627 include_once("./Services/Tracking/classes/class.ilLPStatusWrapper.php");
628 ilLPStatusWrapper::_updateStatus($a_obj_id, $a_user_id);
629 $set = $ilDB->query(
630 "SELECT status_changed FROM ut_lp_marks WHERE " .
631 " status_dirty = " . $ilDB->quote(0, "integer") .
632 " AND usr_id = " . $ilDB->quote($a_user_id, "integer") .
633 " AND obj_id = " . $ilDB->quote($a_obj_id, "integer")
634 );
635 if ($rec = $ilDB->fetchAssoc($set)) {
636 return $rec["status_changed"];
637 }
638 }
639 }
640
649 protected static function _lookupStatusForObject($a_obj_id, $a_status, $a_user_ids = null)
650 {
651 global $ilDB;
652
653 $sql = "SELECT usr_id, status, status_dirty FROM ut_lp_marks" .
654 " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer") .
655 " AND status = " . $ilDB->quote($a_status, "integer");
656 if ($a_user_ids) {
657 $sql .= " AND " . $ilDB->in("usr_id", $a_user_ids, "", "integer");
658 }
659
660 $set = $ilDB->query($sql);
661 $res = array();
662 while ($rec = $ilDB->fetchAssoc($set)) {
663 if ($res["status_dirty"]) {
664 // update status and check again
665 if (self::_lookupStatus($a_obj_id, $rec["usr_id"]) != $a_status) {
666 continue;
667 }
668 }
669 $res[] = $rec["usr_id"];
670 }
671
672 return $res;
673 }
674
682 public static function _lookupCompletedForObject($a_obj_id, $a_user_ids = null)
683 {
684 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_COMPLETED_NUM, $a_user_ids);
685 }
686
694 public static function _lookupFailedForObject($a_obj_id, $a_user_ids = null)
695 {
696 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_FAILED_NUM, $a_user_ids);
697 }
698
706 public static function _lookupInProgressForObject($a_obj_id, $a_user_ids = null)
707 {
708 return self::_lookupStatusForObject($a_obj_id, self::LP_STATUS_IN_PROGRESS_NUM, $a_user_ids);
709 }
710
711
712 //
713 // LIST GUI
714 //
715
724 protected static function validateLPForObjects($a_user_id, $a_obj_ids, $a_parent_ref_id)
725 {
726 $lp_invalid = array();
727
728 include_once "Services/Object/classes/class.ilObjectLP.php";
729 $memberships = ilObjectLP::getLPMemberships($a_user_id, $a_obj_ids, $a_parent_ref_id);
730 foreach ($memberships as $obj_id => $status) {
731 if (!$status) {
732 $lp_invalid[] = $obj_id;
733 }
734 }
735
736 return array_diff($a_obj_ids, $lp_invalid);
737 }
738
745 protected static function checkLPModesForObjects($a_obj_ids, array &$a_coll_obj_ids)
746 {
747 $valid = array();
748
749 // all lp modes with collections (gathered separately)
750 include_once "Services/Tracking/classes/collection/class.ilLPCollection.php";
752
753 include_once "Services/Tracking/classes/class.ilLPObjSettings.php";
754
755 // check if objects have LP activated at all (DB entries)
756 $existing = ilLPObjSettings::_lookupDBModeForObjects($a_obj_ids);
757 foreach ($existing as $obj_id => $obj_mode) {
758 if ($obj_mode != ilLPObjSettings::LP_MODE_DEACTIVATED) {
760
761 if (in_array($obj_mode, $coll_modes)) {
762 $a_coll_obj_ids[] = $obj_id;
763 }
764 }
765 }
766
767 // missing objects in DB (default mode)
768 include_once "Services/Object/classes/class.ilObjectLP.php";
769 if (sizeof($existing) != sizeof($a_obj_ids)) {
770 foreach (array_diff($a_obj_ids, $existing) as $obj_id) {
772 $mode = $olp->getCurrentMode();
774 // #11141
775 unset($valid[$obj_id]);
776 } elseif ($mode != ilLPObjSettings::LP_MODE_UNDEFINED) {
778
779 if (in_array($mode, $coll_modes)) {
780 $a_coll_obj_ids[] = $obj_id;
781 }
782 }
783 }
784 unset($existing);
785 }
786
787 return array_values($valid);
788 }
789
797 protected static function getLPStatusForObjects($a_user_id, $a_obj_ids)
798 {
799 global $ilDB;
800
801 $res = array();
802
803 // get user lp data
804 $sql = "SELECT status, status_dirty, obj_id FROM ut_lp_marks" .
805 " WHERE " . $ilDB->in("obj_id", $a_obj_ids, "", "integer") .
806 " AND usr_id = " . $ilDB->quote($a_user_id, "integer");
807 $set = $ilDB->query($sql);
808 while ($row = $ilDB->fetchAssoc($set)) {
809 if (!$row["status_dirty"]) {
810 $res[$row["obj_id"]] = $row["status"];
811 } else {
812 $res[$row["obj_id"]] = self::_lookupStatus($row["obj_id"], $a_user_id);
813 }
814 }
815
816 // process missing user entries (same as dirty entries, see above)
817 foreach ($a_obj_ids as $obj_id) {
818 if (!isset($res[$obj_id])) {
819 $res[$obj_id] = self::_lookupStatus($obj_id, $a_user_id);
820 if ($res[$obj_id] === null) {
822 }
823 }
824 }
825
826 return $res;
827 }
828
829 public static function preloadListGUIData($a_obj_ids)
830 {
831 global $ilUser, $lng;
832
833 $user_id = $ilUser->getId();
834
835 $res = array();
836
837 include_once("Services/Tracking/classes/class.ilObjUserTracking.php");
838 if ($ilUser->getId() != ANONYMOUS_USER_ID &&
842 // -- validate
843
844 // :TODO: we need the parent ref id, but this is awful
845 $a_obj_ids = self::validateLPForObjects($user_id, $a_obj_ids, (int) $_GET["ref_id"]);
846
847 // we are not handling the collections differently yet
848 $coll_obj_ids = array();
849 $a_obj_ids = self::checkLPModesForObjects($a_obj_ids, $coll_obj_ids);
850
851
852 // -- gather
853
854 $res = self::getLPStatusForObjects($user_id, $a_obj_ids);
855
856
857 // -- render
858
859 // value to icon
860 $lng->loadLanguageModule("trac");
861 include_once("./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
862 foreach ($res as $obj_id => $status) {
866 }
867 }
868
869 self::$list_gui_cache = $res;
870 }
871
872 public static function getListGUIStatus($a_obj_id, $a_image_only = false)
873 {
874 if ($a_image_only) {
875 $image = '';
876 if (isset(self::$list_gui_cache[$a_obj_id]["image"])) {
877 $image = self::$list_gui_cache[$a_obj_id]["image"];
878 }
879
880 return $image;
881 }
882 return self::$list_gui_cache[$a_obj_id];
883 }
884}
sprintf('%.4f', $callTime)
date( 'd-M-Y', $objPHPExcel->getProperties() ->getCreated())
$failed
Definition: Utf8Test.php:85
$_GET["client_id"]
An exception for terminatinating execution or to throw for unit testing.
static _lookupDBModeForObjects(array $a_obj_ids)
static _getInstance($a_obj_id, $a_mode=null)
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _getNotAttempted($a_obj_id)
Static function to read the number of user who have the status 'not_attempted'.
static _removeStatusCache($a_obj_id, $a_usr_id)
static _getCompleted($a_obj_id)
Static function to read the users who have the status 'completed'.
static _getInProgress($a_obj_id)
Static function to read users who have the status 'in_progress'.
static _getFailed($a_obj_id)
Static function to read the users who have the status 'completed'.
Abstract class ilLPStatus for all learning progress modes E.g ilLPStatusManual, ilLPStatusObjectives ...
const LP_STATUS_COMPLETED_NUM
_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 _lookupStatusForObject($a_obj_id, $a_status, $a_user_ids=null)
Get users with given status for object.
const LP_STATUS_NOT_PARTICIPATED
static _getStatusInfo($a_obj_id)
static preloadListGUIData($a_obj_ids)
determineStatus($a_obj_id, $a_usr_id, $a_obj=null)
Determine status.
static _getInProgress($a_obj_id)
static _getCountInProgress($a_obj_id)
static _getTypicalLearningTime($a_obj_id)
static _lookupStatus($a_obj_id, $a_user_id, $a_create=true)
Lookup status.
determinePercentage($a_obj_id, $a_usr_id, $a_obj=null)
Determine percentage.
const LP_STATUS_COMPLETED
static _lookupInProgressForObject($a_obj_id, $a_user_ids=null)
Get in progress users for object.
static setInProgressIfNotAttempted($a_obj_id, $a_user_id)
This function shoudl be clalled for normal "read events".
static _lookupFailedForObject($a_obj_id, $a_user_ids=null)
Get failed users for object.
const LP_STATUS_NOT_REGISTERED
const LP_STATUS_PARTICIPATED
const LP_STATUS_FAILED
const LP_STATUS_IN_PROGRESS_NUM
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 _getCompleted($a_obj_id)
__construct($a_obj_id)
static _getCountNotAttempted($a_obj_id)
static _hasUserCompleted($a_obj_id, $a_user_id)
Lookup user object completion.
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_REGISTERED
static checkLPModesForObjects($a_obj_ids, array &$a_coll_obj_ids)
Process lp modes for given objects.
refreshStatus($a_obj_id, $a_users=null)
Refresh status.
static _getNotAttempted($a_obj_id)
static setAllDirty()
Sets all status to dirty.
static _getCountCompleted($a_obj_id)
static getListGUIStatus($a_obj_id, $a_image_only=false)
static getLPStatusForObjects($a_user_id, $a_obj_ids)
Get LP status for given objects (and user)
static _lookupStatusChanged($a_obj_id, $a_user_id)
Lookup status changed.
static $list_gui_cache
static _lookupCompletedForObject($a_obj_id, $a_user_ids=null)
Get completed users for object.
static setDirty($a_obj_id)
Sets status of an object to dirty.
const LP_STATUS_FAILED_NUM
static validateLPForObjects($a_user_id, $a_obj_ids, $a_parent_ref_id)
Process given objects for lp-relevance.
static _lookupPercentage($a_obj_id, $a_user_id)
Lookup percentage.
static raiseEvent($a_obj_id, $a_usr_id, $a_status, $a_percentage)
static _getFailed($a_obj_id)
static _getCountFailed()
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
static writeStatus($a_obj_id, $a_user_id, $a_status, $a_percentage=false, $a_force_per=false)
Write status for user and object.
static _getStatusText($a_status, $a_lng=null)
Get status alt text.
static _getImagePathForStatus($a_status)
Get image path for status.
static getLogger($a_component_id)
Get component logger.
static _getTypicalLearningTimeSeconds($a_rbac_id, $a_obj_id=0)
static _enabledLearningProgress()
check wether learing progress is enabled or not
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)
static getInstance($a_obj_id)
static _lookupType($a_id, $a_reference=false)
lookup object type
static img($a_src, $a_alt="", $a_width="", $a_height="", $a_border=0, $a_id="", $a_class="")
Build img tag.
$valid
$r
Definition: example_031.php:79
$ret
Definition: parser.php:6
global $lng
Definition: privfeed.php:17
foreach($_POST as $key=> $value) $res
global $ilDB
$ilUser
Definition: imgupload.php:18
$text
Definition: errorreport.php:18