ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilCalendarEntry.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once('Services/Calendar/classes/class.ilDate.php');
5 include_once('./Services/Calendar/interfaces/interface.ilDatePeriod.php');
6 
7 define('IL_CAL_TRANSLATION_NONE', 0);
8 define('IL_CAL_TRANSLATION_SYSTEM', 1);
9 
10 
20 class ilCalendarEntry implements ilDatePeriod
21 {
22  protected $log;
23  protected $db;
24 
25 
26  protected $entry_id;
27  protected $last_update;
28  protected $title;
29  protected $subtitle;
30  protected $description;
31  protected $location;
33  protected $start = null;
34  protected $fullday;
35  protected $end = null;
36  protected $is_auto_generated = false;
37  protected $context_id = 0;
38  protected $context_info = '';
40  protected $is_milestone = false;
41  protected $completion = 0;
42 
43  protected $notification = false;
44 
52  public function __construct($a_id = 0)
53  {
54  global $DIC;
55 
56  $ilDB = $DIC['ilDB'];
57  $this->log = $DIC->logger()->cal();
58 
59  $this->db = $ilDB;
60 
61  if ($this->entry_id = $a_id) {
62  $this->read();
63  }
64  }
65 
69  public function __clone()
70  {
71  $this->entry_id = null;
72  }
73 
81  public static function _delete($a_entry_id)
82  {
83  global $DIC;
84 
85  $ilDB = $DIC['ilDB'];
86 
87  include_once('./Services/Calendar/classes/class.ilCalendarRecurrence.php');
88  ilCalendarRecurrence::_delete($a_entry_id);
89 
90  $query = "DELETE FROM cal_entries " .
91  "WHERE cal_id = " . $ilDB->quote($a_entry_id, 'integer') . " ";
92  $res = $ilDB->manipulate($query);
93 
94  return true;
95  }
96 
101  public function setContextInfo($a_info)
102  {
103  $this->context_info = $a_info;
104  }
105 
109  public function getContextInfo()
110  {
111  return $this->context_info;
112  }
113 
120  public function getEntryId()
121  {
122  return $this->entry_id;
123  }
124 
132  public function getLastUpdate()
133  {
134  return $this->last_update ? $this->last_update : new ilDateTime(time(), IL_CAL_UNIX);
135  }
136 
144  public function setLastUpdate($a_date)
145  {
146  $this->last_update = $a_date;
147  }
148 
149 
156  public function getStart()
157  {
158  return $this->start;
159  }
160 
167  public function setStart($a_start)
168  {
169  $this->start = $a_start;
170  }
171 
177  public function getEnd()
178  {
179  return $this->end;
180  }
181 
187  public function setEnd($a_end)
188  {
189  $this->end = $a_end;
190  }
191 
199  public function setTitle($a_title)
200  {
201  $this->title = $a_title;
202  }
203 
210  public function getTitle()
211  {
212  return $this->title;
213  }
214 
222  public function getPresentationTitle($a_shorten = true)
223  {
224  global $DIC;
225 
226  $lng = $DIC['lng'];
227 
229  $title = $this->getTitle();
230  } elseif (strlen($this->getSubtitle())) {
231  // parse dynamic title?
232  if (preg_match("/#([a-z]+)#/", $this->getSubtitle(), $matches)) {
233  $subtitle = $this->parseDynamicTitle($matches[1]);
234  } else {
235  $subtitle = $lng->txt($this->getSubtitle());
236  }
237  $title = $this->getTitle() .
238  (strlen($subtitle)
239  ? ' (' . $subtitle . ')'
240  : '');
241  } else {
242  $title = $lng->txt($this->getTitle());
243  }
244 
245  if ($a_shorten) {
246  return ilUtil::shortenText(ilUtil::shortenWords($title, 20), 40, true);
247  }
248  return $title;
249  }
250 
251  public function getPresentationStyle()
252  {
253  // see parseDynamicTitle()
254  return $this->presentation_style;
255  }
256 
257  protected function parseDynamicTitle($a_type)
258  {
259  global $DIC;
260 
261  $lng = $DIC['lng'];
262 
263  $title = $style = "";
264  switch ($a_type) {
265  case "consultationhour":
266  include_once 'Services/Booking/classes/class.ilBookingEntry.php';
267  $entry = new ilBookingEntry($this->getContextId());
268  if ($entry) {
269  if ($entry->isOwner()) {
270  $max = (int) $entry->getNumberOfBookings();
271  $current = (int) $entry->getCurrentNumberOfBookings($this->getEntryId());
272  if (!$current) {
273  $style = ';border-left-width: 5px; border-left-style: solid; border-left-color: green';
274  $title = $lng->txt('cal_book_free');
275  } elseif ($current >= $max) {
276  $style = ';border-left-width: 5px; border-left-style: solid; border-left-color: red';
277  $title = $lng->txt('cal_booked_out');
278  } else {
279  $style = ';border-left-width: 5px; border-left-style: solid; border-left-color: yellow';
280  $title = $current . '/' . $max;
281  }
282  } else {
283  /*
284  * if($entry->hasBooked($this->getEntryId()))
285  */
286  include_once 'Services/Calendar/classes/ConsultationHours/class.ilConsultationHourAppointments.php';
287  $apps = ilConsultationHourAppointments::getAppointmentIds($entry->getObjId(), $this->getContextId(), $this->getStart());
288  $orig_event = $apps[0];
289  if ($entry->hasBooked($orig_event)) {
290  $style = ';border-left-width: 5px; border-left-style: solid; border-left-color: green';
291  $title = $lng->txt('cal_date_booked');
292  }
293  }
294  }
295  break;
296  }
297 
298  if ($style) {
299  $this->presentation_style = $style;
300  }
301  return $title;
302  }
303 
313  public function setSubtitle($a_subtitle)
314  {
315  $this->subtitle = $a_subtitle;
316  }
317 
324  public function getSubtitle()
325  {
326  return $this->subtitle;
327  }
328 
336  public function setDescription($a_description)
337  {
338  $this->description = $a_description;
339  }
340 
346  public function getDescription()
347  {
348  return $this->description;
349  }
350 
358  public function setLocation($a_location)
359  {
360  $this->location = $a_location;
361  }
362 
368  public function getLocation()
369  {
370  return $this->location;
371  }
372 
380  public function setFurtherInformations($a_informations)
381  {
382  $this->further_informations = $a_informations;
383  }
384 
390  public function getFurtherInformations()
391  {
393  }
394 
404  public function setFullday($a_fullday)
405  {
406  $this->fullday = (bool) $a_fullday;
407  }
408 
414  public function isFullday()
415  {
416  return (bool) $this->fullday;
417  }
418 
426  public function isAutoGenerated()
427  {
428  return (bool) $this->is_auto_generated;
429  }
430 
438  public function setAutoGenerated($a_status)
439  {
440  $this->is_auto_generated = $a_status;
441  }
442 
450  public function isMilestone()
451  {
452  return (bool) $this->is_milestone;
453  }
454 
462  public function setMilestone($a_status)
463  {
464  $this->is_milestone = $a_status;
465  }
466 
472  public function setCompletion($a_completion)
473  {
474  $this->completion = $a_completion;
475  }
476 
482  public function getCompletion()
483  {
484  return $this->completion;
485  }
486 
494  public function setContextId($a_context_id)
495  {
496  $this->context_id = $a_context_id;
497  }
498 
505  public function getContextId()
506  {
507  return $this->context_id;
508  }
509 
517  public function setTranslationType($a_type)
518  {
519  $this->translation_type = $a_type;
520  }
521 
528  public function getTranslationType()
529  {
531  }
532 
537  public function enableNotification($a_status)
538  {
539  $this->notification = $a_status;
540  }
541 
546  public function isNotificationEnabled()
547  {
548  return (bool) $this->notification;
549  }
550 
557  public function update()
558  {
559  global $DIC;
560 
561  $ilDB = $DIC['ilDB'];
562 
563  $now = new ilDateTime(time(), IL_CAL_UNIX);
564  $utc_timestamp = $now->get(IL_CAL_DATETIME, '', ilTimeZone::UTC);
565 
566 
567  $query = "UPDATE cal_entries " .
568  "SET title = " . $this->db->quote($this->getTitle(), 'text') . ", " .
569  "last_update = " . $ilDB->quote($utc_timestamp, 'timestamp') . ", " .
570  "subtitle = " . $this->db->quote($this->getSubtitle(), 'text') . ", " .
571  "description = " . $this->db->quote($this->getDescription(), 'text') . ", " .
572  "location = " . $this->db->quote($this->getLocation(), 'text') . ", " .
573  "fullday = " . $ilDB->quote($this->isFullday() ? 1 : 0, 'integer') . ", " .
574  "starta = " . $this->db->quote($this->getStart()->get(IL_CAL_DATETIME, '', 'UTC'), 'timestamp') . ", " .
575  "enda = " . $this->db->quote($this->getEnd()->get(IL_CAL_DATETIME, '', 'UTC'), 'timestamp') . ", " .
576  "informations = " . $this->db->quote($this->getFurtherInformations(), 'text') . ", " .
577  "auto_generated = " . $this->db->quote($this->isAutoGenerated(), 'integer') . ", " .
578  "translation_type = " . $this->db->quote($this->getTranslationType(), 'integer') . ", " .
579  "context_id = " . $this->db->quote($this->getContextId(), 'integer') . ", " .
580  'context_info = ' . $this->db->quote($this->getContextInfo(), 'text') . ', ' .
581  "completion = " . $this->db->quote($this->getCompletion(), 'integer') . ", " .
582  "is_milestone = " . $this->db->quote($this->isMilestone() ? 1 : 0, 'integer') . ", " .
583  'notification = ' . $this->db->quote($this->isNotificationEnabled() ? 1 : 0, 'integer') . ' ' .
584  "WHERE cal_id = " . $this->db->quote($this->getEntryId(), 'integer') . " ";
585  $res = $ilDB->manipulate($query);
586 
587  return true;
588  }
589 
596  public function save()
597  {
598  global $DIC;
599 
600  $ilDB = $DIC['ilDB'];
601 
602  $next_id = $ilDB->nextId('cal_entries');
603  $now = new ilDateTime(time(), IL_CAL_UNIX);
604  $utc_timestamp = $now->get(IL_CAL_DATETIME, '', ilTimeZone::UTC);
605 
606  $query = "INSERT INTO cal_entries (cal_id,title,last_update,subtitle,description,location,fullday,starta,enda, " .
607  "informations,auto_generated,context_id,context_info,translation_type, completion, is_milestone, notification) " .
608  "VALUES( " .
609  $ilDB->quote($next_id, 'integer') . ", " .
610  $this->db->quote($this->getTitle(), 'text') . ", " .
611  $ilDB->quote($utc_timestamp, 'timestamp') . ", " .
612  $this->db->quote($this->getSubtitle(), 'text') . ", " .
613  $this->db->quote($this->getDescription(), 'text') . ", " .
614  $this->db->quote($this->getLocation(), 'text') . ", " .
615  $ilDB->quote($this->isFullday() ? 1 : 0, 'integer') . ", " .
616  $this->db->quote($this->getStart()->get(IL_CAL_DATETIME, '', 'UTC'), 'timestamp') . ", " .
617  $this->db->quote($this->getEnd()->get(IL_CAL_DATETIME, '', 'UTC'), 'timestamp') . ", " .
618  $this->db->quote($this->getFurtherInformations(), 'text') . ", " .
619  $this->db->quote($this->isAutoGenerated(), 'integer') . ", " .
620  $this->db->quote($this->getContextId(), 'integer') . ", " .
621  $this->db->quote($this->getContextInfo(), 'text') . ', ' .
622  $this->db->quote($this->getTranslationType(), 'integer') . ", " .
623  $this->db->quote($this->getCompletion(), 'integer') . ", " .
624  $this->db->quote($this->isMilestone() ? 1 : 0, 'integer') . ", " .
625  $this->db->quote($this->isNotificationEnabled() ? 1 : 0, 'integer') . ' ' .
626  ")";
627  $res = $ilDB->manipulate($query);
628 
629  $this->entry_id = $next_id;
630  return true;
631  }
632 
639  public function delete()
640  {
641  global $DIC;
642 
643  $ilDB = $DIC['ilDB'];
644 
645  include_once('./Services/Calendar/classes/class.ilCalendarRecurrence.php');
647 
648  $query = "DELETE FROM cal_entries " .
649  "WHERE cal_id = " . $this->db->quote($this->getEntryId(), 'integer') . " ";
650  $res = $ilDB->manipulate($query);
651 
652  include_once './Services/Calendar/classes/class.ilCalendarCategoryAssignments.php';
654 
655  return true;
656  }
657 
664  public function validate()
665  {
666  global $DIC;
667 
668  $ilErr = $DIC['ilErr'];
669  $lng = $DIC['lng'];
670 
671  $success = true;
672  $ilErr->setMessage('');
673  if (!strlen($this->getTitle())) {
674  $success = false;
675  $ilErr->appendMessage($lng->txt('err_missing_title'));
676  }
677  if (!$this->getStart() || !$this->getEnd()) {
678  $success = false;
679  } elseif (ilDateTime::_before($this->getEnd(), $this->getStart(), '')) {
680  $success = false;
681  $ilErr->appendMessage($lng->txt('err_end_before_start'));
682  }
683  return $success;
684  }
685 
686 
687 
693  protected function read()
694  {
695  global $DIC;
696 
697  $ilDB = $DIC['ilDB'];
698 
699  $query = "SELECT * FROM cal_entries WHERE cal_id = " . $this->db->quote($this->getEntryId(), 'integer') . " ";
700  $res = $this->db->query($query);
701  while ($row = $res->fetchRow(ilDBConstants::FETCHMODE_OBJECT)) {
702  $this->setLastUpdate(new ilDateTime($row->last_update, IL_CAL_DATETIME, 'UTC'));
703  $this->setTitle($row->title);
704  $this->setSubtitle($row->subtitle);
705  $this->setDescription($row->description);
706  $this->setLocation($row->location);
707  $this->setFurtherInformations($row->informations);
708  $this->setFullday((bool) $row->fullday);
709  $this->setAutoGenerated($row->auto_generated);
710  $this->setContextId($row->context_id);
711  $this->setContextInfo($row->context_info);
712  $this->setTranslationType($row->translation_type);
713  $this->setCompletion($row->completion);
714  $this->setMilestone($row->is_milestone);
715  $this->enableNotification((bool) $row->notification);
716 
717  if ($this->isFullday()) {
718  $this->start = new ilDate($row->starta, IL_CAL_DATETIME);
719  $this->end = new ilDate($row->enda, IL_CAL_DATETIME);
720  } else {
721  $this->start = new ilDateTime($row->starta, IL_CAL_DATETIME, 'UTC');
722  $this->end = new ilDateTime($row->enda, IL_CAL_DATETIME, 'UTC');
723  }
724  }
725  }
726 
732  public function appointmentToMailString($lng)
733  {
734  $body = $lng->txt('cal_details');
735  $body .= "\n\n";
736  $body .= $lng->txt('title') . ': ' . $this->getTitle() . "\n";
737 
739  $body .= $lng->txt('date') . ': ' . ilDatePresentation::formatPeriod($this->getStart(), $this->getEnd()) . "\n";
741 
742  if (strlen($this->getLocation())) {
743  $body .= $lng->txt('cal_where') . ': ' . $this->getLocation() . "\n";
744  }
745 
746  if (strlen($this->getDescription())) {
747  $body .= $lng->txt('description') . ': ' . $this->getDescription() . "\n";
748  }
749  return $body;
750  }
751 
752 
756  public function writeResponsibleUsers($a_users)
757  {
758  global $DIC;
759 
760  $ilDB = $DIC['ilDB'];
761 
762  $ilDB->manipulateF(
763  "DELETE FROM cal_entry_responsible WHERE cal_id = %s",
764  array("integer"),
765  array($this->getEntryId())
766  );
767 
768  if (is_array($a_users)) {
769  foreach ($a_users as $user_id) {
770  $ilDB->manipulateF(
771  "INSERT INTO cal_entry_responsible (cal_id, user_id) " .
772  " VALUES (%s,%s)",
773  array("integer", "integer"),
774  array($this->getEntryId(), $user_id)
775  );
776  }
777  }
778 
779  $this->responsible_users = $a_users;
780  }
781 
785  public function readResponsibleUsers()
786  {
787  global $DIC;
788 
789  $ilDB = $DIC['ilDB'];
790 
791  $set = $ilDB->queryF(
792  "SELECT * FROM cal_entry_responsible WHERE cal_id = %s",
793  array("integer"),
794  array($this->getEntryId())
795  );
796 
797  $return = array();
798  while ($rec = $ilDB->fetchAssoc($set)) {
799  $n = ilObjUser::_lookupName($rec["user_id"]);
800  $return[] = array_merge(
801  $n,
802  array("login" => ilObjUser::_lookupLogin($rec["user_id"]))
803  );
804  }
805 
806  return $return;
807  }
808 }
getTranslationType()
get translation type
save()
save one entry
static _lookupLogin($a_user_id)
lookup login
static _lookupName($a_user_id)
lookup user name
setContextId($a_context_id)
set context id
Model for a calendar entry.
static shortenWords($a_str, $a_len=30, $a_dots=true)
Ensure that the maximum word lenght within a text is not longer than $a_len.
$style
Definition: example_012.php:70
getPresentationTitle($a_shorten=true)
get title for presentation.
setTitle($a_title)
set title
static shortenText( $a_str, $a_len, $a_dots=false, $a_next_blank=false, $a_keep_extension=false)
shorten a string to given length.
const IL_CAL_DATETIME
setLastUpdate($a_date)
set last update
enableNotification($a_status)
Enable course group notification.
const IL_CAL_TRANSLATION_NONE
__clone()
clone instance
global $DIC
Definition: saml.php:7
setFurtherInformations($a_informations)
set further informations
setDescription($a_description)
set description
readResponsibleUsers()
Read responsible users.
static _before(ilDateTime $start, ilDateTime $end, $a_compare_field='', $a_tz='')
compare two dates and check start is before end This method does not consider tz offsets.
getFurtherInformations()
get further informations
$a_context_id
Definition: workflow.php:97
getEntryId()
get entry id
static getAppointmentIds($a_user_id, $a_context_id=null, $a_start=null, $a_type=null, $a_check_owner=true)
Get all appointment ids.
Booking definition.
static setUseRelativeDates($a_status)
set use relative dates
const IL_CAL_UNIX
setSubtitle($a_subtitle)
set subtitle Used for automatic generated appointments.
getSubtitle()
get subtitle
$ilErr
Definition: raiseError.php:18
isMilestone()
is milestone
$a_type
Definition: workflow.php:92
static _delete($a_entry_id)
delete entry
setFullday($a_fullday)
set fullday event Fullday events do not change their time in different timezones. ...
getDescription()
get description
getEnd()
get end public
getCompletion()
Get Completion.
$success
Definition: Utf8Test.php:86
Class for single dates.
foreach($_POST as $key=> $value) $res
writeResponsibleUsers($a_users)
Write users responsible for a milestone.
$lng
isAutoGenerated()
is auto generated
notification()
Definition: notification.php:2
Date and time handling
$query
$n
Definition: RandomTest.php:85
static _deleteByAppointmentId($a_app_id)
Delete appointment assignment.
getContextId()
get context id
setCompletion($a_completion)
Set Completion.
$row
static _delete($a_cal_id)
delete
setTranslationType($a_type)
public
static formatPeriod(ilDateTime $start, ilDateTime $end, $a_skip_starting_day=false)
Format a period of two date Shows: 14.
setLocation($a_location)
set location
getLocation()
get location
setStart($a_start)
public
setMilestone($a_status)
set milestone
setContextInfo($a_info)
Set context info.
global $ilDB
__construct($a_id=0)
Constructor.
isNotificationEnabled()
Check if course group notification is enabled.
setEnd($a_end)
set end public
getLastUpdate()
get last update
setAutoGenerated($a_status)
set auto generated