2009-09-29 9 views
7

Creé un sitio en PHP 5 y MySQL con una tabla que realiza un seguimiento de las sesiones fotográficas programadas. Quiero enviar un feed de esos "eventos" programados a un archivo ical.Dynamic ical creado a partir de una base de datos que no funciona

Originalmente asked this question y obtuve una buena respuesta de S. Gehrig. Obtuve un archivo de muestra funcionando y actualicé regularmente en Google Calendar cada vez que ajusté el archivo manualmente en Dreamweaver. Sin embargo, ahora que he agregado el PHP dinámico extrayendo de la base de datos, no funcionará.

Aquí está el PHP:

<?php 
require_once('../../_includes/initialize.php'); 

$ical = " BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN "; 

$slots = Slot::find_all(); 
foreach($slots as $slot) { 
    $job = Job::find_by_id($slot->job_id); 

    $start_stamp = strtotime($slot->start); 
    $end_stamp = strtotime($slot->endtime); 
    $dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time 
    $dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time 

    $summary = $job->title; 

    $ical .= " BEGIN:VEVENT 
    UID:" . $slot->id . "@homewoodphoto.jhu.edu 
    DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z 
    DTSTART:" . $dtstart . " 
    DTEND:" . $dtend . " 
    SUMMARY:" . $summary . " 
    END:VEVENT "; 
} 

$ical .= " END:VCALENDAR"; 

//set correct content-type-header 
header('Content-type: text/calendar; charset=utf-8'); 
header('Content-Disposition: inline; filename=homewoodphoto_master.ics'); 
echo $ical; 
exit; 

?> 

La salida de este archivo es exactamente el mismo que el manual, la versión modificable que he de trabajar, por lo que yo puedo decir. ¿Alguien puede ver por qué esto no está funcionando?

PD Aquí está el código del archivo que está funcionando - Acabo de publicarlo en mi servidor y suscrito a través de la URL en Google Calendar. Cuando codifiqué en el segundo evento, apareció brevemente en Google Calendar por sí mismo.

<?php 

$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:20090925T170000Z 
DTEND:20090928T035959Z 
SUMMARY:Bastille Day Party 
END:VEVENT 

BEGIN:VEVENT 
UID:" . md5(uniqid(mt_rand(), true)); . "@yourhost.test 
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z 
DTSTART:20090929T170000Z 
DTEND:20090930T035959Z 
SUMMARY:Camping Trip 
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; 

?> 

HELP!

Un comentarista sugirió que realice una prueba quitando los encabezados y haciendo eco de la varilla $ ical. Aquí están los resultados de esa prueba, con saltos de línea agregados para su conveniencia:

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
BEGIN:VEVENT 
UID:[email protected] 
DTSTAMP:20090929T212141Z 
DTSTART:20091001T230000Z 
DTEND:20091001T230000Z 
SUMMARY:little title 
END:VEVENT 
BEGIN:VEVENT 
UID:[email protected] 
DTSTAMP:20090929T212141Z 
DTSTART:20090926T230000Z 
DTEND:20090927T010000Z 
SUMMARY:A big photo shoot 
END:VEVENT 
BEGIN:VEVENT 
UID:[email protected] 
DTSTAMP:20090929T212141Z 
DTSTART:20091003T230000Z 
DTEND:20091004T010000Z 
SUMMARY:A big photo shoot 
END:VEVENT 
END:VCALENDAR 

¡Gracias!

+0

En Google Calendar, aparece un error con el título "Error de configuración" y texto: "No pudimos analizar el calendario en la url solicitada". – rhodesjason

+0

Entourage no lo abrirá en absoluto e iCal dice: "Este archivo de calendario no se puede leer. No se han agregado eventos a su calendario de iCal". – rhodesjason

Respuesta

1

Gracias a la ayuda de Mohammad, que dedujeron que se trataba del código sangrado añadir espacios en blanco al archivo ics que estaba causando los errores. La sugerencia de M de utilizar \ n los saltos de línea no funcionó, pero presionar enter para crear saltos de línea, pero sin sangrar la siguiente línea, parece haberlo hecho. Aquí está el código que funciona:

<?php 
require_once('../../_includes/initialize.php'); 

$ical = "BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN 
"; 

