Files
server/usr/share/psa-horde/kronolith/lib/Event/Sql.php
2026-01-07 20:52:11 +01:00

272 lines
11 KiB
PHP

<?php
/**
* Copyright 1999-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see http://www.horde.org/licenses/gpl.
*
* @author Luc Saillard <luc.saillard@fr.alcove.com>
* @author Chuck Hagenbuch <chuck@horde.org>
* @author Jan Schneider <jan@horde.org>
* @package Kronolith
*/
class Kronolith_Event_Sql extends Kronolith_Event
{
/**
* The type of the calender this event exists on.
*
* @var string
*/
public $calendarType = 'internal';
/**
* Constructor.
*
* @param Kronolith_Driver $driver The backend driver that this event
* is stored in.
* @param mixed $eventObject Backend specific event object
* that this will represent.
*/
public function __construct(Kronolith_Driver $driver, $eventObject = null)
{
/* Set default alarm value. */
if (isset($GLOBALS['prefs'])) {
$this->alarm = $GLOBALS['prefs']->getValue('default_alarm');
}
parent::__construct($driver, $eventObject);
if (!empty($this->calendar) &&
$GLOBALS['calendar_manager']->getEntry(Kronolith::ALL_CALENDARS, $this->calendar) !== false) {
$this->_backgroundColor = $GLOBALS['calendar_manager']->getEntry(Kronolith::ALL_CALENDARS, $this->calendar)->background();
$this->_foregroundColor = $GLOBALS['calendar_manager']->getEntry(Kronolith::ALL_CALENDARS, $this->calendar)->foreground();
}
}
/**
* Imports a backend specific event object.
*
* @param array $event Backend specific event object that this object
* will represent.
*/
public function fromDriver($SQLEvent)
{
$driver = $this->getDriver();
if (isset($SQLEvent['event_timezone'])) {
$this->timezone = $SQLEvent['event_timezone'];
}
$tz_local = date_default_timezone_get();
$this->allday = (bool)$SQLEvent['event_allday'];
if (!$this->allday && $driver->getParam('utc')) {
$this->start = new Horde_Date($SQLEvent['event_start'], 'UTC');
$this->start->setTimezone($tz_local);
$this->end = new Horde_Date($SQLEvent['event_end'], 'UTC');
$this->end->setTimezone($tz_local);
} else {
$this->start = new Horde_Date($SQLEvent['event_start']);
$this->end = new Horde_Date($SQLEvent['event_end']);
if ($this->end->hour == 23 && $this->end->min == 59) {
$this->end->hour = $this->end->min = $this->end->sec = 0;
$this->end->mday++;
}
}
$this->durMin = ($this->end->timestamp() - $this->start->timestamp()) / 60;
$this->title = $driver->convertFromDriver($SQLEvent['event_title']);
$this->id = $SQLEvent['event_id'];
$this->uid = $SQLEvent['event_uid'];
$this->creator = $SQLEvent['event_creator_id'];
if (!empty($SQLEvent['event_recurtype'])) {
$this->recurrence = new Horde_Date_Recurrence($this->start);
$this->recurrence->setRecurType((int)$SQLEvent['event_recurtype']);
$this->recurrence->setRecurInterval((int)$SQLEvent['event_recurinterval']);
if (isset($SQLEvent['event_recurenddate']) &&
$SQLEvent['event_recurenddate'] != '9999-12-31 23:59:59') {
if ($driver->getParam('utc')) {
$recur_end = new Horde_Date($SQLEvent['event_recurenddate'], 'UTC');
if ($recur_end->min == 0) {
/* Old recurrence end date format. */
$recur_end = new Horde_Date($SQLEvent['event_recurenddate']);
$recur_end->hour = 23;
$recur_end->min = 59;
$recur_end->sec = 59;
} else {
$recur_end->setTimezone(date_default_timezone_get());
}
} else {
$recur_end = new Horde_Date($SQLEvent['event_recurenddate']);
$recur_end->hour = 23;
$recur_end->min = 59;
$recur_end->sec = 59;
}
$this->recurrence->setRecurEnd($recur_end);
}
if (isset($SQLEvent['event_recurcount'])) {
$this->recurrence->setRecurCount((int)$SQLEvent['event_recurcount']);
}
if (isset($SQLEvent['event_recurdays'])) {
$this->recurrence->recurData = (int)$SQLEvent['event_recurdays'];
}
if (!empty($SQLEvent['event_exceptions'])) {
$this->recurrence->exceptions = explode(',', $SQLEvent['event_exceptions']);
}
}
if (isset($SQLEvent['event_location'])) {
$this->location = $driver->convertFromDriver($SQLEvent['event_location']);
}
if (isset($SQLEvent['event_url'])) {
$this->url = $SQLEvent['event_url'];
}
if (isset($SQLEvent['event_private'])) {
$this->private = (bool)($SQLEvent['event_private']);
}
if (isset($SQLEvent['event_status'])) {
$this->status = (int)$SQLEvent['event_status'];
}
if (isset($SQLEvent['event_attendees'])) {
$attendees = unserialize($SQLEvent['event_attendees']);
if ($attendees) {
$this->attendees = array_change_key_case($driver->convertFromDriver($attendees));
}
}
if (isset($SQLEvent['event_resources'])) {
$resources = unserialize($SQLEvent['event_resources']);
if ($resources) {
$this->_resources = array_change_key_case($driver->convertFromDriver($resources));
}
}
if (isset($SQLEvent['event_description'])) {
$this->description = $driver->convertFromDriver($SQLEvent['event_description']);
}
if (isset($SQLEvent['event_alarm'])) {
$this->alarm = (int)$SQLEvent['event_alarm'];
}
if (isset($SQLEvent['event_alarm_methods'])) {
$methods = unserialize($SQLEvent['event_alarm_methods']);
if ($methods) {
$this->methods = $driver->convertFromDriver($methods);
}
}
if (isset($SQLEvent['event_baseid'])) {
$this->baseid = $SQLEvent['event_baseid'];
}
if (isset($SQLEvent['event_exceptionoriginaldate'])) {
if ($driver->getParam('utc')) {
$this->exceptionoriginaldate = new Horde_Date($SQLEvent['event_exceptionoriginaldate'], 'UTC');
$this->exceptionoriginaldate->setTimezone($tz_local);
} else {
$this->exceptionoriginaldate = new Horde_Date($SQLEvent['event_exceptionoriginaldate']);
}
}
$this->initialized = true;
$this->stored = true;
}
/**
* Prepares this event to be saved to the backend.
*
* @param boolean $full Return full data, including uid and id.
*
* @return array The event properties.
*/
public function toProperties($full = false)
{
$driver = $this->getDriver();
$properties = array();
if ($full) {
$properties['event_id'] = $this->id;
$properties['event_uid'] = $this->uid;
}
/* Basic fields. */
$properties['event_creator_id'] = $driver->convertToDriver($this->creator);
$properties['event_title'] = $driver->convertToDriver($this->title);
$properties['event_description'] = $driver->convertToDriver($this->description);
$properties['event_location'] = $driver->convertToDriver($this->location);
$properties['event_timezone'] = $this->timezone;
$properties['event_url'] = (string)$this->url;
$properties['event_private'] = (int)$this->private;
$properties['event_status'] = $this->status;
$properties['event_attendees'] = serialize($driver->convertToDriver($this->attendees));
$properties['event_resources'] = serialize($driver->convertToDriver($this->getResources()));
$properties['event_modified'] = $_SERVER['REQUEST_TIME'];
if ($this->isAllDay()) {
$properties['event_start'] = $this->start->strftime('%Y-%m-%d %H:%M:%S');
$properties['event_end'] = $this->end->strftime('%Y-%m-%d %H:%M:%S');
$properties['event_allday'] = 1;
} else {
if ($driver->getParam('utc')) {
$start = clone $this->start;
$end = clone $this->end;
$start->setTimezone('UTC');
$end->setTimezone('UTC');
} else {
$start = $this->start;
$end = $this->end;
}
$properties['event_start'] = $start->strftime('%Y-%m-%d %H:%M:%S');
$properties['event_end'] = $end->strftime('%Y-%m-%d %H:%M:%S');
$properties['event_allday'] = 0;
}
/* Alarm. */
$properties['event_alarm'] = (int)$this->alarm;
/* Alarm Notification Methods. */
$properties['event_alarm_methods'] = serialize($driver->convertToDriver($this->methods));
/* Recurrence. */
if (!$this->recurs()) {
$properties['event_recurtype'] = 0;
} else {
$recur = $this->recurrence->getRecurType();
if ($this->recurrence->hasRecurEnd()) {
if ($driver->getParam('utc')) {
$recur_end = clone $this->recurrence->recurEnd;
$recur_end->setTimezone('UTC');
} else {
$recur_end = $this->recurrence->recurEnd;
}
} else {
$recur_end = new Horde_Date(array('year' => 9999, 'month' => 12, 'mday' => 31, 'hour' => 23, 'min' => 59, 'sec' => 59));
}
$properties['event_recurtype'] = $recur;
$properties['event_recurinterval'] = $this->recurrence->getRecurInterval();
$properties['event_recurenddate'] = $recur_end->format('Y-m-d H:i:s');
$properties['event_recurcount'] = $this->recurrence->getRecurCount();
switch ($recur) {
case Horde_Date_Recurrence::RECUR_WEEKLY:
$properties['event_recurdays'] = $this->recurrence->getRecurOnDays();
break;
}
$properties['event_exceptions'] = implode(',', $this->recurrence->getExceptions());
}
/* Exception information */
if (!empty($this->baseid)) {
$properties['event_baseid'] = $this->baseid;
if ($driver->getParam('utc')) {
$eod = clone $this->exceptionoriginaldate;
$eod->setTimezone('UTC');
} else {
$eod = $this->exceptionoriginaldate;
}
$properties['event_exceptionoriginaldate'] = $eod->strftime('%Y-%m-%d %H:%M:%S');
}
return $properties;
}
}