将日历显示为iCal,并在PHP中提供订阅选项


Exposing calendar as an iCal with subscribe option in PHP

我在PHP中有一个应用程序,每个用户都有自己关联的事件。

我想做的是以类似于脸书上事件的方式在下面公开他的事件,脸书上的URL格式为webcal://www.facebook.com/ical/b.php?uid=123456789&key=ASD123ASD123ASD,每当有新的事件时,它就会自动传播到我的日历中,我已经将其添加到我的谷歌日历中。

我想做的是在一个url上公开这个日历,比如http://whatever.org/someLongUniquePerUserIdentifier.ics

我试图用一个位于同一url的简单文件来模拟事件生成脚本。这是一个由谷歌使用的ics文件,事件已经添加,但当我更改文件内容(删除了一个事件)=更改了谷歌日历应该订阅的资源时,更改根本没有通过gcal。

由于我找不到任何可靠的文档来源,我尝试用不同的关键词搜索了很多,我只被引导到DAVID、sabredav等webdav服务器。

我在我的服务器上安装了DAMICAL,只是到了这样一种状态:我已经正确安装了服务器,但不知道如何在我想要的url上公开MySQL数据库中的事件,客户端会订阅该url。

sabredav也是如此,只是我还没有尝试让它发挥作用,因为我看不到任何有记录的方式可以使用任何dav服务器将我的事件发布到世界上。

我基本上被困在这样一个地方:我在PHP中使用ics导出,日历客户端不会要求它更新,而CalDAV服务器正在运行,客户端可能会要求它进行更新,但没有数据可返回。

有什么想法吗?

编辑问题:

实现即时单向日历同步的正确方法是什么?

如果我没有错的话,您似乎只需要更改http://whatever.org/someLongUniquePerUserIdentifier.ics中的链接到webcal://whatever.org/someLongUniquePerUserIdentifier.ics

webcal协议应该触发日历软件中的"订阅"操作。如果你看到它下载了一个文件,那么它就没有订阅。

.ics格式在RFCs 5545和6868中定义。您可以自己实现您的输出。但是,由于它包含UTC日期时间等棘手的部分,因此在使用库时可能会更加健壮。

订阅您的活动只不过是将您的url添加到日历应用程序中,该应用程序会对其进行更改轮询。删除事件可能不会将其从日历中删除,应将其状态更改为CANCELLED。

我没有使用任何PHP库的经验,但在谷歌上搜索它会给你带来很多好处。看起来Drupal项目正在讨论它,并正在尝试iCalcreator。


如果你不相信我:

Outlook

将Internet日历订阅添加到OutlookInternet日历订阅是您下载并在Outlook中查看的日历。但是,与日历快照不同,Internet日历订阅是自动更新的。

这些日历可以在人们托管日历的网站上找到。在这样的网站上,您可以单击链接下载并订阅日历,也可以有人通过电子邮件向您发送Internet日历订阅链接。此链接是一个以webcal://(而不是http://)开头的Internet网址,并以具有.ics文件扩展名的文件名结尾。

谷歌日历

从菜单中选择"按URL添加"。以iCalendar格式查找谷歌日历的地址,或者如果您有来自其他应用程序(例如,苹果的iCal)的日历的iCalenda地址,您也可以使用它。在提供的字段中输入地址。

[…]

注意:ICS提要的更改可能需要长达8个小时才能反映在您的谷歌日历中

自从以来一直是这样

Wayback

[…]您还应该将此日历视为应定期检查更改的日历,而不是一次性导入的日历。简单但有效。

因此,如果是it really isnt the case,where you just add url to your the ics resource to your calendar and it will automatically update,那么这可能与webcaluri方案是非官方的,IANA文档充满了未知这一事实有关。


如果您只想要单向同步,那么您不需要DAV服务器。您只需要一个用于双向同步的CalDAV服务器;如果您希望客户端也更新服务器上的日历。