Cualquier búsqueda en Google con PHP ical sólo trae phpicalendar y cómo analizar o leer EN los archivos ical. Sólo quiero escribir un archivo PHP que tira acontecimientos de mi base de datos y los escribe en el formato ical.

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

  1. ¿Cuál es la exacta formato ical, incluyendo los encabezados de archivo, formato de archivo, pies de página, etc.? En otras palabras, lo que hace el archivo tiene que tener, exactamente, con el fin de ser correctamente leído en Google Calendar, etc.?
  2. Si voy a construir este archivo usando una .extensión de php, ¿cómo puedo publicar como ical? ¿Tengo que escribir una nueva .archivo ics? O Google Calendar, etc. leer una .archivo php como ical tan largo como el contenido están en el formato correcto? (Como en el style.css.php archivo será leído como un archivo CSS, si los contenidos son en realidad, CSS, etc).

Cualquier ayuda que se le puede dar o punto de que me será muy apreciada!!!

InformationsquelleAutor rhodesjason | 2009-09-23

7 Comentarios

  1. 122

    Esto debe ser muy simple, si el Calendario de Google no requiere la *.ics-extensión (lo cual se requiere de la 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 básicamente todo lo que necesita para hacer que un cliente piensa que usted está sirviendo a un archivo iCalendar, aunque puede haber algunos problemas con respecto a la caché, la codificación de texto y así sucesivamente. Pero usted puede empezar a experimentar con este simple código.

    • Gracias. Creo que los encabezados es lo que me faltaba. Supongo que hay un par de pasos finales en la fabricación de este Calendario de Google listo, como cuando yo trate de darle a este archivo a Google Calendar a través de la URL, que dice «Importar calendario de url…» pero se cuelga en que para siempre. Tal vez esa es una cuestión diferente a publicar?
    • ¿Has probado a acceder al script desde el navegador? No se le pedirá que descargue «caneldar.ics»? Se puede importar el archivo en iCal o Outlook, por ejemplo?
    • Sí funciona bien allí, y su Séquito, lo carga bien así. Solo me falta la capacidad para crear un archivo de Calendario de Google (GC) de ping y otra para actualizar, por lo que se mantiene hasta la fecha con un calendario de eventos en mi base de datos. Ahora, GC no la aceptará.
    • Puede importar este archivo en GC (mediante la importación opción de calendario)?
    • Eso no ayuda porque necesita estar suscrito a la URL para que se actualice regularmente. Sin EMBARGO, después de una larga espera, yo actualice y el calendario había sido añadido a la GC. Buena noticia que hay. Sin embargo, la adición de otro VEVENT a el .php archivo y guardarlo en el servidor, todavía no apareció en la GC. He leído que el GC actualiza sus suscripciones alrededor de una vez cada 3 horas, así que voy a comprobar de nuevo en 3 horas y ver si se actualiza a continuación.
    • Agradable de escuchar… Una cosa que obviamente se requiere es un campo id de usuario dentro de la VEVENT que contiene un identificador único.
    • Ok, no funciona. Pero no estoy seguro de lo que quieres decir con UID. Sólo añadir UID:xxx en cada VEVENT bloque donde xxx=un número de identificación único?
    • Exactamente. He actualizado el ejemplo anterior – y también he añadido un DTSTAMP de la propiedad que va a decirle a un cliente cuando los eventos se ha actualizado.
    • Bien Gehrig, eres un genio. Que trabajado. Gracias. (Tan lejos como puedo decirle a Google Calendar se actualiza casi de inmediato, también.)
    • Si no me equivoco. Los programas utilizan el UID para ver si un evento es eliminado. Si un php-script siempre genera otro UID (->mt_rand), los programas siempre piensa todo el contenido ha cambiado. Todo se desvaneció y todo es nuevo. Personalmente yo me quedaría con el mismo UID si el evento es el mismo en la base de datos y usar sólo el recordID (y algo de información de host). El DTSTAMP está ahí para mostrar que algo ha cambiado. Eso debería ser suficiente.
    • El calendario de Google NO requiere de la *.ics-extensión. Si usted está utilizando .htaccess, usted puede hacer esto mediante la adición de RewriteEngine on RewriteRule ^calendar.ics$ my_php_script.php [QSA]

  2. 16

    Una nota de la experiencia personal en adición a las dos Stefan Gehrig respuesta y Dave Ninguno de respuesta (y mmmshuddup la respuesta):

    Yo estaba teniendo problemas de validación utilizando tanto \n y PHP_EOL cuando he utilizado el ICS validador en http://severinghaus.org/projects/icv/

    Aprendí que tenía que usar \r\n en el fin de conseguir que validar 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;

    Que dejó de mis errores de análisis y de hecho mis archivos ICS validar correctamente.

    • La información de encabezado es la parte importante para su INFORMACIÓN a cualquier persona que esté buscando en el futuro. La mayor parte de la mayoría de las aplicaciones y programas que no se preocupe acerca de la nueva Línea se rompe. Sólo los validadores de hacer de lo que parece. Pero la más importante es la parte de encabezado. Hemos intentado por un tiempo sin ella y estaban teniendo muchos problemas.
    • ¿Qué es escapeString para? Supuse que debe escapar de una cosa o dos, pero parece que utilizan htmlspecialchars para ese lugar.
    • Una rápida revisión: fecha(‘Ymd\Este\Z’, $fecha). Debe ser una H en lugar de g.
  3. 5

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

    Aquí hay un ejemplo de uso de google 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();
  4. 4

    http://www.kanzaki.com/docs/ical/ un poco más legible versión de los mayores especificaciones. Ayuda como punto de partida -, muchas cosas siguen siendo las mismas.

    También en mi sitio, he

    1. Una lista de recursos útiles (ver recuadro abajo a la derecha) en
      • ical Especificación RFC 5545
      • ical Pruebas de Recursos
    2. Algunas notas grabado en mi viaje de trabajo con .ics en los últimos años. En particular, usted puede encontrar esta la repetición de los eventos de ‘cheatsheet’ a ser útil.

    .ics áreas que necesitan un manejo cuidadoso:

    • ‘todo el día’ eventos
    • tipos de fechas (zona horaria UTC o local ‘flotante’) – nb comprender la distinción
    • la interoperabilidad de las reglas de periodicidad
  5. 2
    1. Exacta formato ical: http://www.ietf.org/rfc/rfc2445.txt
    2. De acuerdo a la especificación, se tiene que terminar en .ics

    Edit: en realidad no estoy seguro de la línea de 6186 da un ejemplo .ics formato de nomenclatura, sino que también indica que usted puede utilizar los parámetros de la url. Creo que no importa, siempre y cuando el tipo MIME correcto.

    Edición: Ejemplo de la 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 de MIME se configura en el servidor.

    • He tratado de leer que la especificación muchas veces pero no puedo hacer cara o cruz de tan lejos de lo que el archivo ical se verá. Se puede al menos que me señale algunas de las líneas donde se empieza a hablar de lo que el .ics archivo debe contener, en la medida de cabecera, donde poner el tipo MIME, etc?
    • Seguro, ver arriba.
  6. 2

    Asegúrese de que el formato de la cadena como esta o no de trabajo

     $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";
    • es mejor usar PHP_EOL en lugar de "\n".
    • PHP_EOL es el ambiente específicas para la final de las líneas, por lo que en windows es la salida \r\n así que tenlo en cuenta!

Dejar respuesta

Please enter your comment!
Please enter your name here