diff --git a/htdocs/feed.php b/htdocs/feed.php index 6c38561a..c59a2f53 100644 --- a/htdocs/feed.php +++ b/htdocs/feed.php @@ -50,7 +50,8 @@ function caldav_get_feed( $request ) { * used as a .ics download for the whole collection, which is what we do also. */ $sql = 'SELECT caldav_data, caldav_type, caldav_data.user_no, caldav_data.dav_name,'; - $sql .= ' caldav_data.modified, caldav_data.created'; + $sql .= ' caldav_data.modified, caldav_data.created, '; + $sql .= ' summary, dtstart, dtend, calendar_item.description '; $sql .= ' FROM collection INNER JOIN caldav_data USING(collection_id) INNER JOIN calendar_item USING ( dav_id ) WHERE '; if ( isset($c->get_includes_subcollections) && $c->get_includes_subcollections ) { $sql .= ' (collection.dav_name ~ :path_match '; @@ -94,44 +95,37 @@ function caldav_get_feed( $request ) { $need_zones = array(); $timezones = array(); while( $event = $qry->Fetch() ) { - $ical = new vComponent( $event->caldav_data ); - if ( $ical->GetType() != 'VCALENDAR' ) continue; - - $event_data = $ical->GetComponents('VTIMEZONE', false); - $type = (count($event_data) ? $event_data[0]->GetType() : 'null'); - - if ( ($type!= 'VEVENT' && $type != 'VTODO' && $type != 'VJOURNAL') ) { - dbg_error_log( 'feed', 'Skipping peculiar "%s" component in VCALENDAR', $type ); - var_dump($ical); + if ( $event->caldav_type != 'VEVENT' && $event->caldav_type != 'VTODO' && $event->caldav_type != 'VJOURNAL') { + dbg_error_log( 'feed', 'Skipping peculiar "%s" component in VCALENDAR', $event->caldav_type ); continue; } - $is_todo = ($event_data[0]->GetType() == 'VTODO'); + $is_todo = ($event->caldav_type == 'VTODO'); + + $ical = new vComponent( $event->caldav_data ); + $event_data = $ical->GetComponents('VTIMEZONE', false); $item = $feed->createEntry(); - $uid = $event_data[0]->GetProperty('UID'); - $item->setId( $c->protocol_server_port_script . ConstructURL($event->dav_name).'#'.$uid ); + $item->setId( $c->protocol_server_port_script . ConstructURL($event->dav_name) ); $dt_created = new RepeatRuleDateTime( $event->created ); - $dt_modified = new RepeatRuleDateTime( $event->modified ); - if ( isset($dt_created) ) $item->setDateCreated( $dt_created->epoch() ); - if ( isset($dt_modified) ) $item->setDateModified( $dt_modified->epoch() ); + $item->setDateCreated( $dt_created->epoch() ); - // According to karora, there are cases where we get multiple VEVENTs (overrides). I'll just stick this (1/x) notifier in here until I get to repeat event processing. - $summary = $event_data[0]->GetProperty('SUMMARY'); - $p_title = (isset($summary) ? $summary->Value() : translate('No summary')) . ' (1/' . (string)count($event_data) . ')'; - $is_todo ? $p_title = "TODO: " . $p_title : $p_title; + $dt_modified = new RepeatRuleDateTime( $event->modified ); + $item->setDateModified( $dt_modified->epoch() ); + + $summary = $event->summary; + $p_title = ($summary != '' ? $summary : translate('No summary')); + if ( $is_todo ) $p_title = "TODO: " . $p_title; $item->setTitle($p_title); $content = ""; - $dt_start = $event_data[0]->GetProperty('DTSTART'); + $dt_start = new RepeatRuleDateTime($event->dtstart); if ( $dt_start != null ) { - $dt_start = new RepeatRuleDateTime($dt_start); $p_time = '' . translate('Time') . ': ' . strftime(translate('%F %T'), $dt_start->epoch()); - $dt_end = $event_data[0]->GetProperty('DTEND'); + $dt_end = new RepeatRuleDateTime($event->dtend); if ( $dt_end != null ) { - $dt_end = new RepeatRuleDateTime($dt_end); $p_time .= ' - ' . ( $dt_end->AsDate() == $dt_start->AsDate() ? strftime(translate('%T'), $dt_end->epoch()) : strftime(translate('%F %T'), $dt_end->epoch()) @@ -164,13 +158,13 @@ function caldav_get_feed( $request ) { } } - $p_description = $event_data[0]->GetProperty('DESCRIPTION'); - if ( $p_description != null && $p_description->Value() != '' ) { + $p_description = $event->description; + if ( $p_description != '' ) { $content .= '
' .'
' - .'' . translate('Description') . ':
' . ( nl2br(hyperlink($p_description->Value())) ) + .'' . translate('Description') . ':
' . ( nl2br(hyperlink($p_description)) ) ; - $item->setDescription($p_description->Value()); + $item->setDescription($p_description); } $item->setContent($content);