PHP를 사용하여 Google 캘린더에서 읽을 ical 파일을 동적으로 게시하려면 어떻게해야합니까?


106

PHP ical에 대한 모든 Google 검색은 phpicalendar와 IN ical 파일을 구문 분석하거나 읽는 방법을 표시합니다. 데이터베이스에서 이벤트를 가져 와서 ical 형식으로 쓰는 PHP 파일을 작성하고 싶습니다.

내 문제는 두 가지 질문에 답할 수있는 곳을 찾을 수 없다는 것입니다.

  1. 머리글, 파일 형식, 바닥 글 등을 포함한 정확한 ical 형식 은 무엇입니까 ? 즉, Google 캘린더 등에서 제대로 읽기 위해 파일에 정확히 무엇이 있어야합니까?
  2. .php 확장자를 사용하여이 파일을 빌드하는 경우 어떻게 ical로 게시합니까? 새 .ics 파일에 써야합니까? 아니면 내용이 올바른 형식이면 Google 캘린더 등이 .php 파일을 ical로 읽습니까? (내용이 실제로 CSS 인 경우 style.css.php 파일은 CSS 파일로 읽히는 것과 매우 유사합니다.)

여러분 모두가 저에게 줄 수있는 어떤 도움이라도 대단히 감사하겠습니다 !!!

답변:


128

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 파일을 제공하고 있다고 생각하게 만드는 데 필요한 전부입니다. 그러나이 간단한 코드로 실험을 시작할 수 있습니다.


1
감사. 나는 그 헤더가 내가 놓친 것이라고 생각합니다. 이 Google 캘린더를 준비하는 데 몇 가지 마지막 단계가 있다고 가정합니다. URL을 통해이 파일을 Google 캘린더에 제공하려고 할 때 "URL에서 캘린더 가져 오기 ..."라고 표시되지만 계속 중단됩니다. 게시 할 다른 질문일까요?
rhodesjason

3
바로 그거죠. 위의 예제를 업데이트했으며 이벤트가 업데이트되었을 때 클라이언트에 알리는 DTSTAMP 속성도 추가했습니다.
Stefan Gehrig

1
좋아요 Gehrig, 당신은 천재입니다. 작동했습니다. 감사. (Google 캘린더도 거의 즉시 업데이트되고 있음을 알 수 있습니다.)
rhodesjason

3
내가 틀리지 않는 경우. 프로그램은 UID를 사용하여 이벤트가 삭제되었는지 확인합니다. PHP 스크립트가 항상 다른 UID (-> mt_rand)를 생성하면 프로그램은 항상 전체 내용이 변경된 것으로 간주합니다. 모든 것이 사라지고 모든 것이 새롭습니다. 개인적으로 이벤트가 데이터베이스에서 동일한 경우 동일한 UID를 고수하고 recordID (및 일부 호스트 정보) 만 사용합니다. DTSTAMP는 무언가 변경되었음을 보여주기 위해 존재합니다. 충분합니다.
Seirddriezel 2014-04-23

3
Google 캘린더에는 * .ics- 확장자가 필요합니다. .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은 무엇입니까? 나는 그것이 한두 가지 탈출해야한다고 생각했지만 htmlspecialchars대신 사용 하는 것 같습니다 .
Luc

1
빠른 수정 : date ( 'Ymd \ THis \ Z', $ timestamp). g 대신 H 여야합니다.
Pedro Góes 2017

6

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();


4

http://www.kanzaki.com/docs/ical/ 에는 이전 사양보다 약간 더 읽기 쉬운 버전이 있습니다. 시작점으로 도움이됩니다. 많은 것들이 여전히 동일합니다.

또한 내 사이트 에서

  1. 유용한 리소스 목록 (오른쪽 하단 사이드 바 참조)
    • ical 사양 RFC 5545
    • ical 테스트 리소스
  2. .ics지난 몇 년 동안 작업 한 여정에 기록 된 일부 메모 입니다. 특히이 반복되는 이벤트 '치트 시트' 가 유용 할 수 있습니다.

.ics 주의 깊은 취급이 필요한 영역 :

  • '종일'이벤트
  • 날짜 유형 (시간대, UTC 또는 로컬 '부동')-구별을 이해하려면 nb
  • 반복 규칙의 상호 운용성

2
  1. 정확한 ical 형식 : http://www.ietf.org/rfc/rfc2445.txt
  2. 사양에 따르면 .ics로 끝나야합니다.

편집 : 실제로 나는 확실하지 않습니다-6186 행은 .ics 명명 형식의 예를 제공하지만 url 매개 변수를 사용할 수 있다고도 말합니다. MIME 유형이 올바른 한 중요하지 않다고 생각합니다.

편집 : wikipedia의 예 : 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

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".
Yes Barry

4
PHP_EOL은 끝줄에 특정한 환경이므로 창에서 출력 \r\n되므로 명심하십시오!
크리스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.