$slots = Slot::find_all(); 
foreach($slots as $slot) { 
$job = Job::find_by_id($slot->job_id); 

$start_stamp = strtotime($slot->start); 
$end_stamp = strtotime($slot->endtime); 
$dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time 
$dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time 

$summary = $job->title; 

$ical .= "BEGIN:VEVENT 
UID:" . $slot->id . "@homewoodphoto.jhu.edu 
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z 
DTSTART:" . $dtstart . " 
DTEND:" . $dtend . " 
SUMMARY:" . $summary . " 
END:VEVENT 
"; 
} 

$ical .= "END:VCALENDAR"; 

//set correct content-type-header 
header('Content-type: text/calendar; charset=utf-8'); 
header('Content-Disposition: inline; filename=homewoodphoto_master.ics'); 
echo $ical; 
exit; 
?> 
2

La conjetura inicial sería que su matriz no está llena correctamente. Para probarlo, comenzaría con la eliminación de

//set correct content-type-header 
header('Content-type: text/calendar; charset=utf-8'); 
header('Content-Disposition: inline; filename=homewoodphoto_master.ics'); 

y cambiando $ slots = Slot :: find_all(); a

$slots = Slot::find_all(); 
print_r($slots); 

para asegurarse de que se está configurando la matriz de objetos.

A continuación, ejecútelo desde la línea de comandos o el navegador para asegurarse de que se genera como se esperaba antes de enviarlo a google.

Prueba el siguiente código para evitar espacios en blanco:

<?php 
require_once('../../_includes/initialize.php'); 

$ical = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//hacksw/handcal//NONSGML v1.0//EN"; 

$slots = Slot::find_all(); 
foreach($slots as $slot) { 
    $job = Job::find_by_id($slot->job_id); 

    $start_stamp = strtotime($slot->start); 
    $end_stamp = strtotime($slot->endtime); 
    $dtstart = gmdate('Ymd', $start_stamp).'T'. gmdate('His', $start_stamp) . "Z"; // converts to UTC time 
    $dtend = gmdate('Ymd', $end_stamp).'T'. gmdate('His', $end_stamp) . "Z"; // converts to UTC time 

    $summary = $job->title; 

    $ical .= "BEGIN:VEVENT\n"; 
    $ical .= "UID:" . $slot->id . "@homewoodphoto.jhu.edu\n"; 
    $ical .= "DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z\n"; 
    $ical .= "DTSTART:" . $dtstart . "\n"; 
    $ical .= "DTEND:" . $dtend . "\n"; 
    $ical .= "SUMMARY:" . $summary . "\n"; 
    $ical .= "END:VEVENT\n"; 
} 

$ical .= "\nEND:VCALENDAR"; 

//set correct content-type-header 
header('Content-type: text/calendar; charset=utf-8'); 
header('Content-Disposition: inline; filename=homewoodphoto_master.ics'); 
echo $ical; 
exit; 

?> 
+0

Mohammad, gracias. De hecho, eliminé los encabezados y simplemente lo ejecuté para que echo $ ical para ver lo que se estaba emitiendo. Era exactamente lo mismo que la prueba codificada, solo con diferentes fechas y resúmenes. ?? – rhodesjason

+0

Añadiré el resultado de esa prueba al final de la pregunta anterior ... – rhodesjason

+0

Bien, parece extraño, así que comencé a probar su salida con un validador ics: http://severinghaus.org/projects/icv/ y parece que está causando espacio en blanco al final de cada nodo. (en su ciclo, por razones de formato, ha sangrado su código que en cadenas abiertas, crea espacios en blanco) UID: ". $ slot-> id." @ homewoodphoto.jhu.edu DTSTAMP: ".gmdate (' Ymd ').' T '. Gmdate (' His '). "Z DTSTART:". $ Dtstart. " TENDENCIA:". $ Dtend. " RESUMEN:". $ Summary. " END: VEVENT"; Actualizaré la respuesta original con el código correcto – Mohammad

20

Para las personas que tropiezan en este a través de una búsqueda que podría no estar claro cómo se resolvió el problema. Básicamente, la especificación iCal requiere \ r \ n para los saltos de línea y no espacios en blanco al comienzo de las líneas, que es lo que se solucionó en el script para que funcione.

Cuando se trabaja con iCal que he encontrado los siguientes 3 validadores a ser los más útiles:

más básico (no encuentra espacio en blanco): http://severinghaus.org/projects/icv/?url=

éste cogerá los espacios en blanco: http://icalvalid.cloudapp.net/Default.aspx

este uno atrapará cosas que otros no, pero es casi demasiado estricto: http://arnout.engelen.eu/icalendar-validator

Además, la mejor documentación sobre todos los elementos: http://www.kanzaki.com/docs/ical/

Cuestiones relacionadas