2009-09-23 27 views
96

Cualquier búsqueda de Google en PHP ical simplemente 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.¿Cómo puedo usar PHP para publicar dinámicamente un archivo ical para que lo lea Google Calendar?

Mi problema es que no puedo encontrar en cualquier lugar que va a responder a dos preguntas:

  1. Cuál es la exacta formato iCal, incluyendo encabezados, pies de página, formato de archivo, 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 el contenido es en realidad CSS, etc.)

Cualquier ayuda que todos me puedan dar o señalar será muy apreciada!

Respuesta

117

Esto debería ser muy simple si Google Calendar no requiere el *.ics -extensión (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; 

Eso es prácticamente todo lo que necesita hacer a un cliente piensa que usted está sirviendo un archivo iCalendar, a pesar de que puede haber algunas cuestiones relativas a la memoria caché, la codificación de texto y así sucesivamente. Pero puedes comenzar a experimentar con este código simple.

+1

Gracias. Creo que esos encabezados es lo que me estaba perdiendo. Supongo que hay unos pocos pasos finales para preparar este Calendario de Google, ya que cuando intento alimentar este archivo a Google Calendar a través de una URL, dice "Importar calendario desde la URL ..." pero se queda para siempre. ¿Quizás esa es una pregunta diferente para publicar? – rhodesjason

+0

¿Ha intentado acceder al script desde su navegador? ¿Te pide que descargues "caneldar.ics"? ¿Se puede importar el archivo en iCal o Outlook, por ejemplo? –

+0

Sí, funciona bien allí, y Entourage lo carga bien también. Solo necesito la capacidad de crear un archivo que Google Calendar (GC) haga ping una y otra vez para actualizar, para que se mantenga actualizado con un calendario de eventos en mi base de datos. En este momento, GC no lo aceptará. – rhodesjason

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

Editar: en realidad no estoy seguro - línea 6186 da un ejemplo en .ics nombrar formato, pero también indica 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 

tipo MIME está configurada en el servidor.

+0

He tratado de leer esa especificación muchas veces, pero no puedo hacer cara o cruz de la misma en cuanto a lo que el archivo iCal se verá así. ¿Puede al menos indicarme algunas líneas en las que comienza a hablar realmente sobre qué debe contener el archivo .ics en lo que respecta al encabezado, dónde colocar el tipo MIME, etc.? – rhodesjason

+1

Claro, mira arriba. – lod3n

4

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

También en my site, tengo

  1. Algunas listas de recursos útiles (véase la parte inferior de la barra lateral derecha) en
    • ical RFC Spec 5545
    • Recursos ical Prueba
  2. Some notes registrado en mi viaje trabajando con .ics en los últimos años. En particular, puede encontrar que este repeating events 'cheatsheet' es útil.

.ics áreas que requieren un manejo cuidadoso:

  • 'todo el día' eventos
  • tipos de dátiles (zona horaria, GMT o local 'flotante') - nb entender distinción
  • interoperabilidad de reglas de recurrencia
2

Asegúrese de formatear la cadena de esta manera 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"; 
+1

es mejor usar' PHP_EOL' en lugar de '" \ n "'. –

+3

PHP_EOL es un entorno específico para las líneas finales, por lo que en Windows producirá '\ r \ n' así que tenlo en cuenta. – Chris

15

Una nota de la experiencia personal, además de ambas respuestas y Dave Ninguno de respuesta de Stefan Gehrig (y la respuesta de mmmshuddup):

que estaba teniendo problemas de validación utilizando tanto \ ny PHP_EOL cuando utilicé el validador de ICS en http://severinghaus.org/projects/icv/

supe que tenía que usar \ r \ n con el fin de conseguir que se valida correctamente, por lo que este 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; 

que dejaron de mis errores de análisis y m ade mis archivos ICS validan correctamente.

+0

La información del encabezado es la parte importante para cualquier persona que lea en el futuro. En su mayor parte, la mayoría de las aplicaciones y programas no se preocupan por los saltos de NewLine. Solo los validadores lo hacen parece. Pero lo más importante es la parte del encabezado. Intentamos por un tiempo sin eso y tuvimos muchos problemas. – jfreak53

+1

¿Para qué sirve escapeString? Supuse que debería escapar una o dos cosas, pero en su lugar pareces usar 'htmlspecialchars' para eso. – Luc

+0

Una solución rápida: date ('Ymd \ THis \ Z', $ timestamp). Debería ser una H en lugar de g. –

4

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

Aquí es 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(); 
Cuestiones relacionadas