这个iCal日历出了什么问题?

时间:2012-12-29 19:49:19

标签: php icalendar

我编写了一个脚本,用于根据数据库中的事件生成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 个答案:

答案 0 :(得分:1)

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

如果可以,那么我们可以查看定义。根据{{​​3}},ORGANIZER参数是可选的,如果包含它,则必须包含冒号: cal-address ,它必须是< EM> URI 。您的ORGANIZER字段如下所示:

ORGANIZER;CN=Blodgruppen

他们应该是这样的:

ORGANIZER;CN=Blodgruppen:URI

其中 URI 不一定必须是 mailto documentation。为方便起见,可以像这样添加电子邮件地址......

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

或电话号码......

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

您可以添加一个ftp网址以及其他一些不太常用的内容。或者,该参数不是必需的,因此您只需将其删除即可。

此外,VEVENT似乎缺少必需属性的UIDDTSTAMP

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

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");

我希望这会有所帮助......

答案 1 :(得分:0)

iCal目前不支持PHP文件,但正如您可以在此处阅读的那样,有一个方便的转换工具Importing iCal calendar into MySQL database

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

为了将来的使用,这里有一些在线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