/** * 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; }