111

任何关于 PHP ical 的 Google 搜索都会显示 phpicalendar 以及如何解析或读取 IN ical 文件。我只想编写一个 PHP 文件,从我的数据库中提取事件并以 ical 格式将它们写出来。

我的问题是我找不到可以回答两个问题的地方:

  1. 确切的格式是什么,包括页眉、文件格式、页脚等?换句话说,该文件必须具备什么才能被 Google 日历等正确读取?
  2. 如果我使用 .php 扩展名构建此文件,如何将其发布为 ical?我必须写入新的 .ics 文件吗?或者只要内容格式正确,Google Calendar 等是否会读取 .php 文件?(很像 style.css.php 文件如果内容实际上是 CSS 等,将被读取为 CSS 文件等)

大家可以给予或指出我的任何帮助将不胜感激!!!

4

7 回答 7

135

如果 Google 日历不需要*.ics- 扩展名(这将需要在服务器中重写一些 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 文件所需的全部内容,即使可能存在一些关于缓存、文本编码等的问题。但是您可以开始尝试这个简单的代码。

于 2009-09-23T06:59:32.177 回答
23

除了 Stefan Gehrig 的回答和 Dave None 的回答(以及 mmmshuddup 的回答)之外的个人经历:

当我在http://severinghaus.org/projects/icv/使用 ICS 验证器时,我在使用 \n 和 PHP_EOL 时遇到了验证问题

我了解到我必须使用 \r\n 才能使其正确验证,所以这是我的解决方案:

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;

这停止了​​我的解析错误并使我的 ICS 文件正确验证。

于 2013-09-20T03:14:48.710 回答
7

有一个出色的eluceo/ical包,可让您轻松创建 ics 文件。

这是来自文档的示例用法:

// 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();
于 2016-04-13T10:33:05.800 回答
4

http://www.kanzaki.com/docs/ical/有一个更易读的旧规范版本。它有助于作为一个起点 - 许多事情仍然是一样的。

同样在我的网站上,我有

  1. 一些有用资源的列表(见侧边栏右下角)
    • 标准规范 RFC 5545
    • 测试资源
  2. 一些笔记记录在我.ics过去几年的工作旅程中。特别是,您可能会发现此重复事件“备忘单”很有用。

.ics需要小心处理的区域:

  • “全天”活动
  • 日期类型(时区、UTC 或本地“浮动”) - 注意区分
  • 重复规则的互操作性
于 2012-05-08T02:30:04.213 回答
4

也许有点晚了,但这里有一个实际规范的链接。https://www.rfc-editor.org/rfc/rfc5545[1]

于 2014-01-07T08:58:47.950 回答
2
  1. 确切格式:http ://www.ietf.org/rfc/rfc2445.txt
  2. 根据规范,它必须以 .ics 结尾

编辑:实际上我不确定 - 第 6186 行给出了 .ics 命名格式的示例,但它也声明您可以使用 url 参数。我认为这并不重要,只要 MIME 类型正确。

编辑:来自维基百科的示例: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

MIME 类型在服务器上配置。

于 2009-09-23T01:20:44.897 回答
2

确保像这样格式化字符串,否则它将不起作用

 $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";
于 2013-08-07T23:03:28.387 回答