Как я могу использовать PHP для динамического опубликования файла iical для чтения в Календаре Google?

Любой поиск Google на PHP ical просто вызывает phpicalendar и как анализировать или читать IN-файлы. Я просто хочу написать файл PHP, который вытаскивает события из моей базы данных и записывает их в формате.

Моя проблема: я не могу найти нигде, которая ответит на два вопроса:

  1. Каков точный формат, включая заголовки, формат файла, нижние колонтитулы и т. Д.? Другими словами, что должен иметь файл, чтобы точно прочитать его в Календаре Google и т. Д.?
  2. Если я создам этот файл с расширением .php, как его опубликовать как ical? Должен ли я писать в новый файл .ics? Или Google Calendar и т. Д. Читать файл .php как обычный, пока содержимое находится в правильном формате? (Так же, как файл style.css.php будет считаться файлом CSS, если содержимое на самом деле является CSS и т. Д.)

Любая помощь, которую вы можете дать или указать мне, будет очень признательна!

Это должно быть очень просто, если в Календаре 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, хотя могут быть некоторые проблемы, связанные с кэшированием, кодированием текста и т. Д. Но вы можете начать экспериментировать с этим простым кодом.

Заметка личного опыта в дополнение к ответу Стефана Герига и ответа Дейва Нет (и ответ 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 правильными.

http://www.kanzaki.com/docs/ical/ имеет немного более читаемую версию более старой спецификации. Это помогает в качестве отправной точки – многие вещи остаются прежними.

Также на моем сайте у меня есть

  1. Некоторые списки полезных ресурсов (см.
    • Технические характеристики RFC 5545
    • Ресурсы для тестирования
  2. Некоторые заметки, записанные в моем путешествии, работающие с .ics течение последних нескольких лет. В частности, вы можете найти, что это повторяющиеся события «cheatsheet» будут полезными.

.ics областях, которые требуют тщательной обработки:

  • события «весь день»
  • типы дат (часовой пояс, UTC или локальный «плавающий») – nb, чтобы понять различие
  • совместимость правил повторения

Существует отличный пакет 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(); 

Может быть, немного поздно, но вот ссылка на настоящую спецификацию. http://tools.ietf.org/html/rfc5545 1

  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 настроен на сервере.

Удостоверьтесь, что вы форматируете эту строку, как это, или она не будет работать

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