Outlook-web-app не импортирует события из моего сгенерированного icalendar

Для моего приложения я использую laravel 5.3 и пакет под названием markuspoerschke/iCal который вы можете найти Вот.

Когда студент хочет подписаться на свой календарь, мы создаем URL, который можно заполнить в Google Calender и Outlook. Кроме последнего outlook это не импорт каких-либо событий.

Пример того, как выглядит наша сгенерированная ICS. Содержит 1 событие с описанием «теста».

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

Как я уже упоминал выше, эта точная настройка отлично работает для Календаря Google, но не для внешнего вида.

Кто-нибудь знает, почему и как это можно исправить?

0

Решение

Вы используете TZID = Europe / Amsterdam, но ваш файл ics не содержит определения VTIMEZONE, соответствующего этому TZID. Поэтому перед тем, как начать BEGIN: VEVENT, у вас должен быть компонент BEGIN: VTIMEZONE … END: VTIMEZONE.

Что касается того, почему он по-прежнему работает для Google, но не для Outlook: многие продукты используют TZID Олсона, поэтому они могут игнорировать тот факт, что определение VTIMEZONE отсутствует, и просто предположить, что ваш TZID = Европа / Амстердам соответствует их отображению.

Microsoft, с другой стороны, имеет свой собственный набор идентификаторов TZID (например, «Стандартное время Центральной Европы») и, следовательно, не может сопоставить вашу Европу / Амстердам с известным определением.

Наконец, при переполнении стека, по крайней мере, ваши свойства TRANSP, DTEND и URL отображаются в одной строке. Я предполагаю, что это просто проблема форматирования при отправке вашего вопроса (???).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]