format('Y')); $startMonth = (int)($_GET['month'] ?? $today->format('n')); // Clamp if ($startMonth < 1) { $startMonth = 12; $startYear--; } if ($startMonth > 12) { $startMonth = 1; $startYear++; } // Build the 3-month window: startMonth, +1, +2 $months = []; for ($i = 0; $i < 3; $i++) { $m = $startMonth + $i; $y = $startYear; if ($m > 12) { $m -= 12; $y++; } $months[] = ['year' => $y, 'month' => $m]; } // ── Fetch all events across the 3-month window ──────────────────────────── // Window: first day of startMonth → last day of startMonth+2 $windowStart = sprintf('%04d-%02d-01', $months[0]['year'], $months[0]['month']); $lastMo = $months[2]; $lastDay = (int)(new DateTime("{$lastMo['year']}-{$lastMo['month']}-01"))->format('t'); $windowEnd = sprintf('%04d-%02d-%02d', $lastMo['year'], $lastMo['month'], $lastDay); $events = []; try { $stmt = $pdo->prepare( "SELECT a." . COL_ART_ID . ", a." . COL_ART_TITLE . ", a." . COL_ART_AUTHOR . ", a." . COL_ART_FEATURED . ", a." . COL_ART_EVENT_DATE . ", a." . COL_ART_EVENT_TIME . ", a." . COL_ART_LOCATION . " FROM " . TBL_ARTICLE . " a INNER JOIN " . TBL_TOPIC . " t ON a." . COL_ART_TOPIC_ID . " = t." . COL_TOPIC_ID . " WHERE t." . COL_TOPIC_SLUG . " = 'event' AND a." . COL_ART_ACTIVE . " = 1 AND a." . COL_ART_EVENT_DATE . " BETWEEN :start AND :end ORDER BY a." . COL_ART_EVENT_DATE . " ASC, a." . COL_ART_EVENT_TIME . " ASC" ); $stmt->execute([':start' => $windowStart, ':end' => $windowEnd]); $events = $stmt->fetchAll(); } catch (Exception $e) {} // Group events by YYYY-MM-DD key $byDate = []; foreach ($events as $ev) { $byDate[$ev[COL_ART_EVENT_DATE]][] = $ev; } // ── Navigation: prev/next windows ──────────────────────────────────────── $prevM = $startMonth - 3; $prevY = $startYear; if ($prevM < 1) { $prevM += 12; $prevY--; } $nextM = $startMonth + 3; $nextY = $startYear; if ($nextM > 12) { $nextM -= 12; $nextY++; } $MONTH_NAMES = ['','January','February','March','April','May','June', 'July','August','September','October','November','December']; $DAY_NAMES = ['','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']; ?> <?= htmlspecialchars(getSetting($pdo, 'page_title_calendar', 'Calendar — blocmedia')) ?>

Events —

Showing . Days with no events are hidden. Submit an event.

format('Y-m-d'); $anyEvents = false; foreach ($months as $mo): $mYear = $mo['year']; $mMonth = $mo['month']; $daysInMo = (int)(new DateTime("$mYear-$mMonth-01"))->format('t'); // Collect event dates for this month $monthHasEvents = false; for ($d = 1; $d <= $daysInMo; $d++) { $key = sprintf('%04d-%02d-%02d', $mYear, $mMonth, $d); if (!empty($byDate[$key])) { $monthHasEvents = true; break; } } ?>
No events this month.
format('N'); $isToday = ($dateKey === $todayStr); $anchor = 'day-' . $mYear . '-' . str_pad($mMonth, 2, '0', STR_PAD_LEFT) . '-' . str_pad($d, 2, '0', STR_PAD_LEFT); ?>