我如何使用PHP动态发布到通过谷歌日历读取iCal文件?(How can I use PHP to

2019-07-19 02:21发布

在PHP的iCal任何谷歌搜索只是带来了phpicalendar以及如何解析或读取在iCal文件。 我只想写拉动从我的数据库事件和iCal格式写出来的PHP文件。

我的问题是我无法找到任何地方将回答两个问题:

  1. 什么是确切的iCal格式,包括标题,文件格式,页脚等等? 换句话说,什么是文件必须有,就是这样,为了得到妥善的谷歌日历等阅读?
  2. 如果我使用PHP扩展构建这个文件,我怎么发布为上的吗? 我必须写一个新的.ics文件? 或将谷歌日历等读取PHP文件为iCal中,只要内容是正确的格式? (很像style.css.php文件将如果内容实际上是CSS等被解读为一个CSS文件)

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

Answer 1:

这应该是很简单的,如果谷歌日历不需要*.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文件,即使有可能是关于缓存,文字编码等一些问题。 但是,你可以开始使用这个简单的代码进行试验。



Answer 2:

记除了这两个斯特凡格里克的回答和Dave无的回答(和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文件验证正确。



Answer 3:

有一位优秀的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();


Answer 4:

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



Answer 5:

http://www.kanzaki.com/docs/ical/有旧规范的一个稍微更可读的版本。 它有助于为出发点 - 很多东西仍然是相同的。

同样在我的网站 ,我有

  1. 有用的资源,对一些列表(见边栏右下)
    • iCal的规格RFC 5545
    • iCal的测试资源
  2. 一些注意事项记录在我的旅程有工作.ics在过去的几年里。 特别是,你会发现这个重复事件“的cheatsheet”是有用的。

.ics一个需要小心处理方面:

  • “全天”事件
  • 类型日期(时区,UTC或本地“浮动”) - NB理解的区别
  • 复发规则的互操作性


Answer 6:

  1. 精确iCal格式: 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类型的服务器上配置。



Answer 7:

请确保您格式化字符串这样或它不会工作

 $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";


文章来源: How can I use PHP to dynamically publish an ical file to be read by Google Calendar?