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

rho*_*son 103 php icalendar calendar

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

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

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

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

Ste*_*rig 124

如果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;
Run Code Online (Sandbox Code Playgroud)

这基本上只需要让客户认为您正在提供iCalendar文件,即使可能存在一些与缓存,文本编码等有关的问题.但是你可以开始尝试这个简单的代码.

  • 究竟.我更新了上面的示例 - 我还添加了一个DTSTAMP属性,它将告诉客户端事件何时更新. (3认同)
  • 如果我没错的话.程序使用UID查看是否删除了某个事件.如果php脚本总是生成另一个UID( - > mt_rand),程序将始终认为整个内容已更改.一切都消失了,一切都是新的.我个人会坚持使用相同的UID,如果事件在数据库中是相同的,只需使用recordID(和一些主机信息).DTSTAMP可以显示出一些变化.那应该够了. (3认同)
  • Google日历需要*.ics-extension.如果你使用的是.htaccess,可以通过添加`RewriteEngine on``RewriteRule ^ calendar.ics $ my_php_script.php [QSA]来实现. (3认同)

小智 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;
Run Code Online (Sandbox Code Playgroud)

这阻止了我的解析错误并使我的ICS文件正确验证.

  • 快速修复:date('Ymd\THis\Z', $timestamp)。应该是 H 而不是 g。 (2认同)

Iva*_*ych 6

有一个优秀的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();
Run Code Online (Sandbox Code Playgroud)


Sei*_*zel 5

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