protocol php calendar icalendar

protocol - icalendar php



¿Cómo puedo usar PHP para publicar dinámicamente un archivo ical para que lo lea Google Calendar? (7)

  1. Formato exacto: http://www.ietf.org/rfc/rfc2445.txt
  2. De acuerdo con la especificación, tiene que terminar en .ics

Editar: en realidad no estoy seguro - la línea 6186 da un ejemplo en el formato de nombres de .ics, pero también establece que puede usar parámetros de url. No creo que importe, siempre y cuando el tipo MIME sea correcto.

Editar: Ejemplo de 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

El tipo MIME está configurado en el servidor.

Cualquier búsqueda de Google en PHP ical solo trae a colación phpicalendar y cómo analizar o leer archivos IN ical. Solo quiero escribir un archivo PHP que extraiga eventos de mi base de datos y los escriba en formato ical.

Mi problema es que no puedo encontrar ningún lugar que responda dos preguntas:

  1. ¿Cuál es el formato exacto , incluidos los encabezados, el formato de archivo, los pies de página, etc.? En otras palabras, ¿qué tiene que tener exactamente el archivo para que Google Calendar lo lea correctamente, etc.?
  2. Si construyo este archivo usando una extensión .php, ¿cómo lo publico como ical? ¿Tengo que escribir en un nuevo archivo .ics? ¿O Google Calendar etc. leerá un archivo .php como ical siempre que los contenidos estén en el formato correcto? (Al igual que un archivo style.css.php se leerá como un archivo CSS si los contenidos son en realidad CSS, etc.)

¡Cualquier ayuda que todos puedan darme o señalarme será muy apreciada!


Asegúrate de formatear la cadena así o no funcionará

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


Existe un excelente paquete eluceo/ical que le permite crear fácilmente archivos ics.

Aquí hay un ejemplo de uso de documentos:

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



Una nota de experiencia personal además de la respuesta de Stefan Gehrig y la respuesta de Dave None (y la respuesta de mmmshuddup):

Estaba teniendo problemas de validación usando / n y PHP_EOL cuando utilicé el validador de ICS en http://severinghaus.org/projects/icv/

Aprendí que tenía que usar / r / n para que valide correctamente, así que esta fue mi solució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;

Eso detuvo mis errores de análisis e hizo que mis archivos ICS se validaran correctamente.


http://www.kanzaki.com/docs/ical/ tiene una versión un poco más legible de la especificación anterior. Ayuda como punto de partida: muchas cosas siguen siendo las mismas.

También en mi sitio , tengo

  1. Algunas listas de recursos útiles (consulte la barra lateral inferior derecha) en
    • ical Spec RFC 5545
    • Recursos de prueba ical
  2. Algunas notas registradas en mi viaje trabajando con .ics en los últimos años. En particular, puede encontrar útil esta repetición de eventos ''hoja de trucos'' .

áreas .ics que necesitan un manejo cuidadoso:

  • eventos de "todo el día"
  • tipos de fechas (zona horaria, UTC o ''flotante'' local) - nb para entender la distinción
  • interoperabilidad de las reglas de recurrencia

Esto debería ser muy simple si Google Calendar no requiere *.ics -extension (que requerirá alguna reescritura de URL en el servidor).

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

Básicamente, es todo lo que necesita para que un cliente piense que está publicando un archivo iCalendar, aunque puede haber algunos problemas relacionados con el almacenamiento en caché, la codificación de texto, etc. Pero puedes comenzar a experimentar con este código simple.