public function html($active = true) { if (!$this->_event) { echo '<h3>' . _("Event not found") . '</h3>'; exit; } if (is_string($this->_event)) { echo '<h3>' . $this->_event . '</h3>'; exit; } if ($datetime = Horde_Util::getFormData('datetime')) { $datetime = new Horde_Date($datetime); $month = $datetime->month; $year = $datetime->year; $day = $datetime->mday; } else { $month = Horde_Util::getFormData('month', date('n')); $day = Horde_Util::getFormData('mday', date('j')); $year = Horde_Util::getFormData('year', date('Y')); } $url = Horde_Util::getFormData('url'); echo '<div id="DeleteEvent"' . ($active ? '' : ' style="display:none"') . '>'; if (!$this->_event->recurs()) { require KRONOLITH_TEMPLATES . '/delete/one.inc'; } else { require KRONOLITH_TEMPLATES . '/delete/delete.inc'; } echo '</div>'; if ($active && $GLOBALS['browser']->hasFeature('dom')) { if ($this->_event->hasPermission(Horde_Perms::READ)) { $view = new Kronolith_View_Event($this->_event); $view->html(false); } if ($this->_event->hasPermission(Horde_Perms::READ) && Kronolith::getDefaultCalendar(Horde_Perms::EDIT)) { $edit = new Kronolith_View_EditEvent($this->_event); $edit->html(false); } } }
/** * Saves an event in the backend. * * If it is a new event, it is added, otherwise the event is updated. * * @param Kronolith_Event $event The event to save. * * @return string The event id. * @throws Horde_Mime_Exception * @throws Kronolith_Exception */ public function saveEvent(Kronolith_Event $event) { if ($event->stored || $event->exists()) { // If this event recurs and has bound exceptions, we must make sure // that the exceptionoriginaldate is updated in those exceptions as // well. See Bug: 13512 if ($event->recurs()) { foreach ($event->boundExceptions() as $bound) { $t = $event->start->strftime('%T'); $bound->exceptionoriginaldate = new Horde_Date($bound->start->strftime('%Y-%m-%d') . 'T' . $t); $bound->save(); } } return $this->_updateEvent($event); } return $this->_addEvent($event); }
public function html($active = true) { if (!$this->_event) { echo '<h3>' . _("Event not found") . '</h3>'; exit; } if (is_string($this->_event)) { echo '<h3>' . $this->_event . '</h3>'; exit; } $identity = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create(); if ($this->_event->hasPermission(Horde_Perms::EDIT)) { $calendar_id = $this->_event->calendarType . '_' . $this->_event->calendar; } else { $calendar_id = 'internal_' . Kronolith::getDefaultCalendar(Horde_Perms::EDIT); } if (!$this->_event->hasPermission(Horde_Perms::EDIT)) { try { $calendar_id .= '\\' . $this->_event->getShare()->get('owner'); } catch (Exception $e) { } } $GLOBALS['session']->set('kronolith', 'attendees', $this->_event->attendees); $GLOBALS['session']->set('kronolith', 'resources', $this->_event->getResources()); if ($datetime = Horde_Util::getFormData('datetime')) { $datetime = new Horde_Date($datetime); $month = $datetime->month; $year = $datetime->year; } else { $month = Horde_Util::getFormData('month', date('n')); $year = Horde_Util::getFormData('year', date('Y')); } $url = Horde_Util::getFormData('url'); $perms = Horde_Perms::EDIT; if ($this->_event->creator == $GLOBALS['registry']->getAuth()) { $perms |= Kronolith::PERMS_DELEGATE; } $calendars = Kronolith::listCalendars($perms, true); $buttons = array(); if (!$this->_event->hasPermission(Horde_Perms::EDIT) && ($GLOBALS['injector']->getInstance('Horde_Core_Perms')->hasAppPermission('max_events') === true || $GLOBALS['injector']->getInstance('Horde_Core_Perms')->hasAppPermission('max_events') > Kronolith::countEvents())) { $buttons[] = '<input type="submit" class="horde-create" name="saveAsNew" value="' . _("Save As New") . '" />'; } else { if ($this->_event->hasPermission(Horde_Perms::EDIT)) { $buttons[] = '<input type="submit" class="horde-default" name="save" value="' . _("Save Event") . '" />'; } if ($this->_event->initialized) { if (!$this->_event->recurs() && ($GLOBALS['injector']->getInstance('Horde_Core_Perms')->hasAppPermission('max_events') === true || $GLOBALS['injector']->getInstance('Horde_Core_Perms')->hasAppPermission('max_events') > Kronolith::countEvents())) { $buttons[] = '<input type="submit" class="horde-create" name="saveAsNew" value="' . _("Save As New") . '" />'; } } } if (isset($url)) { $cancelurl = new Horde_Url($url); } else { $cancelurl = Horde::url('month.php', true)->add(array('month' => $month, 'year' => $year)); } $event =& $this->_event; $tags = implode(',', array_values($event->tags)); Horde_Core_Ui_JsCalendar::init(array('full_weekdays' => true)); global $page_output; $page_output->addScriptFile('hordecore.js', 'horde'); $page_output->addScriptFile('edit.js'); $page_output->addScriptFile('popup.js', 'horde'); echo '<div id="EditEvent"' . ($active ? '' : ' style="display:none"') . '>'; require KRONOLITH_TEMPLATES . '/edit/edit.inc'; echo '</div>'; if ($active && $GLOBALS['browser']->hasFeature('dom')) { if ($this->_event->hasPermission(Horde_Perms::READ)) { $view = new Kronolith_View_Event($this->_event); $view->html(false); } if ($this->_event->hasPermission(Horde_Perms::DELETE)) { $delete = new Kronolith_View_DeleteEvent($this->_event); $delete->html(false); } } }
/** * Adds an event to set of search results. * * @param array $events The list of events to update with the new * event. * @param Kronolith_Event $event An event from a search result. * @param stdClass $query A search query. * @param boolean $json Store the results of the events' toJson() * method? */ public static function addSearchEvents(&$events, $event, $query, $json) { static $now; if (!isset($now)) { $now = new Horde_Date($_SERVER['REQUEST_TIME']); } $showRecurrence = true; if ($event->recurs()) { if (empty($query->start) && empty($query->end)) { $eventStart = $event->start; $eventEnd = $event->end; } else { if (empty($query->end)) { $convert = $event->timezone && $event->getDriver()->supportsTimezones(); if ($convert) { $timezone = date_default_timezone_get(); $event->recurrence->start->setTimezone($event->timezone); if ($event->recurrence->hasRecurEnd()) { $event->recurrence->recurEnd->setTimezone($event->timezone); } } $eventEnd = $event->recurrence->nextRecurrence($now); if (!$eventEnd) { return; } if ($convert) { $eventEnd->setTimezone($timezone); } } else { $eventEnd = $query->end; } if (empty($query->start)) { $eventStart = $event->start; $showRecurrence = false; } else { $eventStart = $query->start; } } } else { $eventStart = $event->start; $eventEnd = $event->end; } self::addEvents($events, $event, $eventStart, $eventEnd, $showRecurrence, $json, false); }
/** * Handles updating/saving this event's resources. Unless this event recurs, * this will delete this event from any resource calendars that are no * longer needed (as when a resource is removed from an existing event). If * this event is an exception, i.e., contains a baseid, AND $existing is * provided, the resources from the original event are used for purposes * of determining any resources that need to be removed. * * * @param Kronolith_Event|null $existing An existing base event. * @since 4.2.6 */ protected function _handleResources(Kronolith_Event $existing = null) { global $session; if (Horde_Util::getFormData('isajax', false)) { $resources = array(); } else { $resources = $session->get('kronolith', 'resources', Horde_Session::TYPE_ARRAY); } $existingResources = $this->_resources; $newresources = Horde_Util::getFormData('resources'); if (!empty($newresources)) { foreach (explode(',', $newresources) as $id) { try { $resource = Kronolith::getDriver('Resource')->getResource($id); } catch (Kronolith_Exception $e) { $GLOBALS['notification']->push($e->getMessage(), 'horde.error'); continue; } if (!$resource instanceof Kronolith_Resource_Group || $resource->isFree($this)) { $resources[$resource->getId()] = array('attendance' => Kronolith::PART_REQUIRED, 'response' => Kronolith::RESPONSE_NONE, 'name' => $resource->get('name')); } else { $GLOBALS['notification']->push(_("No resources from this group were available"), 'horde.error'); } } } $this->_resources = $resources; // Have the base event, and this is an exception so we must // match the recurrence in the resource's copy of the base event. if (!empty($existing) && $existing->recurs() && !$this->recurs()) { foreach ($existing->getResources() as $rid => $data) { $resource = Kronolith::getDriver('Resource')->getResource($key); $r_event = Kronolith::getDriver('Resource')->getByUID($existing->uid, $resource->calendar); $r_event->recurrence = $event->recurrence; $r_event->save(); } } // If we don't recur, check for removal of any resources so we can // update those resources' calendars. if (!$this->recurs()) { $merged = $existingResources + $this->_resources; $delete = array_diff(array_keys($existingResources), array_keys($this->_resources)); foreach ($delete as $key) { // Resource might be declined, in which case it won't have the event // on it's calendar. if ($merged[$key]['response'] != Kronolith::RESPONSE_DECLINED) { try { Kronolith::getDriver('Resource')->getResource($key)->removeEvent($this); } catch (Kronolith_Exception $e) { $GLOBALS['notification']->push('foo', 'horde.error'); } } } } }