如何使用PHP动态发布Google Calendar要读取的文件?

时间:2009-09-23 01:16:18

标签: php calendar icalendar

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

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

  1. 什么是完全格式,包括标题,文件格式,页脚等?换句话说,文件必须具备什么,以便Google日历等正确读入?
  2. 如果我使用.php扩展名构建此文件,如何将其发布为ical?我是否必须写一个新的.ics文件?或者Google Calendar等会将.php文件读为ical,只要内容格式正确吗? (就像一个style.css.php文件将被读作CSS文件,如果内容实际上是CSS等)。
  3. 非常感谢大家给予或指出的任何帮助!!!

7 个答案:

答案 0 :(得分:122)

如果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文件。但是你可以开始尝试这个简单的代码。

答案 1 :(得分:16)

除了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文件正确验证。

答案 2 :(得分:5)

有一个优秀的eluceo/ical软件包,可以让您轻松创建ics文件。

以下是docs的示例用法:

// 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();

答案 3 :(得分:4)

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

同样在my site上,我有

  1. 一些有用资源列表(请参阅右下角右侧)
    • 规范RFC 5545
    • 测试资源
  2. Some notes记录了我在过去几年中与.ics合作的旅程。特别是,您可能会发现此repeating events 'cheatsheet'很有用。
  3. .ics需要小心处理的区域:

    • '全天'活动
    • 日期类型(时区,UTC或本地'浮动') - nb以理解区别
    • 重复规则的互操作性

答案 4 :(得分:4)

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

答案 5 :(得分:2)

  1. 确切格式:http://www.ietf.org/rfc/rfc2445.txt
  2. 根据规范,它必须以.ics结尾
  3. 编辑:实际上我不确定 - 第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类型。

答案 6 :(得分: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";