2

我编写了一个脚本来根据我数据库中的事件生成 iCal 日历。这是一个示例输出:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
ORGANIZER;CN=Blodgruppen
DTSTART:20130128T173000Z
DTEND: 20130128T193000Z
SUMMARY: Su-möte
END:VEVENT
BEGIN:VEVENT
ORGANIZER;CN=F-styret
DTSTART:20130128T173000Z
DTEND: 20130128T193000Z
SUMMARY: Su-möte
END:VEVENT
BEGIN:VEVENT
ORGANIZER;CN=Blodgruppen
DTSTART:20130412T100000Z
DTEND: 20130414T180000Z
SUMMARY: KTH
END:VEVENT
BEGIN:VEVENT
ORGANIZER;CN=F-styret
DTSTART:20130412T100000Z
DTEND: 20130414T180000Z
SUMMARY: KTH
END:VEVENT
END:VCALENDAR

当我尝试在 iCal 中订阅它时,它说该文件无效。有谁知道为什么?

另外,有谁知道我是否会因为我的文件结尾是 .php 而不是 .ics 而在某个地方遇到问题?

(如果有帮助,我通过查看维基百科上的示例构建了上述内容:http ://en.wikipedia.org/wiki/ICalendar#Core_object )

4

4 回答 4

3

回到基础,你不能上传你的 PHP 脚本,一些日历客户端允许你订阅一个 URL 来获取 iCal 提要,确保这是你正在做的并且你没有尝试上传 PHP 脚本文件。

如果没问题,那么我们可以查看定义。根据文档ORGANIZER参数是可选的,如果包含它,它必须有一个冒号:和一个cal-address,它必须是一个URI。您的ORGANIZER字段如下所示:

ORGANIZER;CN=Blodgruppen

它们应该如下所示:

ORGANIZER;CN=Blodgruppen:URI

如果URI不一定是mailto这里有一些例子。为方便起见,可以像这样添加电子邮件地址...

ORGANIZER;CN=Blodgruppen:MAILTO:bob@b.com

或者电话号码...

ORGANIZER;CN=Blodgruppen:TEL:+49-01234-56789

您可以包含一个 ftp URL 网络以及其他一些较少使用的东西。或者,该参数不是必需的,因此您可以简单地删除它。

此外,似乎VEVENT缺少 aUID和 aDTSTAMP这是必需的属性。

UID可以是您选择的标识符,但它应该是全局唯一的。我将花点时间通过描述参数的含义来解释全局唯一性的含义UID。日历客户端将使用它来识别事件,如果您使用日历中已经存在的事件的 id,它将更新该事件,认为您的意思是让它这样做,因此它不能与现有事件的 id 匹配. 如果您考虑将事件添加到可能还包含事件的许多不同日历客户端,这就是它必须“全局”唯一的原因。uniqid()您可以在 PHP 中使用一个函数,它可能有助于创建您自己的全局唯一标识符。

DTSTAMP是事件创建或上次更新的时间。

您定义中的空格不一致,文档没有讨论参数和值之间的空格,但所有示例都显示没有空格,因此您可能还想删除任何非必要的空格...

DTEND: 20130128T193000Z

成为...

DTEND:20130128T193000Z

它可能不会受到伤害,但有可能。我也会开始尝试使用最少参数的一个事件,以检查它是否是导致问题的 iCal 定义。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:20121229T212000Z-test-1
DTSTAMP:20121229T212000Z
DTSTART:20130128T173000Z
DTEND:20130128T193000Z
END:VEVENT
END:VCALENDAR

您可能想检查您的 PHP 脚本是否也使用了正确的 mime-type text/calendar。如果不是,您可以Content-Type使用以下函数将标头添加到响应中header

 header("Content-Type: text/calendar");

我希望这有帮助...

于 2012-12-29T20:27:18.030 回答
3

为了将来使用,这里有一些在线 icalendar 验证器:

icalendar.org 在您的样本中报告了这些错误:

错误

Missing DTSTAMP property near line # 4Reference: RFC 5545 3.6.1. Event Component
Missing UID property near line # 4Reference: RFC 5545 3.6.1. Event Component
Invalid DTEND value, must be a date or date-time value near line # 4Reference: 3.3.5. Date-Time
Missing DTSTAMP property near line # 10Reference: RFC 5545 3.6.1. Event Component
Missing UID property near line # 10Reference: RFC 5545 3.6.1. Event Component
Invalid DTEND value, must be a date or date-time value near line # 10Reference: 3.3.5. Date-Time
Missing DTSTAMP property near line # 16Reference: RFC 5545 3.6.1. Event Component
Missing UID property near line # 16Reference: RFC 5545 3.6.1. Event Component
Invalid DTEND value, must be a date or date-time value near line # 16Reference: 3.3.5. Date-Time
Missing DTSTAMP property near line # 22Reference: RFC 5545 3.6.1. Event Component
Missing UID property near line # 22Reference: RFC 5545 3.6.1. Event Component
Invalid DTEND value, must be a date or date-time value near line # 22Reference: 3.3.5. Date-Time
于 2016-04-17T13:32:45.277 回答
0

您可以将 ics 文件导入谷歌日历进行测试,

你会发现其中一个借口是,你应该在每个事件中都有 UID 属性,

然后,您可以轻松地将这些事件放入谷歌日历

于 2013-02-06T15:53:47.777 回答
0

iCal 目前不支持 PHP 文件,但您可以在此处阅读,有一个方便的转换工具将 iCal 日历导入 MySQL 数据库

于 2012-12-29T19:51:48.540 回答