2009-09-29 8 views
7

Ich baute eine Website in PHP 5 und MySQL mit einer Tabelle, die geplante Fotoshootings verfolgt. Ich möchte einen Feed dieser geplanten "Ereignisse" in eine ical-Datei ausgeben.Dynamic ical erstellt von Datenbank funktioniert nicht

Ich ursprünglich asked this question und bekam eine gute Antwort von S. Gehrig. Ich habe eine Beispieldatei erhalten, die regelmäßig funktioniert, und regelmäßig in Google Kalender aktualisiert, wenn ich die Datei in Dreamweaver manuell angepasst habe. Jetzt, da ich dynamisches PHP hinzugefügt habe, das aus der Datenbank zieht, wird es nicht funktionieren.

Hier ist der 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; 

?> 

Die Ausgabe dieser Datei ist genau das gleiche wie das Handbuch, hartcodierte Version, die ich arbeiten, soweit ich das beurteilen kann. Kann jemand sehen, warum das nicht funktioniert ????

PS Hier ist der Code der Datei, die funktioniert - ich habe es gerade auf meinem Server veröffentlicht und per URL in Google Kalender abonniert. Als ich in der zweiten Veranstaltung fest codierte, tauchte sie in Google Calendar auf.

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

?> 

HILFE!

Ein Kommentator vorgeschlagen, ich testen, indem Sie die Header entfernen und die $ ical var widerspiegeln. Hier sind die Ergebnisse dieses Tests, mit Zeilenumbrüchen für Ihre Bequemlichkeit hinzugefügt:

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 

Vielen Dank!

+0

In Google Kalender erhalte ich eine Fehlermeldung mit dem Titel "Einstellungsfehler" und dem Text: "Wir konnten den Kalender nicht nach der angeforderten URL analysieren." – rhodesjason

+0

Entourage wird es überhaupt nicht öffnen, und iCal sagt: "Diese Kalenderdatei ist nicht lesbar. Dem iCal-Kalender wurden keine Ereignisse hinzugefügt." – rhodesjason

Antwort

1

Dank Mohammad Hilfe, leiten wir ab, dass es der gegliederten Code war auf die ics-Datei hinzufügen Leerzeichen, die die Fehler verursacht wurde. Der Vorschlag von M, \ n linebreaks zu verwenden, funktionierte nicht, aber das manuelle Drücken von enter, um Zeilenumbrüche zu erstellen, aber ohne die nächste Zeile einzurücken, scheint es getan zu haben. Hier ist der Code, das funktioniert:

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

Erste Rate wäre Ihr Array ist nicht korrekt ausgefüllt. Um es zu testen, würde ich mit dem Entfernen beginnen:

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

und ändern $ slots = Slot :: find_all(); zu

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

zu Ihrem Array von Objekt stellen Sie sicher, gesetzt wird.

Dann führen Sie es von der Befehlszeile oder vom Browser aus, um sicherzustellen, dass es wie erwartet ausgegeben wird, bevor es an Google gesendet wird.

Versuchen Sie den folgenden Code ein Leerraum zu vermeiden:

<?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, danke. Ich habe die Header tatsächlich entfernt und habe sie einfach ausgeführt, um zu sehen, was ausgegeben wird. Es war genauso wie der hartcodierte Test, nur mit verschiedenen Daten und Zusammenfassungen. ?? – rhodesjason

+0

Ich werde die Ausgabe dieses Tests an das Ende der obigen Frage hinzufügen ... – rhodesjason

+0

In Ordnung, es sieht komisch aus, also begann ich Ihre Ausgabe mit einem ics-Validator zu testen: http://severinghaus.org/projects/icv/ und scheint wie weißer Raum am Ende jedes Knotens es verursacht! (in Ihrer Schleife, aus Gründen der Formatierung haben Sie Ihren Code eingerückt, der in offenen Strings Leerzeichen erzeugt) UID: ". $ slot-> id." @ homewoodphoto.jhu.edu DTSTAMP: ". gmdate (' YMD ').' T '. Gmdate (' Sein '). "Z DTSTART:". $ Dtstart. " DTEND:". $ Dtend. " ZUSAMMENFASSUNG:". $ Summary. " ENDE: VEVENT"; Ich werde die ursprüngliche Antwort mit dem richtigen Code aktualisieren .. – Mohammad

20

Für Menschen, die über eine Suche auf diese stolpern es nicht klar sein könnte, wie das Problem gelöst wurde. Im Grunde benötigt die iCal-Spezifikation \ r \ n für Zeilenumbrüche und keine Leerzeichen am Zeilenanfang, was im Skript behoben wurde, damit es funktioniert.

Wenn mit ische Arbeit habe ich die folgenden 3 Validatoren fanden die meisten hilfreich sein:

grundlegendsten (verfehlt Leerzeichen): http://severinghaus.org/projects/icv/?url=

dieses Leerzeichen fangen: http://icalvalid.cloudapp.net/Default.aspx

dieses man wird Dinge fangen die anderen nicht, aber ist fast zu streng: http://arnout.engelen.eu/icalendar-validator

Auch die beste Dokumentation zu allen verschiedenen Elementen: http://www.kanzaki.com/docs/ical/