2017-04-06 5 views
0

Pour mon application j'utilise laravel 5.3 et un paquet appelé markuspoerschke/iCal que vous pouvez trouver here. Lorsqu'un étudiant souhaite s'inscrire à son calendrier, nous générons une URL qui peut être renseignée dans Google Agenda et Outlook. Sauf le dernier outlook mentionné, il n'importait aucun événement.Outlook-web-app n'important pas les événements de mon icalendar généré

Exemple de la façon dont notre ICS généré ressemble. Cela contient 1 événement avec la description de 'test'.

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:www.onderwijsonline.nl 
X-PUBLISHED-TTL:PT15M 
BEGIN:VEVENT 
UID:58e5f21fc2551 
DTSTART;TZID=Europe/Amsterdam:20170406T090000 
SEQUENCE:0 
TRANSP:OPAQUE DTEND;TZID=Europe/Amsterdam:20170406T140000 URL:http://oo.dev/calendar/event/420 
SUMMARY:Test 
CLASS:PUBLIC 
DTSTAMP:20170406T094535Z 
END:VEVENT 
END:VCALENDAR 

Le script qui appelle le paquet pour générer ceci:

public function getIcal($token = null) 
    { 
     $user = $this->userRepository->getByToken($token); 

     $vCalendar = new \Eluceo\iCal\Component\Calendar('www.onderwijsonline.nl'); 
     $vCalendar->setPublishedTTL('PT15M'); 

     if (!is_null($user)) { 

      /** 
      * Calendar events 
      */ 
      $events = $this->calendarRepository->getEventsForUser($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6)); 
      foreach ($events as $event) { 

       $vEvent = new \Eluceo\iCal\Component\Event(); 

       $vEvent 
        ->setUseTimezone(true) 
        ->setUseUtc(false) 
        ->setDtStart(Carbon::parse($event['start'])) 
        ->setDtEnd(Carbon::parse($event['end'])) 
        ->setNoTime(($event['allDay'] == 1 ? true : false)) 
        ->setUrl($event['href']) 
        ->setDescription($event['description']) 
        ->setSummary($event['title']); 

       $vCalendar->addComponent($vEvent); 
      } 

      /** 
      * Project events 
      */ 
      $events = $this->calendarRepository->getEventsForProjects($user->id, null, null); 

      foreach ($events as $event) { 
       $vEvent = new \Eluceo\iCal\Component\Event(); 

       $vEvent 
        ->setUseTimezone(true) 
        ->setUseUtc(false) 
        ->setDtStart(Carbon::parse($event['start'])) 
        ->setDtEnd(Carbon::parse($event['end'])) 
        ->setNoTime(($event['allDay'] == 1 ? true : false)) 
        ->setUrl($event['href']) 
        ->setSummary($event['title']); 

       $vCalendar->addComponent($vEvent); 
      } 

      /** 
      * Timetable events 
      */ 
      $events = $this->calendarRepository->getEventsForTimetables($user->id, Carbon::now()->subWeeks(2), Carbon::now()->addWeeks(6)); 
      foreach ($events as $event) { 
       $vEvent = new \Eluceo\iCal\Component\Event(); 

       $vEvent 
        ->setUseTimezone(true) 
        ->setUseUtc(false) 
        ->setDtStart(Carbon::parse($event['start'])) 
        ->setDtEnd(Carbon::parse($event['end'])) 
        ->setNoTime(($event['allDay'] == 1 ? true : false)) 
        ->setSummary($event['title']); 

       $vCalendar->addComponent($vEvent); 
      } 
     } 

     header('Content-Type: text/calendar; charset=utf-8'); 
     header('Content-Disposition: inline; filename=onderwijsonline.ics'); 

     return $vCalendar->render(); 
    } 

Comme je l'ai mentionné plus haut, cette configuration exacte fonctionne très bien pour Google Calendar, mais pas pour les perspectives.

Est-ce que quelqu'un sait pourquoi et comment cela peut-il être corrigé?

Répondre

1

Vous utilisez un TZID = Europe/Amsterdam mais votre fichier ics n'inclut pas la définition VTIMEZONE correspondant à ce TZID. Donc avant votre BEGIN: VEVENT, vous devriez avoir un BEGIN: VTIMEZONE ... END: composant VTIMEZONE. En ce qui concerne pourquoi cela fonctionne encore pour Google mais pas pour Outlook: Beaucoup de produits utilisent les TZIDs Olson afin qu'ils puissent ignorer le fait que la définition de VTIMEZONE est manquante et supposent que votre TZID = Europe/Amsterdam correspond à leur cartographie.

Microsoft, d'autre part, a son propre ensemble d'identifiants TZID (par exemple "Central Europe Standard Time") et ne peut donc pas mapper votre Europe/Amsterdam à une définition connue.

Enfin, au débordement de la pile, au moins vos propriétés TRANSP, DTEND et URL apparaissent sur la même ligne. Je suppose que c'est juste un problème de formatage lors de la soumission de votre question (???).