2016-04-21 57 views
0

我使用用户数据库和共享日历(事件)审核数据库运行PHP网站。为网站会员发布CalDav事件并管理参与者

我想在iCal发布这些事件/的CalDAV让议员:

  • 获取所有日历事件,同步,与认证(私人网址...)
  • 加入事件
  • (但不能创建或修改的事件)

该应用程序将利用现有的用户&日历数据库的网站。

我看着在PHP & Python中CalDav的实现,他们都显得太复杂了这个简单的用法:

  • sabre/dav具有实验共享日历支持,并利用现有的用户数据库似乎棘手。
  • DAViCal似乎有它自己的用户数据库,复杂的ACL方案等
  • 等等

如何做到这一点?

  • 使用CalDAV/iCal库进行了改造?任何想做图书馆的想法?
  • 编写我自己的CalDAV/iCal服务器,存在客户端支持不佳的风险。

编辑:相关链接使用剑/ DAV与现有的网站数据库:

编辑:改进:

  • 虽然它按预期工作,saber/DAV的方式太慢在创建一个服务器端事件与邀请约100本地人(“校长”)。它会为每个被邀请者生成99x无用的副本。花了8秒钟处理邀请(30多秒xdebug分析,它崩溃了!)。

  • 使用共享日历,有只有两个标准的可能性关于:要么给被邀请者读写存取权限,这样他就可以读 - 加入该活动(而且还改变/删除它!),或者给他只能访问...但他不能加入它。所以我已经玩Sabre\CalDAV\Backend\PDO::updateCalendarObject()限制事件编辑给参与者PARTSTAT

但无论解决方案,有一个与问题冲突

  • 当参与者A修改了日历项说它参与(PARTSTAT ACCEPTED),军刀/ DAV过程通过更新此信息所有用户日历中的所有日历对象。这样做时,SabreDAV递增所有这些日历的SYNC标记。

  • 因此,当参与者B试图加入一个事件,但不同步的是参与者A在此期间加入了该事件的信息,有冲突和参与者B加入信息LOST

冲突的解决方案:

  • RFC 6638定义了一种方法,通过使用一个schedule-tag避免这样的冲突。这仅适用于v3.3的Sabre/DAV路线图。我已经开发了对saber/dav here的实验性支持,但仍然,我测试过的所有Android客户端都不支持此RFC,只有iOS才支持!无论如何,即使使用schedule-tag,如果组织者更改了事件数据或使用共享日历,某些参与者加入信息也会丢失。

  • 因此,我已经制作了自己的saber/dav实现,大多数情况下从不松散参与者加入信息(除了事件重新计划时):sabre/dav partstat-only-calendar。基本上,它的工作原理是考虑到用户发送的冲突EVENT,并且只记录服务器事件中的参与者PARSTAT信息,而不是通常推送PreconditionFailed异常。我仍然需要发布一个利用所有功能的服务器运行脚本示例。

回答

1

(这个问题似乎对StackOverflow上有点广阔。)

SabreDAV似乎实现PHP中的校准/服务器的CardDAV时要选择。使用它很可能是有意义的。

一)获取所有日历活动,同步,与认证(私人网址...)

嗯,这应包括在内。

B)加入一个事件

我假设你的使用情况是,你有一个事件,但是用户不主动邀请的。但是您仍然希望用户用户将自己添加到该事件中。 这不是CalDAV标准目前支持的用例。 CalDAV中有共享日历,并且有服务器端计划事件。我认为后者可能适合你。

你可以综合这个'加我'的行为。将用户呈现给客户端时,将该用户动态添加为事件的参与者。他可以接受/可能/拒绝它。如果他这样做,坚持这个事实在主事件 - 他现在是一个普通的受邀者。

C)(但不能创建或修改的事件)

这是ITIP /的CalDAV服务器调度事件的默认行为。只有ORGANIZER可以修改事件,除了像报警等东西。 因此,这似乎适合您的使用情况。

+0

谢谢,你让我使用SabreDAV。它可以使用自定义的'authentication','principal'和'calendar'后台来设置,所以这就是使用现有站点数据库的方法。文档没有例子,但[帮助](https://github.com/fruux/sabre-dav/issues/322#issuecomment-15311433)。 – KrisWebDev