我如何使用PHPdynamic发布一个ical文件供Google日历读取?

任何在PHP上的Googlesearch都会带来phpicalendar,以及如何parsing或读取IN文件。 我只是想写一个PHP文件,从我的数据库拉事件,并以ical格式写出来。

我的问题是我找不到任何地方会回答两个问题:

  1. 什么是确切的格式,包括标题,文件格式,页脚等? 换句话说,为了能够被Google日历等正确地读入,文件必须具备哪些内容?
  2. 如果我使用.php扩展名构build这个文件,我该如何将它发布为ical? 我必须写一个新的.ics文件吗? 或者,只要内容格式正确,Google Calendar等会将.php文件读取为“ (就像一个style.css.php文件,如果内容实际上是CSS等,将被读作一个CSS文件)

任何帮助你都可以给或指向我将不胜感激!

如果Google日历不需要*.ics -extension(这将需要在服务器中重写一些URL),这应该是非常简单的。

 $ical = "BEGIN:VCALENDAR VERSION:2.0 PRODID:-//hacksw/handcal//NONSGML v1.0//EN BEGIN:VEVENT UID:" . md5(uniqid(mt_rand(), true)) . "@yourhost.test DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z DTSTART:19970714T170000Z DTEND:19970715T035959Z SUMMARY:Bastille Day Party END:VEVENT END:VCALENDAR"; //set correct content-type-header header('Content-type: text/calendar; charset=utf-8'); header('Content-Disposition: inline; filename=calendar.ics'); echo $ical; exit; 

这基本上是让客户认为自己服务于一个iCalendar文件所需要的全部东西,尽pipe在caching,文本编码等方面可能存在一些问题。 但是你可以开始试验这个简单的代码。

除了Stefan Gehrig的回答和Dave None的回答(以及mmmshuddup的回复)外,还有一些关于个人经历的logging:

当我在http://severinghaus.org/projects/icv/上使用ICSvalidation器时,我使用;\ n和PHP_EOLvalidation问题

我知道我必须使用\ r \ n才能正确validation,所以这是我的解决scheme:

 function dateToCal($timestamp) { return date('Ymd\Tgis\Z', $timestamp); } function escapeString($string) { return preg_replace('/([\,;])/','\\\$1', $string); } $eol = "\r\n"; $load = "BEGIN:VCALENDAR" . $eol . "VERSION:2.0" . $eol . "PRODID:-//project/author//NONSGML v1.0//EN" . $eol . "CALSCALE:GREGORIAN" . $eol . "BEGIN:VEVENT" . $eol . "DTEND:" . dateToCal($end) . $eol . "UID:" . $id . $eol . "DTSTAMP:" . dateToCal(time()) . $eol . "DESCRIPTION:" . htmlspecialchars($title) . $eol . "URL;VALUE=URI:" . htmlspecialchars($url) . $eol . "SUMMARY:" . htmlspecialchars($description) . $eol . "DTSTART:" . dateToCal($start) . $eol . "END:VEVENT" . $eol . "END:VCALENDAR"; $filename="Event-".$id; // Set the headers header('Content-type: text/calendar; charset=utf-8'); header('Content-Disposition: attachment; filename=' . $filename); // Dump load echo $load; 

这停止了​​我的parsing错误,并使我的ICS文件正确validation。

http://www.kanzaki.com/docs/ical/拥有旧版规格稍微可读的版本。; 它有助于作为一个起点 – 许多事情仍然是一样的。

也在我的网站上 ,我有

  1. 一些有用的资源列表(请参阅侧边栏右下angular)
    • ical Spec RFC 5545
    • icaltesting资源
  2. 在过去的几年里,我在与.ics合作的旅程中logging了一些笔记 。 特别是,你可能会发现这个重复事件的“备忘录”是有用的。

需要小心处理的区域:

  • “全天”事件
  • datetypes(时区,UTC或本地“浮动”) – NB了解区别
  • 复发规则的互操作性

有一个很好的洗脱包,可以让你轻松创buildics文件。

以下是文档中的示例用法:

 // 1. Create new calendar $vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com'); // 2. Create an event $vEvent = new \Eluceo\iCal\Component\Event(); $vEvent->setDtStart(new \DateTime('2012-12-24')); $vEvent->setDtEnd(new \DateTime('2012-12-24')); $vEvent->setNoTime(true); $vEvent->setSummary('Christmas'); // Adding Timezone (optional) $vEvent->setUseTimezone(true); // 3. Add event to calendar $vCalendar->addComponent($vEvent); // 4. Set headers header('Content-Type: text/calendar; charset=utf-8'); header('Content-Disposition: attachment; filename="cal.ics"'); // 5. Output echo $vCalendar->render(); 

也许有点晚,但这里是一个实际规范的链接。 http://tools.ietf.org/html/rfc5545 1

  1. 确切的格式: http : //www.ietf.org/rfc/rfc2445.txt
  2. 根据规范,它必须以.ics结尾

编辑:其实我不知道 – 行6186给出了一个在.ics命名格式的例子,但它也说明你可以使用url参数。 我不认为这很重要,只要MIMEtypes是正确的。

编辑:维基百科示例: http : //en.wikipedia.org/wiki/ICalendar

 BEGIN:VCALENDAR VERSION:2.0 PRODID:-//hacksw/handcal//NONSGML v1.0//EN BEGIN:VEVENT DTSTART:19970714T170000Z DTEND:19970715T035959Z SUMMARY:Bastille Day Party END:VEVENT END:VCALENDAR 

MIMEtypes在服务器上configuration。

确保你像这样格式化string,否则它不会工作

  $content = "BEGIN:VCALENDAR\n". "VERSION:2.0\n". "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n". "BEGIN:VEVENT\n". "UID:".uniqid()."\n". "DTSTAMP:".$time."\n". "DTSTART:".$time."\n". "DTEND:".$time."\n". "SUMMARY:".$summary."\n". "END:VEVENT\n". "END:VCALENDAR";