Как я могу использовать PHP для динамической публикации файла ical для чтения в Google Calendar?
любой поиск Google на PHP ical просто вызывает phpicalendar и как анализировать или читать в файлах ical. Я просто хочу написать PHP-файл, который извлекает события из моей базы данных и записывает их в формате ical.
моя проблема в том, что я не могу найти нигде, что ответит на два вопроса:
- Что такое точно ческих формат, включая заголовки, формат файла, колонтитулы и т. д.? Другими словами, что именно должен иметь файл, чтобы быть правильно читать в Календаре Google и т. д.?
- если я создам этот файл с помощью a .PHP расширение, как я могу опубликовать его как ical? Нужно ли мне писать в новый .файл ics? Или календари. Читать.php-файл как ical до тех пор, пока содержимое находится в правильном формате? (Очень похоже на стиль.стиль CSS.php-файл будет читаться как CSS-файл, если содержимое на самом деле CSS и т. д.)
любая помощь, которую вы все можете дать или указать мне, будет очень признательна!!!
7 ответов:
Это должно быть очень просто, если Календарь 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, хотя могут возникнуть некоторые проблемы с кэшированием, кодированием текста и так далее. Но вы можете начать экспериментировать с этим простым кодом.
Примечание личного опыта в дополнение к ответу Стефана Герига и ответу Дэйва Нона (и ответ мммшуддупа):
У меня были проблемы с проверкой, используя как \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/ имеет немного более читаемую версию старой спецификации. Это помогает в качестве отправной точки - многие вещи остаются неизменными.
на мой сайт, Я
- некоторые списки полезных ресурсов (см. боковую панель внизу справа) на
- ical Spec RFC 5545
- ical тестирование ресурсов
- заметки записано в моем путешествии работа с
.ics
за последние несколько лет. В частности, вы можете найти это повторяющиеся события 'cheatsheet' чтобы быть полезным.
.ics
области, которые нуждаются в тщательном обращении:'весь день'
- типы дат (часовой пояс, UTC или локальный "плавающий") - nb, чтобы понять различие
- совместимость правил повторения
отличная 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();
может быть, немного поздно, но вот ссылка на фактический спецификация. http://tools.ietf.org/html/rfc55451
- точный формат ical:http://www.ietf.org/rfc/rfc2445.txt
- согласно спецификации, он должен закончиться .ics
Edit: на самом деле я не уверен-строка 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";