SabreDAV 客户端创建日历对象

Posted

技术标签:

【中文标题】SabreDAV 客户端创建日历对象【英文标题】:SabreDAV Client create calendar object 【发布时间】:2018-09-22 09:29:14 【问题描述】:

我正在尝试将日历对象添加到我的 SabreDAV 服务器中。从现有的客户端(如 ios 或 OSX 上的 iCalendar),这很有效。但是当尝试添加一个新的日历对象时,我得到了以下错误:

Sabre\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:calendar@domain.com
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:calendar@domain.com');

$this->davClient->request('PUT', 'calendars/admin/Rekenen/'.uniqid().'.ics', $vcal->serialize());

【问题讨论】:

【参考方案1】:

不知道这是否是问题的根本原因,但您的 DTSTART 和 DTEND 确实引用了 TZID 为“Europe/Amsterdam”的时区,而您的 iCalendar 流不包含相应的 VTIMEZONE 组件,该组件将给出此定义时区。

BEGIN:VCALENDAR
...
BEGIN:VTIMEZONE
...
END:VTIMEZONE
BEGIN:VEVENT
...
END:VEVENT
END:VCALENDAR

一些服务器确实接受这种没有定义的引用,而另一些则不接受。

【讨论】:

以上是关于SabreDAV 客户端创建日历对象的主要内容,如果未能解决你的问题,请参考以下文章

Google OAuth 2.0 服务帐户 - 日历 API(PHP 客户端)

列出 CalDAV 上可供用户使用的日历 (Bedework)

列出CalDAV(Bedework)上可供用户使用的日历

iOS/OS X 日历应用和 CalDAV 服务自动发现

Android日历序列化与Java 6不兼容

如何为用户的收件箱和日历资源同步客户端