!empty($dayData['is_open']) ? 1 : 0, 'open_time' => normalize_time_value($dayData['open_time'] ?? null), 'close_time' => normalize_time_value($dayData['close_time'] ?? null), 'kitchen_close_time' => normalize_time_value($dayData['kitchen_close_time'] ?? null), ]; } /** * A day marked "Open" needs both ends of its range set — everything else * (closed days, the optional kitchen closing time) is fine left blank. */ function validate_hours_input(array $daysInput): ?string { for ($d = 0; $d <= 6; $d++) { $day = hours_day_from_post(is_array($daysInput[$d] ?? null) ? $daysInput[$d] : []); if ($day['is_open'] && (!$day['open_time'] || !$day['close_time'])) { return HOURS_DAY_NAMES[$d] . ' is marked open but is missing an opening or closing time.'; } } return null; } $submittedHours = null; if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!verify_csrf_token($_POST['csrf_token'] ?? '')) { $errorMsg = 'Session expired or invalid security token. Please try again.'; } elseif (($_POST['action'] ?? '') === 'save_hours') { $daysInput = is_array($_POST['day'] ?? null) ? $_POST['day'] : []; if ($error = validate_hours_input($daysInput)) { $errorMsg = $error; $submittedHours = []; for ($d = 0; $d <= 6; $d++) { $submittedHours[$d] = hours_day_from_post(is_array($daysInput[$d] ?? null) ? $daysInput[$d] : []); } } else { save_all_hours($daysInput); header('Location: hours.php?saved=1'); exit; } } } $hoursByDay = $submittedHours ?? get_all_hours(); $justSaved = !$_POST && isset($_GET['saved']); ?> Hours | The Old Fitz Admin

Operations

Pub Hours

Hours saved — the public site is now showing the updated schedule.

🕒 Weekly Schedule

Leave "Kitchen Closes" blank on a day if the kitchen doesn't have a separate cutoff from the bar. Special closures (holidays, weather) are handled on the Announcements page instead of here.

👀 Public Site Preview

This is how the schedule above will read on the site once saved.

— bar snacks stay out later. Holiday hours may vary; check our Facebook page for the latest.