ILIAS  release_7 Revision v7.30-3-g800a261c036
All Data Structures Namespaces Files Functions Variables Modules Pages
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)
37  const MODE_REMOTE_ACCESS = 3;
40  const MODE_MANAGE = 6;
41  const MODE_CONSULTATION = 7;
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  {
260  return $this->target_ref_id;
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()) {
314  case self::MODE_REMOTE_ACCESS:
315  include_once('./Services/Calendar/classes/class.ilCalendarUserSettings.php');
317  $this->readPDCalendars();
318  } else {
319  $this->readSelectedItemCalendars();
320  }
321  break;
322 
323  case self::MODE_REMOTE_SELECTED:
324  $this->readSelectedCalendar($a_source_ref_id);
325  break;
326 
327  case self::MODE_PERSONAL_DESKTOP_MEMBERSHIP:
328  $this->readPDCalendars();
329  break;
330 
331  case self::MODE_PERSONAL_DESKTOP_ITEMS:
332  $this->readSelectedItemCalendars();
333  break;
334 
335  case self::MODE_REPOSITORY:
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 
341  case self::MODE_REPOSITORY_CONTAINER_ONLY:
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 
347  case self::MODE_MANAGE:
348  $this->readPDCalendars();
349  $this->readSelectedItemCalendars();
350  break;
351 
352  case self::MODE_CONSULTATION:
353  #$this->readPrivateCalendars();
354  $this->setTargetRefId($a_source_ref_id);
355  $this->readConsultationHoursCalendar($a_source_ref_id);
356  break;
357 
358  case self::MODE_PORTFOLIO_CONSULTATION:
360  break;
361 
362  case self::MODE_SINGLE_CALENDAR:
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');
548  $this->readSelectedCategories(ilParticipants::_getMembershipByType($this->user_id, 'crs'));
549  $this->readSelectedCategories(ilParticipants::_getMembershipByType($this->user_id, 'grp'));
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) {
695  $this->readSelectedCategories(ilParticipants::_getMembershipByType($this->user_id, 'crs'));
696  $this->readSelectedCategories(ilParticipants::_getMembershipByType($this->user_id, 'grp'));
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');
798  $accepted_ids = ilCalendarSharedStatus::getAcceptedCalendars($ilUser->getId());
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 }
class for calendar categories
static getInstance()
get singleton instance
readAllConsultationHoursCalendarOfContainer($a_container_ref_id)
Read personal consultation hours calendar of all tutors for a container.
readSelectedItemCalendars()
Read categories of selected items.
addSubitemCalendars()
Add subitem calendars E.g.
readSelectedCategories($a_obj_ids, $a_source_ref_id=0)
read selected categories
static _getInstance()
get singleton instance
Exception being thrown calendar categories is initiliazed multiple times for the same user...
static _isOwner($a_usr_id, $a_cal_id)
check if user is owner of a category
wakeup($a_ser)
Load from serialize string.
static getAcceptedCalendars($a_usr_id)
get accepted shared calendars
static _lookupFullname($a_user_id)
Lookup Full Name.
static _getMembershipByType($a_usr_id, $a_type, $a_only_member_role=false)
get membership by type Get course or group membership
readReposCalendars($a_container_only=false)
Read available repository calendars.
static _getInstanceByObjId($a_obj_id)
Get singleton instance.
setCHUserId($a_user_id)
Set ch user id.
static _lookupCategoryIdByObjId($a_obj_id)
lookup category by obj_id
readBookingCalendar($user_id=null)
Read booking manager calendar.
sleep()
Serialize categories.
isVisible($a_cat_id)
check if category is visible
Stores calendar categories.
static deletePDItemsCache($a_usr_id)
Delete cache (add remove desktop item)
Handles shared calendars.
readPrivateCalendars($only_cat_ids=null)
Read private calendars.
static _getAllReferences($a_id)
get all reference ids of object
setSourceRefId($a_val)
Set source ref id.
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...
isEditable($a_cat_id)
check if category is editable
static deleteRepositoryCache($a_usr_id)
Delete cache.
foreach($_POST as $key=> $value) $res
$lng
getSourceRefId()
Get source ref id.
static _getInstance()
get instance for logged in user
static _lookupObjId($a_id)
initialize($a_mode, $a_source_ref_id=0, $a_use_cache=false, $a_cat_id=0)
initialize visible categories
getSubitemCategories($a_cat_id)
get subitem categories for a specific category
global $DIC
Definition: goto.php:24
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
Definition: PEAR.php:64
readSelectedCalendar($a_cal_id)
Read info about selected calendar.
$query
prepareCategoriesOfUserForSelection()
prepare categories of users for selection
static _getInstance($a_usr_id=0)
get singleton instance
static _lookupType($a_id, $a_reference=false)
lookup object type
if(php_sapi_name() !='cli') $in
Definition: Utf8Test.php:37
readConsultationHoursCalendar($a_target_ref_id=null, $a_cat_id=0)
Read personal consultation hours calendar.
getCategories($a_include_subitem_calendars=false)
get categories
__construct($a_usr_id=0)
Singleton instance.
global $ilDB
getNotificationCalendars()
Get all calendars that allow send of notifications (Editable and course group calendars) ...
$ilUser
Definition: imgupload.php:18
static lookupPrivateCategories($a_user_id)
Lookup private categories of user.
readPublicCalendars($cat_ids=null)
Read public calendars.
readPDCalendars()
Read categories of user.