Как я могу использовать PHP для динамической публикации файла, который будет прочитан Календарем Google?
Любой поиск Google на PHP обычно вызывает phpicalendar и позволяет анализировать или читать IN-файлы. Я просто хочу написать файл PHP, который извлекает события из моей базы данных и записывает их в обычном формате.
Моя проблема в том, что я не могу найти нигде, чтобы ответить на два вопроса:
- Каков точный формат, включая заголовки, формат файлов, нижние колонтитулы и т. Д.? Другими словами, что именно должен иметь файл, чтобы он был правильно прочитан Календарем Google и т. Д.?
- Если я создаю этот файл, используя расширение.php, как мне опубликовать его как ical? Нужно ли мне писать в новый файл.ics? Или Google Calendar и т. Д. Будет считывать файл.php как обычный, если его содержимое находится в правильном формате? (Очень похоже на файл style.css.php, который будет читаться как файл CSS, если содержимое на самом деле CSS и т. Д.)
Любая помощь, которую вы все можете дать или указать мне, будет принята с благодарностью!!!
7 ответов
Это должно быть очень просто, если Календарь 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, хотя могут быть некоторые проблемы, связанные с кэшированием, кодированием текста и так далее. Но вы можете начать экспериментировать с этим простым кодом.
Примечание личного опыта в дополнение как к ответу Стефана Герига, так и к ответу Дейва Ниона (и к ответу мммшаддупа):
У меня были проблемы с проверкой при использовании \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 правильными.
Существует отличный пакет 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
http://www.kanzaki.com/docs/ical/ имеет чуть более читаемую версию старой спецификации. Это помогает в качестве отправной точки - многие вещи остаются прежними.
Также на моем сайте у меня есть
- Некоторые списки полезных ресурсов (см. Боковую панель внизу справа) на
- Техническая спецификация RFC 5545
- Ресурсы для тестирования
- Некоторые заметки, записанные во время моего путешествия с
.ics
За последние несколько лет. В частности, вам может пригодиться этот чит-лист повторяющихся событий.
.ics
области, которые требуют осторожного обращения:
- события на весь день
- типы дат (часовой пояс, UTC или местное "плавающее") - чтобы понять разницу
- совместимость правил повторения
- Точный формат: http://www.ietf.org/rfc/rfc2445.txt
- Согласно спецификации, он должен заканчиваться на.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";