我编写了一个脚本,用于根据数据库中的事件生成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)
答案 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
似乎缺少必需属性的UID
和DTSTAMP
。
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