这个 iCal 日历有什么问题吗?

问题描述 投票:0回答:4

我编写了一个脚本来根据数据库中的事件生成 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

php icalendar
4个回答
4
投票

回到基础知识,您无法上传 PHP 脚本,某些日历客户端允许您订阅 URL 来获取 iCal 提要,请确保这是您正在做的事情,并且您没有尝试上传 PHP脚本文件。

如果没问题,那么我们可以看看定义。根据 documentation

ORGANIZER
参数是可选的,如果包含它,则必须有一个冒号
:
和一个 cal-address,它必须是 URI。您的
ORGANIZER
字段如下所示:

ORGANIZER;CN=Blodgruppen

它们应该看起来像这样:

ORGANIZER;CN=Blodgruppen:URI

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

ORGANIZER;CN=Blodgruppen:MAILTO:[email protected]

或者电话号码...

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

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

此外,

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 类型

text/calendar
。如果不是,您可以使用
Content-Type
函数将
header
标头添加到响应中:

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

我希望这有帮助...


3
投票

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

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

0
投票

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.