Я пытаюсь добавить объект календаря на мой сервер SabreDAV. С существующего клиента (например, iOS или iCalendar на OSX) это прекрасно работает. Но при попытке добавить новый объект календаря я получаю следующую ошибку:
Сабля \ CalDAV \ Exception \ InvalidComponentType
Объекты iCalendar должны по крайней мере иметь компонент типа
vcal-> serialize имеет следующий вывод:
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Sabre//Sabre VObject 4.1.2//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:sabre-vobject-62abb501-ad16-459b-8891-31e33cf5e9f2
DTSTAMP:20180922T111429Z
SUMMARY:hey
DTSTART;TZID=Europe/Amsterdam:20180922T095000
DTEND;TZID=Europe/Amsterdam:32000922T153800
ATTENDEE:mailto:[email protected]
END:VEVENT
END:VCALENDAR
Код, который я использую для добавления запроса:
$datetime = date('Y-m-d H:i:s');
$begin = new \DateTime(date('Y-m-d H:i:s', strtotime($datetime ."-30 minutes")), new \DateTimeZone('Europe/Amsterdam'));
$end = new \DateTime(strtotime(date('Y-m-d H:i:s', strtotime($datetime))), new \DateTimeZone('Europe/Amsterdam'));
require('vendor/sabre/autoload.php');
$vcal = new \Sabre\VObject\Component\VCalendar();
$vevent = $vcal->add('VEVENT');
$vevent->add('SUMMARY', 'hey');
$vevent->add('DTSTART', $begin);
$vevent->add('DTEND', $end);
$vevent->add('ATTENDEE', 'mailto:[email protected]');
$this->davClient->request('PUT', 'calendars/admin/Rekenen/'.uniqid().'.ics', $vcal->serialize());
Не знаю, является ли это основной причиной проблемы, но ваши DTSTART и DTEND действительно ссылаются на часовой пояс с TZID «Европа / Амстердам», в то время как ваш поток iCalendar не включает соответствующий компонент VTIMEZONE, который дал бы определение этого часового пояса.
BEGIN:VCALENDAR
...
BEGIN:VTIMEZONE
...
END:VTIMEZONE
BEGIN:VEVENT
...
END:VEVENT
END:VCALENDAR
Некоторые серверы принимают такую ссылку без определения, а другие — нет.
Других решений пока нет …