Wie kann ich PHP verwenden, um dynamisch eine ical-Datei zu veröffentlichen, die Google Kalender zu lesen?

StackOverflow https://stackoverflow.com/questions/1463480

  •  13-09-2019
  •  | 
  •  

Frage

Jede Suche Google auf PHP ische bringt nur bis phpicalendar und wie in iCal-Dateien zu analysieren oder zu lesen. Ich möchte nur eine PHP-Datei schreiben, die Ereignisse aus meiner Datenbank zieht und schreibt sie im iCal-Format aus.

Mein Problem ist, ich kann nicht überall finden, dass zwei Fragen beantworten:

  1. Was ist die genau isch-Format, einschließlich Header, Dateiformat, Fußzeilen usw.? Mit anderen Worten: Was tut die Datei haben müssen, genau, um richtig von Google Kalender eingelesen zu werden, usw.?
  2. Wenn ich diese Datei mit einer Erweiterung .php bauen, wie veröffentliche ich es als isch? Muss ich auf eine neue ICS-Datei schreiben? Oder wird Google Kalender usw. las eine Php-Datei als isch, solange der Inhalt im richtigen Format ist? (Ähnlich wie eine style.css.php Datei wird als CSS-Datei gelesen werden, wenn der Inhalt tatsächlich CSS ist, usw.)

Jede Hilfe Sie alle können mir geben oder Punkt wird sehr geschätzt !!!

War es hilfreich?

Lösung

Dies sollte sehr einfach sein, wenn Google Kalender nicht die *.ics-Erweiterung erfordert (das einige URL erfordert in der Server-Rewriting).

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

Das ist im Wesentlichen alles, was Sie brauchen, um ein Kunde denken, dass Sie eine iCalendar-Datei sind dient, obwohl es könnte einige Probleme in Bezug auf sein Caching, Textcodierung und so weiter. Aber man kann mit diesem einfachen Code experimentiert.

Andere Tipps

Ein Hinweis auf persönliche Erfahrung neben sowohl Stefan Gehrig-Antwort und Dave Keine Antwort (und mmmshuddup Antwort):

Ich habe Validierungsprobleme sowohl \ n und PHP_EOL verwenden, wenn ich das ICS-Validator verwendet unter http://severinghaus.org/projects/ iCV /

Ich habe ich gelernt, \ r \ n, um verwenden musste, um es richtig zu validieren, so war dies meine Lösung:

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;

Dass mein Parse-Fehler gestoppt und machte meine ICS-Dateien richtig zu validieren.

Es gibt eine ausgezeichnete eluceo / ische Paket, das Sie einfach erstellen ics-Dateien ermöglicht.

Hier ist ein Beispiel für die Verwendung von 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();

Vielleicht ein wenig spät, aber hier ist ein Link auf die aktuelle Spezifikation. http://tools.ietf.org/html/rfc5545 1

http://www.kanzaki.com/docs/ical/ hat eine leicht besser lesbare Version des älteren spec. Es hilft als Ausgangspunkt -. Viele Dinge sind immer noch die gleichen

Auch auf rel="nofollow">, ich habe

  1. Einige Listen von nützlichen Ressourcen (siehe Kasten unten rechts) auf
    • isch Spec RFC 5545
    • isch Testressourcen
  2. Einige Hinweise auf meiner Reise aufgezeichnet mit .ics in den letzten paar Jahren. Insbesondere können Sie das wiederkehrende Ereignisse 'Spickzettel' nützlich sein.

.ics Bereiche, die sorgfältige Handhabung benötigen:

  • 'den ganzen Tag' Ereignisse
  • Arten von Terminen (Zeitzone, UTC oder lokaler 'schwebende') - nb Unterscheidung zu verstehen
  • Interoperabilität der Wiederholungsregeln
  1. Genaues ische Format: http://www.ietf.org/rfc/rfc2445.txt
  2. Nach der Spezifikation, hat es in ics beenden

Edit: eigentlich bin ich nicht sicher - Linie 6186 gibt ein Beispiel in ics-Format zu benennen, aber es gibt auch an können Sie URL-Parameter verwenden. Ich glaube nicht, es wichtig ist, solange der MIME-Typ korrekt ist.

Bearbeiten: Beispiel aus 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

MIME-Typ ist auf dem Server konfiguriert ist.

Stellen Sie sicher, dass Sie die Zeichenfolge wie folgt formatiert werden oder es wird nicht funktionieren

 $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";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top