< home RiV >

ICS-Dateien für Outlook-Kalender

automatisch on-the-fly generieren

aus einer statischen HTML-Tabelle

(nur mit php, also ohne dass MySQL oder asp erforderlich sind)

Jede einzelne Tabellen-Zeile des Veranstaltungskalenders soll durch einen Klick in jene Zeile in den Outlook-Kalender übernommen werden können. Dazu wird in jeder Zeile am Ende eine Spalte eingefügt, die einen Link namens "Outlook" auf eine php-Datei enthält (am besten im Wysiwyg-Modus). Der Link enthält als Anhängsel die für die ICS-Datei erforderlichen Daten. Die php-Datei macht daraus eine ICS-Datei.
 

Als Beispielkalender diene unser Veranstaltungskalender (HTML-Tabelle); er sollte keine zweigestrichene Anführungszeichen enthalten; sonst kann es zu Fehlfunktionen kommen.

 

Im Head-Bereich des Kalenders ist die Variable "TabZeile" auf -1 gesetzt,

        var TabZeile = -1.

damit auch in der ersten Kalenderzeile - wie auch in den späteren Kalenderzeilen  - die Variable Tabzeile um 1 addiert werden kann (das Höherzählen von Zeile zu Zeile ist erforderlich, weil damit die Identität der Zeile festgestellt werden kann; dies wiederum ist erforderlich, weil getElementsByTagName("tr") sonst durchgehend über alle Zeilen zählt.)

 

Im Body muss in jede (!) Zelle der 6. Tabellenspalte (die 1. Spalte hat die Nr. 0 und enthält die "new"-Grafik)

folgende Funktion eingefügt werden:

<script language="JavaScript">

var TabZeile = TabZeile+1;
var thisrow = document.getElementsByTagName("tr")[TabZeile];

if(document.all){
datumm = thisrow.getElementsByTagName("td")[1].innerText;
} else {
datumm = thisrow.getElementsByTagName("td")[1].textContent;
};

if(document.all){
thema = thisrow.getElementsByTagName("td")[2].innerText;
} else {
thema = thisrow.getElementsByTagName("td")[2].textContent;
};

if(document.all){
ort = thisrow.getElementsByTagName("td")[3].innerText;
} else {
ort = thisrow.getElementsByTagName("td")[3].textContent;
};

if(document.all){
uhr = thisrow.getElementsByTagName("td")[4].innerText;
} else {
uhr = thisrow.getElementsByTagName("td")[4].textContent;
};

var uebergabe = 'cal.php?datumm=' + datumm + '&thema=' + thema + '&ort=' + ort + '&uhr=' + uhr;
j="Outlook"
j=j.fontsize(1).link(uebergabe)
document.write(j);
</script>

Im selben Verzeichnis wie der Veranstaltungskalender muss eine Datei cal.php angelegt werden mit folgendem Inhalt:

<?php

/*
Aus der URL die übergebenen Variablen holen
*/
$_GET["datumm"];
$_GET["thema"];
$_GET["ort"];
$_GET["uhr"];

/*
Führende und nachstehende Leerzeichen entfernen, die entstehen, wenn in der
Veranstaltungstabelle textContent statt innerText zum Einsatz kommt.
*/
$datumm=ltrim($datumm);
$thema=ltrim($thema);
$ort=ltrim($ort);
$uhr=ltrim($uhr);

/*
Wenn keine Uhrzeit angegeben ist, setze sie auf 08:00
*/

if(empty($uhr) OR strpos($uhr, ":")===false)
{
$uhr="08:00";
$uhrhinweis="Die eingetragene Uhrzeit ist fiktiv. Ich muss mich noch beim Veranstalter nach der richtigen Uhrzeit erkundigen.";
}

/*
Datumsformat ändern von 01.02.09 in 090201
*/
$datum_array=explode(".",$datumm);
$datumm=$datum_array[2].$datum_array[1].$datum_array[0];

/*
Aus der Uhrzeit den Doppelpunkt entfernen
*/
$uhr_array=explode(":",$uhr);
$uhr=$uhr_array[0].$uhr_array[1];

/*
Bei dreistelligen Uhrzeiten eine führende Null ergänzen.
Die Enduhrzeit soll immer eine Stunde nach der Anfangszeit sein
*/
$uhr = sprintf("%04s", $uhr);
$uhr2= $uhr+100;
$uhr2= sprintf("%04s", $uhr2);

/*
Die ics-Datei aus den obigen Variablen erstellen
*/
?>
<?php
header("Content-Type: text/Calendar");
header("Content-Disposition: inline; filename=calendar.ics");
echo "BEGIN:VCALENDAR\n";
echo "VERSION:2.0\n";
echo "PRODID:-//Foobar Corporation//NONSGML Foobar//EN\n";
echo "METHOD:PUBLISH\n"; // requied by Outlook
echo "BEGIN:VEVENT\n";
echo "UID:".date('Ymd').'T'.date('His')."-".rand()."-example.com\n"; // required by Outlok
echo "DTSTAMP:".date('Ymd').'T'.date('His')."\n"; // required by Outlook
echo "DTSTART:20".$datumm."T".$uhr."00\n";
echo "DTEND:20".$datumm."T".$uhr2."00\n";
echo "LOCATION;ENCODING=QUOTED-PRINTABLE:".$ort."\n";
echo "SUMMARY;ENCODING=QUOTED-PRINTABLE:".$thema."\n";
echo "DESCRIPTION:".$uhrhinweis."\n";
echo "BEGIN:VALARM\n";
echo "ACTION:DISPLAY\n";
echo "TRIGGER:-PT36H\n";
echo "DESCRIPTION:Reminder\n";
echo "END:VALARM\n";
echo "END:VEVENT\n";
echo "END:VCALENDAR\n";

?>

Wenn Sie obigen Quelltext für andere Projekte verwenden, setzten Sie von dort bitte einen Link auf www.richterverein.de.

Eventuelle Kommentare gern ins Gästebuch.

 

Wolfgang Hirth (01.01.2009)