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