= ($data['items_total'] ?? 0)) { break; } } return $items; } function format_event_meta(array $item): string { $parts = []; $start = !empty($item['start']) ? new DateTime($item['start']) : null; $end = !empty($item['end']) ? new DateTime($item['end']) : null; if ($start) { $parts[] = !empty($item['whole_day']) ? 'Le ' . $start->format('d/m/Y') : 'Le ' . $start->format('d/m/Y à H:i'); } if ($end && (!$start || $end->format('Y-m-d') !== $start->format('Y-m-d'))) { $parts[] = "jusqu'au " . $end->format('d/m/Y H:i'); } $address = implode(', ', array_filter([$item['street'] ?? null, $item['zipcode'] ?? null, $item['city'] ?? null])); if ($address) { $parts[] = "Lieu : $address"; } return implode(' — ', $parts); } function build_events_feed(): string { $items = []; foreach (fetch_all_events() as $item) { $id = basename(rtrim($item['@id'] ?? '', '/')); $title = $item['title_fr'] ?? $item['title'] ?? '(sans titre)'; $uid = $item['UID'] ?? $id; $meta = format_event_meta($item); $description = ($meta !== '' ? '
' . htmlspecialchars($meta, ENT_QUOTES, 'UTF-8') . '
' : '') . full_body_html($item); // Un evenement recurrent partage le meme UID sur toutes ses // occurrences (memes UID, dates differentes) : on suffixe le guid // avec la date de debut pour rester unique par occurrence, comme // l'exige la spec RSS. $items[] = [ 'title' => $title, 'link' => SITE . '/agenda/' . slugify($title) . '?u=' . rawurlencode($uid), 'guid' => $uid . '-' . ($item['start'] ?? ''), 'pubDate' => $item['created'] ?? $item['start'] ?? null, 'description' => $description, ]; } return build_rss( 'Silly.be - Agenda', SITE . '/agenda', "Agenda / événements de la commune de Silly (Belgique)", $items, 'https://sillycone-village.be/silly-rss/agenda.php' ); } serve_cached_feed('agenda', 'build_events_feed');