Kalender konnte nicht geladen werden.'; return; } // Termine parsen function parse_ics($ics) { $lines = explode("\n", $ics); $events = []; $event = []; $inEvent = false; foreach ($lines as $line) { $line = trim($line); if ($line === 'BEGIN:VEVENT') { $inEvent = true; $event = []; } elseif ($line === 'END:VEVENT') { $inEvent = false; $events[] = $event; } elseif ($inEvent) { // Property kann Parameter enthalten, z.B. DTSTART;TZID=Europe/Berlin:20240701T19000000 $parts = explode(':', $line, 2); if (count($parts) === 2) { $key = $parts[0]; $val = $parts[1]; // Nur den eigentlichen Property-Namen extrahieren $key = strtoupper(preg_replace('/;.+$/', '', $key)); $event[$key] = $val; } } } return $events; } function format_ics_date($date) { // Unterstützt sowohl ganztägige als auch Zeitangaben if (strpos($date, 'T') !== false) { $dt = DateTime::createFromFormat('Ymd\THis', substr($date, 0, 15)); return $dt ? $dt->format('d.m.Y H:i') : $date; } else { $dt = DateTime::createFromFormat('Ymd', $date); return $dt ? $dt->format('d.m.Y') : $date; } } $events = parse_ics($ics); // Nur Events mit DTSTART berücksichtigen $events = array_filter($events, function ($event) { return isset($event['DTSTART']) && ! empty($event['DTSTART']); }); // Nach Datum sortieren usort($events, function ($a, $b) { return strcmp($a['DTSTART'], $b['DTSTART']); }); // Aktuelles Datum $today = (new DateTime())->format('Ymd'); // Nur zukünftige Termine anzeigen $future_events = array_filter($events, function ($event) use ($today) { return isset($event['DTSTART']) && $event['DTSTART'] >= $today; }); // --- Deutsche Monatsnamen --- $de_months = [ '01' => 'Januar', '02' => 'Februar', '03' => 'März', '04' => 'April', '05' => 'Mai', '06' => 'Juni', '07' => 'Juli', '08' => 'August', '09' => 'September', '10' => 'Oktober', '11' => 'November', '12' => 'Dezember', ]; // --- Gruppierung aller Termine nach Jahr und Monat für die Sidebar --- function group_events_by_year_month($events) { $grouped = []; foreach ($events as $event) { if ( ! isset($event['DTSTART'])) { continue; } $date = $event['DTSTART']; $year = substr($date, 0, 4); $month = substr($date, 4, 2); $grouped[$year][$month][] = $event; } krsort($grouped); // Jahre absteigend foreach ($grouped as &$months) { krsort($months); // Monate absteigend } return $grouped; } $all_events_grouped = group_events_by_year_month($events); // --- Filter aus URL --- $filter_jahr = $_GET['jahr'] ?? null; $filter_monat = $_GET['monat'] ?? null; if ($filter_jahr && $filter_monat) { $filtered_events = array_filter($events, function ($event) use ($filter_jahr, $filter_monat) { $date = $event['DTSTART'] ?? ''; return substr($date, 0, 4) === $filter_jahr && substr($date, 4, 2) === $filter_monat; }); } elseif ($filter_jahr) { $filtered_events = array_filter($events, function ($event) use ($filter_jahr) { $date = $event['DTSTART'] ?? ''; return substr($date, 0, 4) === $filter_jahr; }); } else { $filtered_events = $future_events; } ?>
Keine Termine gefunden.
Datum Uhrzeit Titel