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


106

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

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

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

皆さんが私に与える、または指摘することができるどんな助けも大歓迎です!!!

回答:


128

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


1
ありがとう。私はそれらのヘッダーが欠けていたものだと思います。このGoogleカレンダーを準備するための最後の手順がいくつかあると思います。URLを介してこのファイルをGoogleカレンダーにフィードしようとすると、「URLからカレンダーをインポートしています...」と表示されますが、ずっとハングします。多分それは投稿する別の質問ですか?
rhodesjason 09/09/23

3
丁度。上記の例を更新しました。また、イベントが更新されたときにクライアントに通知するDTSTAMPプロパティも追加しました。
Stefan Gehrig

1
オーケー、ゲーリッグ、あなたは天才だ。うまくいきました。ありがとう。(私が知る限り、Googleカレンダーもほぼ即座に更新されます。)
rhodesjason

3
私が間違っていない場合。プログラムはUIDを使用して、イベントが削除されたかどうかを確認します。php-scriptが常に別のUID(-> mt_rand)を生成する場合、プログラムは常にコンテンツ全体が変更されたと見なします。すべてが消え、すべてが新しい。個人的には、イベントがデータベース内で同じである場合は同じUIDを使用し、recordID(およびいくつかのホスト情報)のみを使用します。DTSTAMPは、何かが変更されたことを示すためにあります。それで十分でしょう。
Seirddriezel 14

3
Googleカレンダーには* .ics-extensionが必要です。.htaccessを使用している場合は、追加することで作成できます RewriteEngine on RewriteRule ^calendar.ics$ my_php_script.php [QSA]
Fanky

19

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


ヘッダー情報は、FYIの将来の重要な部分です。ほとんどのアプリとプログラムでは、NewLineの改行について心配する必要はありません。バリデータだけがそれをしているようです。しかし、最も重要なことはヘッダー部分です。しばらくそれなしで試してみて、多くの問題を抱えていました。
jfreak53

1
escapeStringの目的は何ですか?私はそれが1つか2つのものをエスケープするはずだと思いましたが、あなたはhtmlspecialchars代わりにそれを使っているようです。
Luc

1
簡単な修正:date( 'Ymd \ THis \ Z'、$ timestamp)。gではなくHにする必要があります。
PedroGóes2017年

6

優れた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();


4

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

また、上の私のサイト、私が持っています

  1. 上の有用なリソースのいくつかのリスト(右下のサイドバーを参照)
    • ical Spec RFC 5545
    • ical Testing Resources
  2. いくつかの注意と私の旅の作業に記録されている.ics最後の数年間。特に、この繰り返しイベントの「チートシート」が役立つ場合があります。

.ics 注意深い取り扱いが必要な領域:

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

2
  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タイプはサーバーで設定されます。


1
私は何度もその仕様を読み込もうとしましたが、icalファイルがどのように見えるかについては、その表と裏を作成できません。少なくとも、.icsファイルにヘッダーまで含める必要があるもの、MIMEタイプを配置する場所などについて実際に話し始めるいくつかの行を教えていただけますか?
rhodesjason 09/09/23

2

このように文字列をフォーマットするか、機能しないことを確認してください

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

1
PHP_EOL代わりに使用することをお勧めします"\n"
はいバリー

4
PHP_EOLは終了行に固有の環境であるため、Windowsでは出力される\r\nので注意してください。
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.