ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilCalendarCategories.php
Go to the documentation of this file.
1<?php
2/*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2006 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +-----------------------------------------------------------------------------+
22*/
23
24
35{
36 const MODE_REPOSITORY = 2; // course/group full calendar view (allows to select other calendars)
40 const MODE_MANAGE = 6;
44 const MODE_REPOSITORY_CONTAINER_ONLY = 10; // course/group content view (side block, focus on course/group appointments only)
46
47 protected static $instance = null;
48
49 protected $db;
50
51 protected $user_id;
52
53 protected $mode = 0;
54
55 protected $categories = array();
56 protected $categories_info = array();
57 protected $subitem_categories = array();
58
59 protected $root_ref_id = 0;
60 protected $root_obj_id = 0;
61
62
63 protected $ch_user_id = 0;
64 protected $target_ref_id = 0;
65
69 protected $logger = null;
70
74 protected $fav_rep;
75
83 public function __construct($a_usr_id = 0)
84 {
85 global $DIC;
86
87 $ilUser = $DIC['ilUser'];
88 $ilDB = $DIC['ilDB'];
89
90 $this->logger = $GLOBALS['DIC']->logger()->cal();
91
92 $this->user_id = $a_usr_id;
93 if (!$this->user_id) {
94 $this->user_id = $ilUser->getId();
95 }
96 $this->db = $ilDB;
97
98 $this->fav_rep = new ilFavouritesDBRepository();
99 }
100
109 public static function _getInstance($a_usr_id = 0)
110 {
111 if (self::$instance) {
112 return self::$instance;
113 }
114 return self::$instance = new ilCalendarCategories($a_usr_id);
115 }
116
125 public static function _lookupCategoryIdByObjId($a_obj_id)
126 {
127 global $DIC;
128
129 $ilDB = $DIC['ilDB'];
130
131 $query = "SELECT cat_id FROM cal_categories " .
132 "WHERE obj_id = " . $ilDB->quote($a_obj_id, 'integer') . " " .
133 "AND type = " . $ilDB->quote(ilCalendarCategory::TYPE_OBJ, 'integer') . " ";
134
135 $res = $ilDB->query($query);
136 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
137 return $row->cat_id;
138 }
139 return 0;
140 }
141
142
152 public static function _isOwner($a_usr_id, $a_cal_id)
153 {
154 global $DIC;
155
156 $ilDB = $DIC['ilDB'];
157
158 $query = "SELECT * FROM cal_categories " .
159 "WHERE cat_id = " . $ilDB->quote($a_cal_id, 'integer') . " " .
160 "AND obj_id = " . $ilDB->quote($a_usr_id, 'integer') . " " .
161 "AND type = " . $ilDB->quote(ilCalendarCategory::TYPE_USR, 'integer') . " ";
162 $res = $ilDB->query($query);
163 return $res->numRows() ? true : false;
164 }
165
171 public static function deletePDItemsCache($a_usr_id)
172 {
173 ilCalendarCache::getInstance()->deleteByAdditionalKeys(
174 $a_usr_id,
175 self::MODE_PERSONAL_DESKTOP_ITEMS,
176 'categories'
177 );
178 }
179
185 public static function deleteRepositoryCache($a_usr_id)
186 {
187 ilCalendarCache::getInstance()->deleteByAdditionalKeys(
188 $a_usr_id,
189 self::MODE_REPOSITORY,
190 'categories'
191 );
192 }
193
194
199 protected function sleep()
200 {
201 return serialize(
202 array(
203 'categories' => $this->categories,
204 'categories_info' => $this->categories_info,
205 'subitem_categories' => $this->subitem_categories
206 )
207 );
208 }
209
215 protected function wakeup($a_ser)
216 {
217 $info = unserialize($a_ser);
218
219 $this->categories = $info['categories'];
220 $this->categories_info = $info['categories_info'];
221 $this->subitem_categories = $info['subitem_categories'];
222 }
223
228 public function setCHUserId($a_user_id)
229 {
230 $this->ch_user_id = $a_user_id;
231 }
232
233
238 public function getCHUserId()
239 {
240 return $this->ch_user_id;
241 }
242
243 protected function setMode($a_mode)
244 {
245 $this->mode = $a_mode;
246 }
247
248 public function getMode()
249 {
250 return $this->mode;
251 }
252
253 protected function setTargetRefId($a_ref_id)
254 {
255 $this->target_ref_id = $a_ref_id;
256 }
257
258 public function getTargetRefId()
259 {
261 }
262
268 public function setSourceRefId($a_val)
269 {
270 $this->root_ref_id = $a_val;
271 }
272
278 public function getSourceRefId()
279 {
280 return $this->root_ref_id;
281 }
282
291 public function initialize($a_mode, $a_source_ref_id = 0, $a_use_cache = false, $a_cat_id = 0)
292 {
293 if ($this->getMode() != 0) {
294 include_once("./Services/Calendar/exceptions/class.ilCalCategoriesInitializedMultipleException.php");
295 throw new ilCalCategoriesInitializedMultipleException("ilCalendarCategories is initialized multiple times for user " . $this->user_id . ".");
296 }
297
298 $this->setMode($a_mode);
299
300 // see comments in https://mantis.ilias.de/view.php?id=25254
301 if ($a_use_cache && $this->getMode() != self::MODE_REPOSITORY_CONTAINER_ONLY) {
302 // Read categories from cache
303 if ($cats = ilCalendarCache::getInstance()->getEntry($this->user_id . ':' . $a_mode . ':categories:' . (int) $a_source_ref_id)) {
304 if ($this->getMode() != self::MODE_REPOSITORY &&
305 $this->getMode() != self::MODE_CONSULTATION &&
306 $this->getMode() != self::MODE_PORTFOLIO_CONSULTATION) {
307 $this->wakeup($cats);
308 return;
309 }
310 }
311 }
312
313 switch ($this->getMode()) {
315 include_once('./Services/Calendar/classes/class.ilCalendarUserSettings.php');
317 $this->readPDCalendars();
318 } else {
320 }
321 break;
322
324 $this->readSelectedCalendar($a_source_ref_id);
325 break;
326
328 $this->readPDCalendars();
329 break;
330
333 break;
334
336 $this->root_ref_id = $a_source_ref_id;
337 $this->root_obj_id = ilObject::_lookupObjId($this->root_ref_id);
338 $this->readReposCalendars();
339 break;
340
342 $this->root_ref_id = $a_source_ref_id;
343 $this->root_obj_id = ilObject::_lookupObjId($this->root_ref_id);
344 $this->readReposCalendars(true);
345 break;
346
348 $this->readPDCalendars();
350 break;
351
353 #$this->readPrivateCalendars();
354 $this->setTargetRefId($a_source_ref_id);
355 $this->readConsultationHoursCalendar($a_source_ref_id);
356 break;
357
360 break;
361
363 $this->readSingleCalendar($a_cat_id);
364 break;
365 }
366
367 if ($a_use_cache) {
368 // Store in cache
369 ilCalendarCache::getInstance()->storeEntry(
370 $this->user_id . ':' . $a_mode . ':categories:' . (int) $a_source_ref_id,
371 $this->sleep(),
372 $this->user_id,
373 $a_mode,
374 'categories'
375 );
376 }
377 }
378
386 public function getCategoryInfo($a_cat_id)
387 {
388 if (isset($this->categories_info[$a_cat_id])) {
389 return $this->categories_info[$a_cat_id];
390 }
391
392 if (in_array($a_cat_id, (array) $this->subitem_categories)) {
393 foreach ($this->categories as $cat_id) {
394 if (in_array($a_cat_id, $this->categories_info[$cat_id]['subitem_ids'])) {
395 return $this->categories_info[$cat_id];
396 }
397 }
398 }
399 }
400
401
409 public function getCategoriesInfo()
410 {
411 return $this->categories_info ? $this->categories_info : array();
412 }
413
420 public function getCategories($a_include_subitem_calendars = false)
421 {
422 if ($a_include_subitem_calendars) {
423 return array_merge((array) $this->categories, (array) $this->subitem_categories);
424 }
425
426 return $this->categories ? $this->categories : array();
427 }
428
435 public function getSubitemCategories($a_cat_id)
436 {
437 if (!isset($this->categories_info[$a_cat_id]['subitem_ids'])) {
438 return array($a_cat_id);
439 }
440 return array_merge((array) $this->categories_info[$a_cat_id]['subitem_ids'], array($a_cat_id));
441 }
442
443
452 {
453 global $DIC;
454
455 $lng = $DIC['lng'];
456
457 $has_personal_calendar = false;
458 foreach ($this->categories_info as $info) {
459 if ($info['obj_type'] == 'sess' || $info['obj_type'] == 'exc') {
460 continue;
461 }
462
463 if ($info['remote'] == ilCalendarCategory::LTYPE_REMOTE) {
464 continue;
465 }
466
467 if ($info['type'] == ilCalendarCategory::TYPE_USR and $info['editable']) {
468 $has_personal_calendar = true;
469 }
470
471 if ($info['editable']) {
472 $cats[$info['cat_id']] = $info['title'];
473 }
474 }
475 // If there
476 if (!$has_personal_calendar) {
477 $cats[0] = $lng->txt('cal_default_calendar');
478 }
479 return $cats ? $cats : array();
480 }
481
487 public function getNotificationCalendars()
488 {
489 $not = array();
490 foreach ($this->categories_info as $info) {
491 if ($info['type'] == ilCalendarCategory::TYPE_OBJ and $info['editable'] == true) {
492 if (ilObject::_lookupType($info['obj_id']) == 'crs' or ilObject::_lookupType($info['obj_id']) == 'grp') {
493 $not[] = $info['cat_id'];
494 }
495 }
496 }
497 return $not;
498 }
499
507 public function isEditable($a_cat_id)
508 {
509 return isset($this->categories_info[$a_cat_id]['editable']) and $this->categories_info[$a_cat_id]['editable'];
510 }
511
519 public function isVisible($a_cat_id)
520 {
521 return in_array($a_cat_id, $this->categories) or
522 in_array($a_cat_id, (array) $this->subitem_categories);
523 }
524
525
526
527
535 protected function readPDCalendars()
536 {
537 global $DIC;
538
539 $rbacsystem = $DIC['rbacsystem'];
540
541
542 $this->readPublicCalendars();
543 $this->readPrivateCalendars();
545 $this->readBookingCalendar();
546
547 include_once('./Services/Membership/classes/class.ilParticipants.php');
550
551 $this->addSubitemCalendars();
552 }
553
558 protected function readSelectedCalendar($a_cal_id)
559 {
560 include_once './Services/Calendar/classes/class.ilCalendarCategory.php';
561 $cat = new ilCalendarCategory($a_cal_id);
562 if ($cat->getType() == ilCalendarCategory::TYPE_OBJ) {
563 $this->readSelectedCategories(array($cat->getObjId()));
564 $this->addSubitemCalendars();
565 } else {
566 $this->categories[] = $a_cal_id;
567 }
568 }
569
576 protected function readSelectedItemCalendars()
577 {
578 global $DIC;
579
580 $ilUser = $DIC['ilUser'];
581 $ilAccess = $DIC['ilAccess'];
582
583 $this->readPublicCalendars();
584 $this->readPrivateCalendars();
586 $this->readBookingCalendar();
587
588 $obj_ids = array();
589
590 $courses = array();
591 $groups = array();
592 $sessions = array();
593 $exercises = array();
594 foreach ($this->fav_rep->getFavouritesOfUser($ilUser->getId(), array('crs','grp','sess','exc')) as $item) {
595 if ($ilAccess->checkAccess('read', '', $item['ref_id'])) {
596 switch ($item['type']) {
597 case 'crs':
598 $courses[] = $item['obj_id'];
599 break;
600
601 case 'sess':
602 $sessions[] = $item['obj_id'];
603 break;
604
605 case 'grp':
606 $groups[] = $item['obj_id'];
607 break;
608
609 case 'exc':
610 $exercises[] = $item['obj_id'];
611 break;
612 }
613 }
614 }
615 $this->readSelectedCategories($courses);
616 $this->readSelectedCategories($sessions);
617 $this->readSelectedCategories($groups);
618 $this->readSelectedCategories($exercises);
619
620 $this->addSubitemCalendars();
621 }
622
630 protected function readReposCalendars($a_container_only = false)
631 {
632 global $DIC;
633
634 $ilAccess = $DIC['ilAccess'];
635 $tree = $DIC['tree'];
636 global $DIC;
637
638 $ilDB = $DIC['ilDB'];
639
640 if (!$a_container_only) {
641 $this->readPublicCalendars();
642 $this->readPrivateCalendars();
643 //$this->readConsultationHoursCalendar($this->root_ref_id);
644 $this->readAllConsultationHoursCalendarOfContainer($this->root_ref_id);
645 }
646
647
648
649 #$query = "SELECT ref_id,obd.obj_id obj_id FROM tree t1 ".
650 # "JOIN object_reference obr ON t1.child = obr.ref_id ".
651 # "JOIN object_data obd ON obd.obj_id = obr.obj_id ".
652 # "WHERE t1.lft >= (SELECT lft FROM tree WHERE child = ".$this->db->quote($this->root_ref_id,'integer')." ) ".
653 # "AND t1.lft <= (SELECT rgt FROM tree WHERE child = ".$this->db->quote($this->root_ref_id,'integer')." ) ".
654 # "AND ".$ilDB->in('type',array('crs','grp','sess'),false,'text')." ".
655 # "AND tree = 1";
656
657 // alternative 1: do not aggregate items of current course
658 if (!true) { //
659 $subtree_query = $GLOBALS['DIC']['tree']->getSubTreeQuery(
660 $this->root_ref_id,
661 array('object_reference.ref_id', 'object_data.obj_id'),
662 array('crs', 'grp', 'sess', 'exc')
663 );
664
665 $res = $ilDB->query($subtree_query);
666 $obj_ids = array();
667 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
668 if ($tree->isDeleted($row->ref_id)) {
669 continue;
670 }
671
672 $obj_type = ilObject::_lookupType($row->obj_id);
673 if ($obj_type == 'crs' or $obj_type == 'grp') {
674 //Added for calendar revision --> https://goo.gl/CXGTRF
675 //In 5.2-trunk, the booking pools did not appear in the marginal calendar.
676 $this->readBookingCalendar();
677 // Check for global/local activation
678 if (!ilCalendarSettings::_getInstance()->lookupCalendarActivated($row->obj_id)) {
679 continue;
680 }
681 }
682 if ($ilAccess->checkAccess('read', '', $row->ref_id)) {
683 $obj_ids[] = $row->obj_id;
684 }
685 }
686 $this->readSelectedCategories($obj_ids, $this->root_ref_id);
687 } else { // alternative 2: aggregate items of current course (discussion with timon 3.8.3017: this is the current preference)
688 $this->readSelectedCategories(array($this->root_obj_id), $this->root_ref_id);
689 }
690
691 $this->addSubitemCalendars();
692
693
694 if (!$a_container_only) {
697 }
698 }
699
700 public function readSingleCalendar($a_cat_id)
701 {
702 include_once './Services/Calendar/classes/class.ilCalendarCategory.php';
703 $cat = new ilCalendarCategory($a_cat_id);
704 switch ($cat->getType()) {
706 $this->readSelectedCalendar($a_cat_id);
707 break;
708
710 $this->readPublicCalendars(array($a_cat_id));
711 break;
712
714 $this->readPrivateCalendars(array($a_cat_id));
715 break;
716
718 $this->readConsultationHoursCalendar($this->root_ref_id, $a_cat_id);
719 break;
720
722 $this->readBookingCalendar();
723 break;
724 }
725 }
726
733 protected function readPublicCalendars($cat_ids = null)
734 {
735 global $DIC;
736
737 $rbacsystem = $DIC['rbacsystem'];
738 $ilAccess = $DIC['ilAccess'];
739
740 $in = "";
741 if (is_array($cat_ids)) {
742 $in = " AND " . $this->db->in('cat_id', $cat_ids, false, 'integer') . " ";
743 }
744
745 // global categories
746 $query = "SELECT * FROM cal_categories " .
747 "WHERE type = " . $this->db->quote(ilCalendarCategory::TYPE_GLOBAL, 'integer') . " " . $in .
748 "ORDER BY title ";
749
750 $res = $this->db->query($query);
751 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
752 $this->categories[] = $row->cat_id;
753 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
754 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
755 $this->categories_info[$row->cat_id]['title'] = $row->title;
756 $this->categories_info[$row->cat_id]['color'] = $row->color;
757 $this->categories_info[$row->cat_id]['type'] = $row->type;
758 $this->categories_info[$row->cat_id]['editable'] = $rbacsystem->checkAccess('edit_event', ilCalendarSettings::_getInstance()->getCalendarSettingsId());
759 $this->categories_info[$row->cat_id]['settings'] = $rbacsystem->checkAccess('write', ilCalendarSettings::_getInstance()->getCalendarSettingsId());
760 $this->categories_info[$row->cat_id]['accepted'] = false;
761 $this->categories_info[$row->cat_id]['remote'] = ($row->loc_type == ilCalendarCategory::LTYPE_REMOTE);
762 }
763
764 return true;
765 }
766
773 protected function readPrivateCalendars($only_cat_ids = null)
774 {
775 global $DIC;
776
777 $ilUser = $DIC['ilUser'];
778 global $DIC;
779
780 $ilDB = $DIC['ilDB'];
781
782 $in = "";
783 if (is_array($only_cat_ids)) {
784 $in = " AND " . $this->db->in('cat_id', $only_cat_ids, false, 'integer') . " ";
785 }
786
787 // First read private calendars of user
788 $query = "SELECT cat_id FROM cal_categories " .
789 "WHERE type = " . $this->db->quote(ilCalendarCategory::TYPE_USR, 'integer') . " " .
790 "AND obj_id = " . $this->db->quote($ilUser->getId(), 'integer') . " " . $in;
791 $res = $this->db->query($query);
792 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
793 $cat_ids[] = $row->cat_id;
794 }
795
796 // Read shared calendars
797 include_once('./Services/Calendar/classes/class.ilCalendarSharedStatus.php');
799 if (!$cat_ids = array_merge((array) $cat_ids, $accepted_ids)) {
800 return true;
801 }
802
803 if (is_array($only_cat_ids)) {
804 $cat_ids = array_filter($cat_ids, function ($id) use ($only_cat_ids) {
805 return in_array($id, $only_cat_ids);
806 });
807 }
808
809 // user categories
810 $query = "SELECT * FROM cal_categories " .
811 "WHERE type = " . $this->db->quote(ilCalendarCategory::TYPE_USR, 'integer') . " " .
812 "AND " . $ilDB->in('cat_id', $cat_ids, false, 'integer') . " " .
813 "ORDER BY title ";
814
815 $res = $this->db->query($query);
816 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
817 $this->categories[] = $row->cat_id;
818 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
819 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
820 $this->categories_info[$row->cat_id]['title'] = $row->title;
821 $this->categories_info[$row->cat_id]['color'] = $row->color;
822 $this->categories_info[$row->cat_id]['type'] = $row->type;
823
824 include_once './Services/Calendar/classes/class.ilCalendarShared.php';
825 if (in_array($row->cat_id, $accepted_ids)) {
826 $shared = new ilCalendarShared($row->cat_id);
827 if ($shared->isEditableForUser($ilUser->getId())) {
828 $this->categories_info[$row->cat_id]['editable'] = true;
829 } else {
830 $this->categories_info[$row->cat_id]['editable'] = false;
831 }
832 } else {
833 $this->categories_info[$row->cat_id]['editable'] = true;
834 }
835 if ($ilUser->getId() == $row->obj_id) {
836 $this->categories_info[$row->cat_id]['settings'] = true;
837 } else {
838 $this->categories_info[$row->cat_id]['settings'] = false;
839 }
840
841 $this->categories_info[$row->cat_id]['accepted'] = in_array($row->cat_id, $accepted_ids);
842 $this->categories_info[$row->cat_id]['remote'] = ($row->loc_type == ilCalendarCategory::LTYPE_REMOTE);
843 }
844 }
845
850 public function readAllConsultationHoursCalendarOfContainer($a_container_ref_id)
851 {
852 include_once "Modules/Course/classes/class.ilCourseParticipants.php";
853 $obj_id = ilObject::_lookupObjId($a_container_ref_id);
854 $participants = ilCourseParticipants::_getInstanceByObjId($obj_id);
855 $users = array_unique(array_merge($participants->getTutors(), $participants->getAdmins()));
856 include_once 'Services/Booking/classes/class.ilBookingEntry.php';
857 $users = ilBookingEntry::lookupBookableUsersForObject($obj_id, $users);
858 $old_ch = $this->getCHUserId();
859 foreach ($users as $user) {
860 $this->setCHUserId($user);
861 $this->readConsultationHoursCalendar($a_container_ref_id);
862 }
863 $this->setCHUserId($old_ch);
864 }
865
871 public function readConsultationHoursCalendar($a_target_ref_id = null, $a_cat_id = 0)
872 {
873 global $DIC;
874
875 $ilDB = $DIC['ilDB'];
876 $lng = $DIC['lng'];
877
878 if (!$this->getCHUserId()) {
879 $this->setCHUserId($this->user_id);
880 }
881
882 if ($a_target_ref_id) {
883 $target_obj_id = ilObject::_lookupObjId($a_target_ref_id);
884
885 $query = 'SELECT DISTINCT(cc.cat_id) FROM booking_entry be ' .
886 'LEFT JOIN booking_obj_assignment bo ON be.booking_id = bo.booking_id ' .
887 'JOIN cal_entries ce ON be.booking_id = ce.context_id ' .
888 'JOIN cal_cat_assignments ca ON ce.cal_id = ca.cal_id ' .
889 'JOIN cal_categories cc ON ca.cat_id = cc.cat_id ' .
890 'WHERE ((bo.target_obj_id IS NULL) OR bo.target_obj_id = ' . $ilDB->quote($target_obj_id, 'integer') . ' ) ';
891
892 // limit only to user if no cat id is given
893 if ($a_cat_id == 0) {
894 $query .= 'AND cc.obj_id = ' . $ilDB->quote($this->getCHUserId(), 'integer');
895 }
896
897
898 $res = $ilDB->query($query);
899 $categories = array();
900 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
901 if ($a_cat_id == 0 || $row->cat_id == $a_cat_id) {
902 $categories[] = $row->cat_id;
903 }
904 }
905
906 if ($categories) {
907 $query = 'SELECT * FROM cal_categories ' .
908 'WHERE ' . $ilDB->in('cat_id', $categories, false, 'integer');
909 $res = $ilDB->query($query);
910 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
911 $this->categories[] = $row->cat_id;
912 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
913 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
914 $this->categories_info[$row->cat_id]['title'] = ilObjUser::_lookupFullname($row->obj_id);
915 $this->categories_info[$row->cat_id]['color'] = $row->color;
916 $this->categories_info[$row->cat_id]['type'] = $row->type;
917 $this->categories_info[$row->cat_id]['editable'] = false;
918 $this->categories_info[$row->cat_id]['settings'] = false;
919 $this->categories_info[$row->cat_id]['accepted'] = false;
920 $this->categories_info[$row->cat_id]['remote'] = false;
921 }
922 }
923 } else { // no category given
924 $filter = ($a_cat_id > 0)
925 ? " AND cat_id = " . $ilDB->quote($a_cat_id, "integer")
926 : " AND obj_id = " . $ilDB->quote($this->getCHUserId(), 'integer');
927
928 $query = "SELECT * FROM cal_categories cc " .
929 "WHERE type = " . $ilDB->quote(ilCalendarCategory::TYPE_CH, 'integer') . ' ' . $filter;
930 $res = $ilDB->query($query);
931 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
932 $this->categories[] = $row->cat_id;
933 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
934 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
935 $this->categories_info[$row->cat_id]['title'] = $row->title;
936 $this->categories_info[$row->cat_id]['color'] = $row->color;
937 $this->categories_info[$row->cat_id]['type'] = $row->type;
938 $this->categories_info[$row->cat_id]['editable'] = false;
939 $this->categories_info[$row->cat_id]['settings'] = false;
940 $this->categories_info[$row->cat_id]['accepted'] = false;
941 $this->categories_info[$row->cat_id]['remote'] = false;
942 }
943 }
944 return true;
945 }
946
952 public function readBookingCalendar($user_id = null)
953 {
954 global $DIC;
955
956 $ilDB = $DIC['ilDB'];
957
958 if (!$user_id) {
960 }
961
962 $query = "SELECT * FROM cal_categories " .
963 "WHERE type = " . $ilDB->quote(ilCalendarCategory::TYPE_BOOK, 'integer') . ' ' .
964 "AND obj_id = " . $ilDB->quote($user_id, 'integer');
965 $res = $ilDB->query($query);
966 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
967 $this->categories[] = $row->cat_id;
968 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
969 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
970 $this->categories_info[$row->cat_id]['title'] = $row->title;
971 $this->categories_info[$row->cat_id]['color'] = $row->color;
972 $this->categories_info[$row->cat_id]['type'] = $row->type;
973 $this->categories_info[$row->cat_id]['editable'] = false;
974 $this->categories_info[$row->cat_id]['settings'] = false;
975 $this->categories_info[$row->cat_id]['accepted'] = false;
976 $this->categories_info[$row->cat_id]['remote'] = false;
977 }
978 }
979
986 protected function readSelectedCategories($a_obj_ids, $a_source_ref_id = 0)
987 {
988 global $DIC;
989
990 $ilAccess = $DIC['ilAccess'];
991 $tree = $DIC['tree'];
992 global $DIC;
993
994 $ilDB = $DIC['ilDB'];
995
996 if (!count($a_obj_ids)) {
997 return true;
998 }
999
1000 $query = "SELECT * FROM cal_categories " .
1001 "WHERE type = " . $this->db->quote(ilCalendarCategory::TYPE_OBJ, 'integer') . " " .
1002 "AND " . $ilDB->in('obj_id', $a_obj_ids, false, 'integer') . " " .
1003 "ORDER BY title ";
1004
1005 $res = $this->db->query($query);
1006 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
1007 // check activation/deactivation
1008 $obj_type = ilObject::_lookupType($row->obj_id);
1009 if ($obj_type == 'crs' or $obj_type == 'grp') {
1010 if (!ilCalendarSettings::_getInstance()->lookupCalendarActivated($row->obj_id)) {
1011 continue;
1012 }
1013 }
1014
1015 $editable = false;
1016 $exists = false;
1017 $settings = false;
1018 foreach (ilObject::_getAllReferences($row->obj_id) as $ref_id) {
1019 if ($ilAccess->checkAccess('edit_event', '', $ref_id)) {
1020 $settings = true;
1021 }
1022 if ($ilAccess->checkAccess('edit_event', '', $ref_id)) {
1023 $exists = true;
1024 $editable = true;
1025 break;
1026 } elseif ($ilAccess->checkAccess('read', '', $ref_id)) {
1027 $exists = true;
1028 }
1029 }
1030 if (!$exists) {
1031 continue;
1032 }
1033 $this->categories_info[$row->cat_id]['editable'] = $editable;
1034 $this->categories_info[$row->cat_id]['settings'] = $settings;
1035
1036 $this->categories[] = $row->cat_id;
1037 $this->categories_info[$row->cat_id]['obj_id'] = $row->obj_id;
1038 $this->categories_info[$row->cat_id]['cat_id'] = $row->cat_id;
1039 $this->categories_info[$row->cat_id]['color'] = $row->color;
1040 #$this->categories_info[$row->cat_id]['title'] = ilObject::_lookupTitle($row->obj_id);
1041 $this->categories_info[$row->cat_id]['title'] = $row->title;
1042 $this->categories_info[$row->cat_id]['obj_type'] = ilObject::_lookupType($row->obj_id);
1043 $this->categories_info[$row->cat_id]['type'] = $row->type;
1044 $this->categories_info[$row->cat_id]['remote'] = false;
1045 $this->categories_info[$row->cat_id]['source_ref_id'] = $a_source_ref_id;
1046 }
1047 }
1048
1055 protected function addSubitemCalendars()
1056 {
1057 global $DIC;
1058
1059 $ilDB = $DIC->database();
1060 $access = $DIC->access();
1061
1062 $course_ids = array();
1063 foreach ($this->categories as $cat_id) {
1064 if ($this->categories_info[$cat_id]['obj_type'] == 'crs' or $this->categories_info[$cat_id]['obj_type'] == 'grp') {
1065 $course_ids[] = $this->categories_info[$cat_id]['obj_id'];
1066 }
1067 }
1068
1069 $query = "SELECT od2.obj_id sess_id, od1.obj_id crs_id,cat_id, or2.ref_id sess_ref_id FROM object_data od1 " .
1070 "JOIN object_reference or1 ON od1.obj_id = or1.obj_id " .
1071 "JOIN tree t ON or1.ref_id = t.parent " .
1072 "JOIN object_reference or2 ON t.child = or2.ref_id " .
1073 "JOIN object_data od2 ON or2.obj_id = od2.obj_id " .
1074 "JOIN cal_categories cc ON od2.obj_id = cc.obj_id " .
1075 "WHERE " . $ilDB->in('od2.type', array('sess','exc'), false, 'text') .
1076 "AND (od1.type = 'crs' OR od1.type = 'grp') " .
1077 "AND " . $ilDB->in('od1.obj_id', $course_ids, false, 'integer') . ' ' .
1078 "AND or2.deleted IS NULL";
1079
1080 $res = $ilDB->query($query);
1081 $cat_ids = array();
1082 $course_sessions = array();
1083 while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
1084 if (
1085 !$access->checkAccessOfUser($this->user_id, 'read', '', $row->sess_ref_id) ||
1086 !$access->checkAccessOfUser($this->user_id, 'visible', '', $row->sess_ref_id)
1087 ) {
1088 continue;
1089 }
1090 $cat_ids[] = $row->cat_id;
1091 $course_sessions[$row->crs_id][$row->sess_id] = $row->cat_id;
1092 $this->subitem_categories[] = $row->cat_id;
1093 }
1094
1095 foreach ($this->categories as $cat_id) {
1096 if (
1097 ($this->categories_info[$cat_id]['obj_type'] == 'crs' ||
1098 $this->categories_info[$cat_id]['obj_type'] == 'grp') &&
1099 isset($this->categories_info[$cat_id]['obj_id']) &&
1100 isset($course_sessions[$this->categories_info[$cat_id]['obj_id']]) &&
1101 is_array($course_sessions[$this->categories_info[$cat_id]['obj_id']])) {
1102 foreach ($course_sessions[$this->categories_info[$cat_id]['obj_id']] as $sess_id => $sess_cat_id) {
1103 $this->categories_info[$cat_id]['subitem_ids'][$sess_id] = $sess_cat_id;
1104 $this->categories_info[$cat_id]['subitem_obj_ids'][$sess_cat_id] = $sess_id;
1105 }
1106 } else {
1107 $this->categories_info[$cat_id]['subitem_ids'] = array();
1108 $this->categories_info[$cat_id]['subitem_obj_ids'] = array();
1109 }
1110 }
1111 }
1112
1119 public static function lookupPrivateCategories($a_user_id)
1120 {
1121 global $DIC;
1122
1123 $ilDB = $DIC['ilDB'];
1124
1125 // First read private calendars of user
1126 $set = $ilDB->query("SELECT * FROM cal_categories " .
1127 "WHERE type = " . $ilDB->quote(ilCalendarCategory::TYPE_USR, 'integer') . " " .
1128 "AND obj_id = " . $ilDB->quote($a_user_id, 'integer'));
1129 $cats = array();
1130 while ($rec = $ilDB->fetchAssoc($set)) {
1131 $cats[] = $rec;
1132 }
1133 return $cats;
1134 }
1135}
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
Definition: PEAR.php:64
if(php_sapi_name() !='cli') $in
Definition: Utf8Test.php:37
An exception for terminatinating execution or to throw for unit testing.
return true
Flag indicating whether or not HTTP headers will be sent when outputting captcha image/audio.
static lookupBookableUsersForObject($a_obj_id, $a_user_ids)
Consultation hours are offered if 1) consultation hour owner is admin or tutor and no object assignme...
Exception being thrown calendar categories is initiliazed multiple times for the same user.
static getInstance()
get singleton instance
class for calendar categories
static deletePDItemsCache($a_usr_id)
Delete cache (add remove desktop item)
readPDCalendars()
Read categories of user.
readAllConsultationHoursCalendarOfContainer($a_container_ref_id)
Read personal consultation hours calendar of all tutors for a container.
getNotificationCalendars()
Get all calendars that allow send of notifications (Editable and course group calendars)
readSelectedItemCalendars()
Read categories of selected items.
setCHUserId($a_user_id)
Set ch user id.
static _lookupCategoryIdByObjId($a_obj_id)
lookup category by obj_id
addSubitemCalendars()
Add subitem calendars E.g.
getSubitemCategories($a_cat_id)
get subitem categories for a specific category
readSelectedCategories($a_obj_ids, $a_source_ref_id=0)
read selected categories
readConsultationHoursCalendar($a_target_ref_id=null, $a_cat_id=0)
Read personal consultation hours calendar.
readPrivateCalendars($only_cat_ids=null)
Read private calendars.
readSelectedCalendar($a_cal_id)
Read info about selected calendar.
isVisible($a_cat_id)
check if category is visible
wakeup($a_ser)
Load from serialize string.
sleep()
Serialize categories.
readBookingCalendar($user_id=null)
Read booking manager calendar.
__construct($a_usr_id=0)
Singleton instance.
static lookupPrivateCategories($a_user_id)
Lookup private categories of user.
readReposCalendars($a_container_only=false)
Read available repository calendars.
setSourceRefId($a_val)
Set source ref id.
getCategoryInfo($a_cat_id)
@access public
static _isOwner($a_usr_id, $a_cal_id)
check if user is owner of a category
readPublicCalendars($cat_ids=null)
Read public calendars.
static deleteRepositoryCache($a_usr_id)
Delete cache.
isEditable($a_cat_id)
check if category is editable
prepareCategoriesOfUserForSelection()
prepare categories of users for selection
getCategories($a_include_subitem_calendars=false)
get categories
static _getInstance($a_usr_id=0)
get singleton instance
getSourceRefId()
Get source ref id.
initialize($a_mode, $a_source_ref_id=0, $a_use_cache=false, $a_cat_id=0)
initialize visible categories
Stores calendar categories.
static _getInstance()
get singleton instance
static getAcceptedCalendars($a_usr_id)
get accepted shared calendars
Handles shared calendars.
static _getInstance()
get instance for logged in user
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
static _lookupFullname($a_user_id)
Lookup Full Name.
static _lookupObjId($a_id)
static _getAllReferences($a_id)
get all reference ids of object
static _lookupType($a_id, $a_reference=false)
lookup object type
static _getMembershipByType($a_usr_id, $a_type, $a_only_member_role=false)
get membership by type Get course or group membership
global $DIC
Definition: goto.php:24
$ilUser
Definition: imgupload.php:18
$query
$lng
foreach($_POST as $key=> $value) $res
global $ilDB