calendar * * @param string $principalUri * @return array */ protected function getSortedCalendars(string $principalUri): array { $calendars = $this->backend->getCalendarsForUser($principalUri); $calendarsById = []; foreach ($calendars as $calendar) { $calendarsById[(int)$calendar['id']] = $calendar; } return $calendarsById; } /** * Get an associative array of subscriptions * subscriptionId => subscription * * @param string $principalUri * @return array */ protected function getSortedSubscriptions(string $principalUri): array { $subscriptions = $this->backend->getSubscriptionsForUser($principalUri); $subscriptionsById = []; foreach ($subscriptions as $subscription) { $subscriptionsById[(int)$subscription['id']] = $subscription; } return $subscriptionsById; } /** * Returns the primary VEvent / VJournal / VTodo component * If it's a component with recurrence-ids, it will return * the primary component * * TODO: It would be a nice enhancement to show recurrence-exceptions * as individual search-results. * For now we will just display the primary element of a recurrence-set. * * @param string $calendarData * @param string $componentName * @return Component */ protected function getPrimaryComponent(string $calendarData, string $componentName): Component { $vCalendar = Reader::read($calendarData, Reader::OPTION_FORGIVING); $components = $vCalendar->select($componentName); if (count($components) === 1) { return $components[0]; } // If it's a recurrence-set, take the primary element foreach ($components as $component) { /** @var Component $component */ if (!$component->{'RECURRENCE-ID'}) { return $component; } } // In case of error, just fallback to the first element in the set return $components[0]; } }