public function testParsingOfEndTimeWithTzidSetAndUntilSetUnderRRULE() { $ical = new SG_iCal(); $timezone['tzid'] = 'America/New_York'; $timezone['daylight'] = array('tzoffsetfrom' => '-0500', 'tzoffsetto' => '-0400', 'tzname' => 'EDT', 'dtstart' => '19700308T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=3;BYDAY=2SU'); $timezone['standard'] = array('tzoffsetfrom' => '-0400', 'tzoffsetto' => '-0500', 'tzname' => 'EST', 'dtstart' => '19701101T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=11;BYDAY=1SU'); $timezone2['tzid'] = 'Europe/Copenhagen'; $timezone2['daylight'] = array('tzoffsetfrom' => '+0100', 'tzoffsetto' => '+0200', 'tzname' => 'CEST', 'dtstart' => '19700329T020000', 'rrule' => 'FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU'); $timezone2['standard'] = array('tzoffsetfrom' => '+0200', 'tzoffsetto' => '+0100', 'tzname' => 'CET', 'dtstart' => '19701025T030000', 'rrule' => 'FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU'); $ical->addTimeZone(new SG_iCal_VTimeZone($timezone)); $ical->addtimeZone(new SG_iCal_VTimeZone($timezone2)); $data['uid'] = new SG_iCal_Line('uid'); //this takes place after Copenhagens change back to standard time $data['dtstart'] = new SG_iCal_Line('DTSTART;TZID=Europe/Copenhagen:20091027T100000'); $data['rrule'] = new SG_iCal_Line('RRULE:FREQ=DAILY;UNTIL=20091030T130000Z'); date_default_timezone_set('America/New_York'); $event = new SG_iCal_VEvent($data, $ical); $this->assertEquals(strtotime('20091030T090000'), $event->getProperty('laststart')); }
/** * Fonction qui insère en base de données les évènements du fichier iCal * * @param file $iCalFile Fichier iCalendar contenant des événements à importer * @param int $agendaId Identifiant de l'agenda dans lequel doivent être insérés les évènements * @param bool $withPurge Purge le calendrier de l'agenda sur la période concernée * * @return int Nombre d'insertions effectuées */ public static function import($iCalFile, $agendaId, $withPurge = false) { $ical = new SG_iCal($iCalFile); $events = $ical->getEvents(); $eventsCounter = 0; if (is_array($events) && !empty($events)) { // Récupération de la première et dernière date du calendrier importé foreach ($events as $event) { if (!isset($startDate) && !isset($endDate)) { $startDate = $event->getStart(); $endDate = $event->getEnd(); } $startDate = min($event->getStart(), $startDate); $endDate = max($event->getEnd(), $endDate); } // Si purge de l'agenda demandé... if ($withPurge) { try { _classInclude('agenda|AgendaService'); AgendaService::purgeAgendaByDateInterval($agendaId, date('Ymd', $startDate), date('Ymd', $endDate), date('H:i', $startDate), date('H:i', $endDate)); } catch (Exception $e) { throw new Exception('Error during agenda purge.'); } } $eventDAO = _ioDAO('event'); foreach ($events as $event) { // Recherche si l'événement existe déjà en base $criteres = _daoSp(); $criteres->addCondition('id_agenda', '=', $agendaId); $criteres->addCondition('title_event', '=', $event->getSummary()); $criteres->addCondition('datedeb_event', '=', date('Ymd', $event->getStart())); $criteres->addCondition('datefin_event', '=', date('Ymd', $event->getEnd())); if ($event->isWholeDay()) { $criteres->addCondition('alldaylong_event', '=', 1); } else { $criteres->addCondition('heuredeb_event', '=', date('H:i', $event->getStart())); } $resultat = $eventDAO->findBy($criteres); // Si l'évenement n'est pas présent en base on le sauvegarde tel qu'elle if (count($resultat) < 1) { $record = self::createEvent($agendaId, $event); $eventDAO->insert($record); $eventsCounter++; } else { // Sinon, on applique un traitement spécifique aux événements récurrents if ($event->getProperty('recurrence')) { $findSame = false; // On cherche la date de fin de récurrence if ($event->getProperty('freq')) { $endRepeatdateEvent = date('Ymd', $event->getProperty('freq')->lastOccurrence()); } else { $endRepeatdateEvent = 99999999; } // Si dans les résultat, une date de fin de récurrence est trouvé, alors l'évenements est déjà en base foreach ($resultat as $eventSame) { if ($eventSame->endrepeatdate_event == $endRepeatdateEvent || $eventSame->endrepeatdate_event == date('Ymd', $endDate)) { $findSame = true; } } // Sinon, il a pus être purger, on vérifie donc si sa date de fin de récurrence est égale à la date de début de purge if ($resultat[0]->endrepeatdate_event == date('Ymd', $startDate) && !$findSame) { $record = self::createEvent($agendaId, $event); // Dans se cas, la récurrence prendra fin à la date de fin de purge, car un nouvel événement est entré en base pour la suite $record->endrepeatdate_event = date('Ymd', $endDate); $eventDAO->insert($record); } } } } } return $eventsCounter; }
/** * Calculates the timestamp from a DT line. * @param $line SG_iCal_Line * @return int */ private function getTimestamp(SG_iCal_Line $line, SG_iCal $ical) { $ts = strtotime($line->getData()); if (isset($line['tzid'])) { $tz = $ical->getTimeZoneInfo($line['tzid']); $offset = $tz->getOffset($ts); $ts = strtotime(date('D, d M Y H:i:s', $ts) . ' ' . $offset); } return $ts; }