2017-04-06 33 views
0

對於我的應用程序,我使用laravel 5.3和一個名爲markuspoerschke/iCal的程序包,您可以在其中找到hereOutlook-web-app沒有從我生成的icalendar導入事件

當學生想訂閱他或她的日曆時,我們會生成一個可以填充到Google日曆和Outlook中的URL。除了最後提到的outlook以外,它不會導入任何事件。

我們生成的ICS看起來如何的例子。這包含1個事件,其中描述了'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 

調用包生成這個腳本:

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(); 
    } 

正如我上面提到的,這個確切的設置工作正常的谷歌日曆,但不是前景。

有誰知道爲什麼以及如何修復?

回答

1

您正在使用TZID =歐洲/阿姆斯特丹,但您的ics文件不包含對應於此TZID的VTIMEZONE定義。所以在你的BEGIN:VEVENT之前,你應該有一個BEGIN:VTIMEZONE ... END:VTIMEZONE組件。

至於爲什麼它仍然適用於Google,但不適用於Outlook:很多產品都使用Olson TZID,因此他們可以忽略VTIMEZONE定義丟失的事實,並假設您的TZID =歐洲/阿姆斯特丹對應到他們的映射。

另一方面,Microsoft有自己的一組TZID標識符(例如「中歐標準時間」),因此無法將您的歐洲/阿姆斯特丹映射到已知的定義。

最後,在棧溢出至少你的TRANSP,DTEND和URL屬性確實出現在同一行上。我假設提交您的問題時這只是一個格式問題(???)。

相關問題