public static addSearchEvents ( array &$events, Kronolith_Event $event, stdClass $query, boolean $json ) | ||
$events | array | The list of events to update with the new event. |
$event | Kronolith_Event | An event from a search result. |
$query | stdClass | A search query. |
$json | boolean | 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 {
// Don't include any results that are outside the query range.
if (!empty($query->end) && $event->start->after($query->end) || !empty($query->start) && $event->end->before($query->start)) {
return;
}
$eventStart = $event->start;
$eventEnd = $event->end;
}
self::addEvents($events, $event, $eventStart, $eventEnd, $showRecurrence, $json, false);
}
/** * TODO */ public function searchEvents() { $query = Horde_Serialize::unserialize($this->vars->query, Horde_Serialize::JSON); if (!isset($query->start)) { $query->start = new Horde_Date($_SERVER['REQUEST_TIME']); } if (!isset($query->end)) { $query->end = null; } switch ($this->vars->time) { case 'all': $query->start = null; $query->end = null; break; case 'future': $query->start = new Horde_Date($_SERVER['REQUEST_TIME']); $query->end = null; break; case 'past': $query->start = null; $query->end = new Horde_Date($_SERVER['REQUEST_TIME']); break; } $tagger = new Kronolith_Tagger(); $cals = Horde_Serialize::unserialize($this->vars->cals, Horde_Serialize::JSON); $events = array(); foreach ($cals as $cal) { if (!($kronolith_driver = $this->_getDriver($cal))) { continue; } try { $result = $kronolith_driver->search($query, true); if ($result) { $events[$cal] = $result; } } catch (Exception $e) { $GLOBALS['notification']->push($e, 'horde.error'); } $split = explode('|', $cal); if ($split[0] == 'internal') { $result = $tagger->search($query->title, array('type' => 'event', 'calendar' => $split[1])); foreach ($result['events'] as $uid) { Kronolith::addSearchEvents($events[$cal], $kronolith_driver->getByUID($uid), $query, true); } } } $result = new stdClass(); $result->view = 'search'; $result->query = $this->vars->query; if ($events) { $result->events = $events; } return $result; }