如何使用PHP动态发布一个被谷歌日历读取的文件?

2022-08-30 07:20:34

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

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

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

你们都可以给予或指出的任何帮助将不胜感激!!!


答案 1

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

$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文件所需的全部内容,即使可能存在一些有关缓存,文本编码等的问题。但是你可以开始尝试这个简单的代码。


答案 2

除了Stefan Gehrig的回答和Dave None的答案(以及mmmshuddup的回复)之外,还有个人经验的说明:

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

我了解到我必须使用 \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文件正确验证。


推荐