2009-09-29 3 views
7

J'ai construit un site en PHP 5 et MySQL avec une table qui garde la trace des séances de photos prévues. Je veux pousser un flux de ces "événements" programmés dans un fichier ical. J'ai d'abord asked this question et j'ai obtenu une bonne réponse de S. Gehrig. J'ai un exemple de fichier ical qui fonctionne et qui se met régulièrement à jour dans Google Agenda chaque fois que j'ai ajusté manuellement le fichier dans Dreamweaver. Cependant, maintenant que j'ai ajouté PHP tirant de la base de données, cela ne fonctionnera pas.Dynamique ical créé à partir de la base de données ne fonctionne pas

Voici le 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 sortie de ce fichier est exactement le même que le manuel, la version codée en dur que je travaille, pour autant que je peux dire. Quelqu'un peut-il voir pourquoi cela ne fonctionne pas ????

PS Voici le code du fichier qui fonctionne - Je l'ai juste posté sur mon serveur et je suis abonné via l'URL dans Google Agenda. Lorsque j'ai codé en dur dans le deuxième événement, il est apparu sous peu dans Google Agenda.

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

?> 

AIDE!

Un commentateur m'a suggéré de tester en supprimant les en-têtes et en faisant écho à la variable $ ical. Voici les résultats de ce test, avec des sauts de ligne ajoutés pour votre commodité:

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 

Merci!

+0

Dans Google Agenda, j'obtiens une erreur avec un titre de "Paramètres d'erreur" et du texte: "Nous n'avons pas pu analyser le calendrier à l'URL demandée." – rhodesjason

+0

Entourage ne l'ouvrira pas du tout, et iCal dit, "Ce fichier de calendrier est illisible Aucun événement n'a été ajouté à votre calendrier iCal." – rhodesjason

Répondre

1

Merci à l'aide de Mohammad, nous en avons déduit qu'il était le code indenté en ajoutant des espaces au fichier ics qui a été à l'origine des erreurs. La suggestion de M d'utiliser \ n linebreaks ne fonctionnait pas, mais en tapant enter pour créer des sauts de ligne manuellement, mais sans indenter la ligne suivante, semble l'avoir fait. Voici le code qui fonctionne:

<?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

Initialement deviner serait votre tableau n'est pas rempli correctement. Donc, pour le tester, je voudrais commencer par enlever

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

et changer slots $ = Emplacement :: find_all(); à

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

pour vous assurer que votre tableau d'objet est défini. Ensuite, exécutez-le à partir de la ligne de commande ou du navigateur pour vous assurer qu'il sort comme prévu avant de soumettre à google.

Essayez le code suivant pour éviter l'espace blanc:

<?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, merci. J'ai en fait enlevé les en-têtes et je l'ai juste lancé pour faire écho à $ ical pour voir ce qui était en train de sortir. C'était exactement le même que le test codé en dur, juste avec des dates et des résumés différents. ?? – rhodesjason

+0

Je vais ajouter la sortie de ce test à la fin de la question ci-dessus ... – rhodesjason

+0

D'accord, cela semble étrange, j'ai donc commencé à tester votre sortie avec un validateur ics: http://severinghaus.org/projects/icv/ et il semble que l'espace blanc à la fin de chaque nœud en soit la cause! (dans votre boucle, pour des raisons de formatage, vous avez indenté votre code qui, dans les chaînes ouvertes, crée un espace blanc) UID: ". $ slot-> id." @ homewoodphoto.jhu.edu DTSTAMP: ".gmdate (' Ymd ').' T '.gmdate (' His '). "Z DTSTART:". $ Dtstart. " DTEND:". $ Dtend. " SOMMAIRE:". $ Summary. " END: VEVENT"; Je vais mettre à jour la réponse originale avec le code correct – Mohammad

20

Pour les personnes qui tombent par hasard sur ce via une recherche, il pourrait ne pas être clair comment le problème a été résolu. Fondamentalement, la spécification iCal nécessite \ r \ n pour les sauts de ligne et pas d'espace au début des lignes, ce qui est ce qui a été corrigé dans le script pour le faire fonctionner.

Lorsque vous travaillez avec ical que j'ai trouvé les 3 validateurs les plus utiles suivantes:

le plus élémentaire (manque des espaces): http://severinghaus.org/projects/icv/?url=

ce qu'attrapera les espaces: http://icalvalid.cloudapp.net/Default.aspx

cette on va attraper des choses que les autres n'ont pas, mais est presque trop stricte: http://arnout.engelen.eu/icalendar-validator

Aussi, la meilleure documentation sur tous les différents éléments: http://www.kanzaki.com/docs/ical/

Questions connexes