From 69217afce47cdeb63688185aed3ac908095805a7 Mon Sep 17 00:00:00 2001 From: Tobias Feigel Date: Sun, 6 Jul 2025 19:35:14 +0200 Subject: [PATCH] feat: introduce event carousel and ICS integration for homepage Added an event carousel to the homepage to display upcoming events dynamically. Integrated ICS parsing to fetch and format calendar data for future events. Enhanced layout and responsiveness with scroll functionality and improved styling. --- site/collections/termine.php | 66 ++++++++++ site/snippets/termine-home.php | 215 +++++++++++++++++++++++++++++++++ site/snippets/termine.php | 49 +------- site/templates/home.php | 7 ++ 4 files changed, 291 insertions(+), 46 deletions(-) create mode 100644 site/collections/termine.php create mode 100644 site/snippets/termine-home.php create mode 100644 site/templates/home.php diff --git a/site/collections/termine.php b/site/collections/termine.php new file mode 100644 index 0000000..deff9d8 --- /dev/null +++ b/site/collections/termine.php @@ -0,0 +1,66 @@ +format('d.m.Y H:i') : $date; + } else { + $dt = DateTime::createFromFormat('Ymd', $date); + + return $dt ? $dt->format('d.m.Y') : $date; + } + } + +// ICS-Datei laden + $ics = @file_get_contents(CAL_URL); + if ( ! $ics) { + echo '
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; + } + + $events = parse_ics($ics); + + return function() use ($events) { + return $events; + } +?> \ No newline at end of file diff --git a/site/snippets/termine-home.php b/site/snippets/termine-home.php new file mode 100644 index 0000000..66dcb1c --- /dev/null +++ b/site/snippets/termine-home.php @@ -0,0 +1,215 @@ +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' => 'Jan', + '02' => 'Feb', + '03' => 'Mrz', + '04' => 'Apr', + '05' => 'Mai', + '06' => 'Jun', + '07' => 'Jul', + '08' => 'Aug', + '09' => 'Sep', + '10' => 'Okt', + '11' => 'Nov', + '12' => 'Dez', + ]; +?> + +
+

Bevorstehende Termine

+ +
+ + +
+
+ + + +
+ +
+
+
+ +
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+
+
+
+
+
+

+

ab Uhr

+
+
+
+
+ +
+
+ + +
+
+ + + + \ No newline at end of file diff --git a/site/snippets/termine.php b/site/snippets/termine.php index 2cc3b7b..362ca0f 100644 --- a/site/snippets/termine.php +++ b/site/snippets/termine.php @@ -1,50 +1,5 @@ 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 @@ -59,7 +14,8 @@ function format_ics_date($date) } } -$events = parse_ics($ics); +$events = collection('termine'); + // Nur Events mit DTSTART berücksichtigen $events = array_filter($events, function ($event) { return isset($event['DTSTART']) && ! empty($event['DTSTART']); @@ -135,6 +91,7 @@ if ($filter_jahr && $filter_monat) { $filtered_events = $future_events; } ?> +
diff --git a/site/templates/home.php b/site/templates/home.php new file mode 100644 index 0000000..e5a8214 --- /dev/null +++ b/site/templates/home.php @@ -0,0 +1,7 @@ + + +

Hallo Welt!

+ + + + \ No newline at end of file