首页 文章

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

提问于
浏览
99

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

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

  • 什么是确切的格式,包括 Headers ,文件格式,页脚等?换句话说,文件必须具有什么,确切地说,才能被Google日历等正确读入?

  • 如果我使用.php扩展名构建此文件,如何将其作为ical发布?我是否必须写一个新的.ics文件?或者Google Calendar等会将.php文件读为ical,只要内容格式正确吗? (就像一个style.css.php文件将被读取为CSS文件,如果内容实际上是CSS等)

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

7 回答

  • 4

    编辑:实际上我不确定 - 第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类型 .

  • 15

    如果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;
    

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

  • 3

    除了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

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

    同样在my site,我有

    • 一些有用资源列表(见右下角右侧)

    • ical Spec RFC 5545

    • ical测试资源

    • Some notes记录了我在过去几年与 .ics 一起工作的旅程 . 特别是,您可能会发现repeating events 'cheatsheet'非常有用 .

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

    • 'all day'事件

    • 个日期类型(时区,UTC或本地'floating') - nb以了解区别

    • 重复规则的互操作性

  • 2

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

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

  • 120

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

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

相关问题