Hier das angepasste Skript (sorry wegen der unsauberen Formatierung):
<?
/*=============================================
Skriptvorlage:
export_sunbird - Martin Heinzel - 18.03.2010
Version: 2.1
Beschreibung:
In diesem Skript werden die relevanten Termindaten einer *.ics (Sunbird
Terminverwaltung) in eine *.txt konvertiert.
================================================*/
//Bitte anpassen
//------------------------------------------
//Ablageort für kurze *.txt
$file_txt = IPS_GetKernelDir()."media\\Kalender\ est_kurz.txt";
//Ablageort für lange *.txt ("ICS")
$file_sunbird = IPS_GetKernelDir()."media\\Kalender\ est.txt";
//Terminart
$term_art = "Test";
//------------------------------------------
//--------------------------- Main ----------------------------
// Variablen
//String für kompletten Sunbird Datensatz
$Sunbird_DS_komplett = "";
//String array für Termine
$term_arr_komplett = array();
$dauer_term_arr = array();
//Daten holen
if(file_exists($file_sunbird))
//Termine in Variable einlesen
$Sunbird_DS_komplett = file_get_contents($file_sunbird);
// war die Kalenderdatei gefüllt?
if(strpos($Sunbird_DS_komplett,'VCALENDAR')){
//Den kompletten Datensatz zerlegen
$Sunbird_DS_arr_komplett = explode("BEGIN:", $Sunbird_DS_komplett);
//alle Datensätze durchlaufen
foreach($Sunbird_DS_arr_komplett as $key_1 => $value_1)
{
$term_inhalt = "";
$term_end = "ENDE";
$term_tag = "";
$term_monat = "";
$term_jahr = "";
$startdatum = "";
//Schalter inaktiv setzen
$rrule = 0;
$zusatz = 0;
$zweiwochen = 0;
//Der erste Datensatz ist "2"
if($key_1 > 1)
{
//einzelnen Datensatz in Daten zerlegen
//***Achtung! Alternativer Zeilenumbruch!***
$Sunbird_arr = explode("
", $value_1);
// $Sunbird_arr = explode("
", $value_1);
//Nur Datensätze vom Typ "VEVENT" durchlaufen
if($Sunbird_arr[0] == "VEVENT")
{
//alle Daten durchlaufen
foreach($Sunbird_arr as $key_2 => $value_2)
{
//Daten zerlegen in Parameter und Wert
$Data_arr = explode(":", $value_2);
//Kontrolle der Parameter
Switch($Data_arr[0])
{
case "SUMMARY":
$term_inhalt = $Data_arr[1];
$term_inhalt = iconv('UTF-8','ISO-8859-1',$term_inhalt);
break;
//Wiederholender Termin
case "RRULE":
$rrule = 1;
$timestamp = time();
$diesjahr = date("Y",$timestamp);
$term_jahr_rr = $diesjahr;
//14taegig?
$freq = $Data_arr[1];
$freq = substr($freq, 0, 22);
if($freq == "FREQ=WEEKLY;INTERVAL=2")
{
$zweiwochen = 1;
}
break;
//Zeitstempel Datum
case "DTSTART;VALUE=DATE":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
$start_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
// $startdate = $Data_arr[1];
if ($rrule) {
if($term_jahr_rr > $term_jahr) {
$term_jahr = $term_jahr_rr;
}
}
if ($zweiwochen) {
if($timestamp > $start_timestamp) {
$wochen = ($timestamp - $start_timestamp)/1209600;
$wochen = ceil($wochen);
$term_timestamp = $start_timestamp + ($wochen * 1209600);
$term_jahr = date("Y",$term_timestamp);
$term_monat = date("m",$term_timestamp);
$term_tag = date("d",$term_timestamp);
}
}
break;
//Zeitstempel Datum und Zeit
case "DTSTART":
case "DTSTART;TZID=Europe/Berlin":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
if ($rrule) {
if($term_jahr_rr > $term_jahr) {
$term_jahr = $term_jahr_rr;
}
}
break;
case "DTSTART;VALUE=DATE;TZID=Europe/Berlin":
$term_jahr = substr($Data_arr[1], 0, 4);
$term_monat = substr($Data_arr[1], 4, 2);
$term_tag = substr($Data_arr[1], 6, 2);
if ($rrule) {
if($term_jahr_rr > $term_jahr) {
$term_jahr = $term_jahr_rr;
}
}
break;
case "DTEND;VALUE=DATE":
$end_jahr = substr($Data_arr[1], 0, 4);
if ($end_jahr >= date("Y")) {
$end_monat = substr($Data_arr[1], 4, 2);
$end_tag = substr($Data_arr[1], 6, 2);
$end_timestamp = mktime(0, 0, 0, (int)$end_monat, (int)$end_tag, (int)$end_jahr);
if ($start_timestamp !== $end_timestamp - (24 * 60 *60))
{
$dauer = round(($end_timestamp - $start_timestamp) / 60 / 60 / 24) - 1;
for ($i = 1; $i <= $dauer; $i++) {
$start_timestamp = $start_timestamp + (24 * 60 *60);
if (!$zusatz)
{
$zusatz_term_tag = $term_tag + 1;
$zusatz = 1;
}
else $zusatz_term_tag = $zusatz_term_tag + 1;
$zusatz_term_arr[0] = $start_timestamp;
$zusatz_term_arr[1] = sprintf("%02s", $zusatz_term_tag);
$zusatz_term_arr[2] = sprintf("%02s", $term_monat);
$zusatz_term_arr[3] = $term_inhalt;
$zusatz_term_arr[4] = $term_art;
$zusatz_term_arr[5] = $term_end;
$zusatz_termin = implode(",", $zusatz_term_arr);
$dauer_term_arr[] = $zusatz_termin;
}
}
}
break;
}
}
//Restliche Daten generieren
//Time stamp
$term_timestamp = mktime(0, 0, 0, (int)$term_monat, (int)$term_tag, (int)$term_jahr);
//Termin array zusammenstellen
$term_arr[0] = $term_timestamp;
$term_arr[1] = sprintf("%02s", $term_tag);
$term_arr[2] = sprintf("%02s", $term_monat);
$term_arr[3] = $term_inhalt;
$term_arr[4] = $term_art;
$term_arr[5] = $term_end;
//Termin in einen String
$termin = implode(",", $term_arr);
$term_arr_komplett[] = $termin;
}
}
}
$term_arr_komplett = array_merge($term_arr_komplett,$dauer_term_arr);
sort($term_arr_komplett); // nach Zeit sortieren
$term_neu_komplett = implode("
", $term_arr_komplett); // in String zurück
//print_r($term_neu_komplett);
$handle=fopen($file_txt, "w");
fwrite($handle,$term_neu_komplett);
fclose($handle);
}
//---------------------- Main Ende ----------------------------
?>
Bitte ausprobieren. Das sollte sogar Jahreswechsel überstehen. Nach demselben Muster könnte man jetzt auch drei-, vier- und x-wöchige Wiederholungen umsetzen.
Ich habe zusätzlich eine Kleinigkeit an den Wiederholungsterminen geändert (wenn sie erst in der Zukunft starten, dann wird der Starttermin genommen und nix berechnet), das dürfte aber hoffentlich keinen Ärger machen.
Grüße
galleto