web-dev-qa-db-ja.com

PHPを使用して、Googleカレンダーで読み取れるicalファイルを動的に公開するにはどうすればよいですか?

PHP icalでGoogle検索を行うと、phpicalendarが表示され、IN icalファイルを解析または読み取る方法がわかります。イベントをプルするPHP私のデータベースとそれらをical形式で書き出します。

私の問題は、2つの質問に答える場所が見つからないことです。

  1. exact ical形式(ヘッダー、ファイル形式、フッターなどを含む)とは何ですか?つまり、Googleカレンダーなどで適切に読み込むために、ファイルは正確に何を持っている必要がありますか?
  2. .php拡張子を使用してこのファイルをビルドする場合、icalとして公開するにはどうすればよいですか?新しい.icsファイルに書き込む必要がありますか?または、Googleカレンダーなどは、コンテンツが正しい形式である限り、.phpファイルをicalとして読み取りますか? (コンテンツが実際にCSSである場合、style.css.phpファイルはCSSファイルとして読み込まれます。)

あなたがすべて私に与えることができるか、私を指すことができるどんな助けも大歓迎されます!!!

102
rhodesjason

これは、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ファイルを提供していると思わせるために必要なのは、これだけです。ただし、この単純なコードを試してみることができます。

123
Stefan Gehrig

Stefan Gehrigの回答とDave Noneの回答(およびmmmshuddupの回答)に加えて、個人的な経験のメモ:

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ファイルが適切に検証されました。

16
Kane Ford

Icsファイルを簡単に作成できる優れた eluceo/ical パッケージがあります。

ドキュメントの使用例を次に示します。

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

少し遅れるかもしれませんが、実際の仕様へのリンクはこちらです。 http://tools.ietf.org/html/rfc55451

4
Seirddriezel

http://www.kanzaki.com/docs/ical/ には、古い仕様の読みやすいバージョンがあります。それは出発点として役立ちます-多くのことはまだ同じです。

また my site で、私は

  1. の便利なリソースのリスト(右下のサイドバーを参照)
    • ical Spec RFC 5545
    • icalテストリソース
  2. いくつかのメモ.ics ここ数年にわたって。特に、これは イベント 'チートシート'を繰り返す が有用であることがわかります。

.ics注意深い取り扱いが必要なエリア:

  • 「終日」イベント
  • 日付のタイプ(タイムゾーン、UTC、またはローカル「浮動」)-区別を理解するためのnb
  • 繰り返しルールの相互運用性
4
anmari

必ずこのように文字列をフォーマットしてください。そうしないと動作しません

 $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";
2
Dave None
  1. 正確な形式: 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タイプはサーバーで構成されます。

2
lod3n