2015-10-19 8 views
10

Ich habe Kalenderdatei (.ics) Ausgabe von meiner Anwendung zum Zweck der Verwendung in einer Kalender-App wie Google Kalender erstellt. Ich habe die unten stehende Datei über einen Validator laufen lassen, aber es scheint, dass weder Google noch Yahoo Calendars Ball spielen wollen. Mein lokaler Mac-Kalender-Client funktioniert 100%. Kann jemand etwas Offensichtliches über die Datei unten sehen, die möglicherweise in Google Kalender erstickt? Oder irgendwelche zusätzlichen Felder, die sie brauchen? Ich bekomme auch einen 500-Fehler vom Yahoo-Kalender zurück. An diesem Punkt Haare ausreißen.iCal-Format für Google Kalender/Yahoo Kalender funktioniert nicht

Ich habe mit und ohne Zeitzone Informationen versucht, und es scheint nicht viel Unterschied zu machen.

Kopf Ausgabe

 header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
     header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
     header('Cache-Control: no-store, no-cache, must-revalidate'); 
     header('Cache-Control: post-check=0, pre-check=0', false); 
     header('Pragma: no-cache'); 
     header('Content-type: text/calendar;'); 
     header('Content-Disposition: inline; filename="calendar.ics"'); 
     header("Content-Description: File Transfer"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: " . strlen($generated)); 

UTC mal oder TZID Ich habe experimentiert mit und scheint keinen Unterschied zu machen. Wenn jemand ein wirklich einfaches Beispiel für eine URL von .ics-Ereignissen hat, die "Cross-Kalender" zu funktionieren scheint, würde ich es gerne sehen. Alternativ, wenn jemand für diesen Zweck einige anständige Bibliotheken zur Verfügung stellen kann, die kein Problem sind, in ein CakePHP-Projekt zu integrieren, würde das ausreichen.

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//MS//NONSGML//EN 
X-WR-CALNAME:Holidays 
CALSCALE:GREGORIAN 
METHOD:PUBLISH 
BEGIN:VEVENT 
UID:1075 
DTSTART;TZID=Europe/London:20150114T080000 
DTEND;TZID=Europe/London:20150114T170000 
DTSTAMP:20150114T080000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Stat Holiday (1.0 days) 
LAST-MODIFIED:20150114T080000Z 
LOCATION: 
SUMMARY: Statutory Day 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
BEGIN:VEVENT 
UID:1076 
DTSTART;TZID=Europe/London:20150116T080000 
DTEND;TZID=Europe/London:20150116T170000 
DTSTAMP:20150116T080000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Stat Holiday (1.0 days) 
LAST-MODIFIED:20150116T080000Z 
LOCATION: 
SUMMARY: Statutory Day 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
BEGIN:VEVENT 
UID:1079 
DTSTART;TZID=Europe/London:20151020T123000 
DTEND;TZID=Europe/London:20151020T170000 
DTSTAMP:20151020T123000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Holiday Request (3.0 days) test 
LAST-MODIFIED:20151020T123000Z 
LOCATION: 
SUMMARY:admin Leave 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
BEGIN:VEVENT 
UID:1080 
DTSTART;TZID=Europe/London:20151021T080000 
DTEND;TZID=Europe/London:20151021T123000 
DTSTAMP:20151021T080000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Holiday (3.0 days) test 
LAST-MODIFIED:20151021T080000Z 
LOCATION: 
SUMMARY:admin Leave 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
BEGIN:VEVENT 
UID:1081 
DTSTART;TZID=Europe/London:20151022T080000 
DTEND;TZID=Europe/London:20151022T170000 
DTSTAMP:20151022T080000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Holiday Request (3.0 days) test 
LAST-MODIFIED:20151022T080000Z 
LOCATION: 
SUMMARY:admin Leave 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
BEGIN:VEVENT 
UID:1082 
DTSTART;TZID=Europe/London:20151023T080000 
DTEND;TZID=Europe/London:20151023T170000 
DTSTAMP:20151023T080000Z 
CREATED:20151019T211433Z 
DESCRIPTION:Holiday Request (3.0 days) test 
LAST-MODIFIED:20151023T080000Z 
LOCATION: 
SUMMARY:admin Leave 
SEQUENCE:0 
STATUS:CONFIRMED 
TRANSP:OPAQUE 
END:VEVENT 
END:VCALENDAR 
+1

Wie ausgeben Sie die ics-Datei von PHP über Echo dosn't? Ich kann Ihren Kalender direkt in Google Kalender importieren, damit die Datei in Ordnung ist. –

+0

Ich weiß nicht, _how_ Sie versuchen, dies zu laden, aber nur die HTTP-Header und die .ics-Datei, die Sie zur Verfügung gestellt haben, konnte ich [_Add mit einem Link_] (https://support.google.com/) Kalender/Antwort/37100? hl = en) ohne Probleme. – HPierce

Antwort

4

eine Kombination von Antworten unter Verwendung von SO (Google Calendar errors on importing .ics file) und einige Quellcode von https://gist.github.com/jakebellacera/635416

Mein Arbeits Code in mehreren Werkzeugen getestet sind:

<?php 

//test 
// 
$summary = "test"; 
$datestart=time(); 
$dateend = $datestart + 3600; 
$address = "Amsterdam"; 
$description = "testing ical format"; 
$filename = "test.ics"; 

// Variables used in this script: 
// $summary  - text title of the event 
// $datestart - the starting date (in seconds since unix epoch) 
// $dateend  - the ending date (in seconds since unix epoch) 
// $address  - the event's address 
// $uri   - the URL of the event (add http://) 
// $description - text description of the event 
// $filename - the name of this file for saving (e.g. my-event-name.ics) 
// 
// Notes: 
// - the UID should be unique to the event, so in this case I'm just using 
// uniqid to create a uid, but you could do whatever you'd like. 
// 
// - iCal requires a date format of "yyyymmddThhiissZ". The "T" and "Z" 
// characters are not placeholders, just plain ol' characters. The "T" 
// character acts as a delimeter between the date (yyyymmdd) and the time 
// (hhiiss), and the "Z" states that the date is in UTC time. Note that if 
// you don't want to use UTC time, you must prepend your date-time values 
// with a TZID property. See RFC 5545 section 3.3.5 
// 
// - The Content-Disposition: attachment; header tells the browser to save/open 
// the file. The filename param sets the name of the file, so you could set 
// it as "my-event-name.ics" or something similar. 
// 
// - Read up on RFC 5545, the iCalendar specification. There is a lot of helpful 
// info in there, such as formatting rules. There are also many more options 
// to set, including alarms, invitees, busy status, etc. 
// 
//  https://www.ietf.org/rfc/rfc5545.txt 
// 1. Set the correct headers for this file 
header('Content-type: text/calendar; charset=utf-8'); 
header("Content-Disposition:inline;filename=".$filename); 
// 2. Define helper functions 
// Converts a unix timestamp to an ics-friendly format 
// NOTE: "Z" means that this timestamp is a UTC timestamp. If you need 
// to set a locale, remove the "\Z" and modify DTEND, DTSTAMP and DTSTART 
// with TZID properties (see RFC 5545 section 3.3.5 for info) 
// 
// Also note that we are using "H" instead of "g" because iCalendar's Time format 
// requires 24-hour time (see RFC 5545 section 3.3.12 for info). 
function dateToCal($timestamp) { 
    return date('Ymd\THis\Z', $timestamp); 
} 
// Escapes a string of characters 
function escapeString($string) { 
    return preg_replace('/([\,;])/','\\\$1', $string); 
} 
// 3. Echo out the ics file's contents 
$iCal="BEGIN:VCALENDAR\r 
VERSION:2.0\r 
PRODID:-//hacksw/handcal//NONSGML v1.0//EN\r 
CALSCALE:GREGORIAN\r 
BEGIN:VEVENT\r 
DTSTAMP:".dateToCal(time())."\r 
DTSTART:".dateToCal($datestart)."\r 
DTEND:".dateToCal($dateend)."\r 
UID:".uniqid()."\r 
LOCATION:".escapeString($address)."\r 
DESCRIPTION:".escapeString($description)."\r 
SUMMARY:".escapeString($summary)."\r 
END:VEVENT\r 
END:VCALENDAR"; 
file_put_contents($filename,$iCal); 
print file_get_contents($filename); 
unlink($filename); 
exit; 
?> 

Es scheint wichtig, dass die Zeilenende sind richtig (so \ r \ n).

+0

Dies funktioniert in Mac/Google Kalender. Yahoo Kalender es borks immer noch an. – Paul

4

Ihre Datei korrekt ist, ich habe es hochgeladen Kalender selbst googeln, so sollte es aber funktionieren, wenn Sie nicht das Skript nach dem Dateiecho zu stoppen, zum Beispiel:

//somewhere else in the script 
    echo "this will break the file"; 
    header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
    header('Cache-Control: no-store, no-cache, must-revalidate'); 
    header('Cache-Control: post-check=0, pre-check=0', false); 
    header('Pragma: no-cache'); 
    header('Content-type: text/calendar;'); 
    header('Content-Disposition: inline; filename="calendar.ics"'); 
    header("Content-Description: File Transfer"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . strlen($generated)); 
    echo $generated; 
    exit;//or return 200 or whatever 
    echo "this could break the file except there is an exit;";//for example. 

Sie könnte im Wesentlichen eine fehlerhafte Datei senden.

+0

good spot, wie wäre es mit ':: foobar ::' oder ';; foobar ;;' .. oder möglicherweise die gleiche Datei noch einmal? –

+1

Interessant - aus welchem ​​Grund auch immer, was ich hinzufügen: "Echo" Foobar ";" oder "Echo" :: Foobar :: ";" erscheint nicht einmal in der Ausgabe zur Verfügung gestellt. _ ** aber ** _ das Entfernen von Sachen aus '$ generated' entfernt sie tatsächlich aus der Ausgabe. Ich habe keine Ahnung mehr, was ich denken soll. (Ich benutze nicht das Beispiel für das Beenden nach dem Ausgeben von $ generated) – HPierce

+1

sehe meine Bearbeitung, ich habe es getestet, es bricht es. –

0

In .ics Datei hinzugefügt ich eine Zeile

METHOD:REQUEST 

und Yahoo begann zu arbeiten. In meinem Fall sendete ich Mails an Hotmail, Google Mail und Yahoo mit .ics Datei und Yahoo arbeitete nicht ohne diese Zeile. Mit

METHOD:PUBLISH 

yahoo auch Arbeit

Verwandte Themen