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


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

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

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

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

7 98

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/ имеет немного более читаемую версию старой спецификации. Это помогает в качестве отправной точки - многие вещи остаются неизменными.

на мой сайт, Я

  1. некоторые списки полезных ресурсов (см. боковую панель внизу справа) на
    • ical Spec RFC 5545
    • ical тестирование ресурсов
  2. заметки записано в моем путешествии работа с .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

  1. точный формат ical:http://www.ietf.org/rfc/rfc2445.txt
  2. согласно спецификации, он должен закончиться .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";