false, 'error' => 'Please choose a valid menu category.']; } $name = post_str($post, 'name'); $price = post_str($post, 'price'); if ($name === '' || $price === '') { return ['success' => false, 'error' => 'Item name and price are required.']; } $itemId = !empty($post['item_id']) ? (int) $post['item_id'] : null; if ($itemId !== null && ($itemId <= 0 || !get_menu_item_by_id($itemId))) { return ['success' => false, 'error' => 'Menu item not found.']; } $savedId = save_menu_item([ 'category_id' => $categoryId, 'name' => $name, 'description' => post_str($post, 'description'), 'price' => $price, 'badge' => post_str($post, 'badge'), 'is_available' => isset($post['is_available']) ? 1 : 0, ], $itemId); return ['success' => true, 'item' => get_menu_item_by_id($savedId), 'is_new' => $itemId === null]; } function handle_toggle_item(array $post): array { $itemId = (int) ($post['item_id'] ?? 0); if ($itemId <= 0 || !get_menu_item_by_id($itemId)) { return ['success' => false, 'error' => 'Menu item not found.']; } toggle_menu_item_availability($itemId); $item = get_menu_item_by_id($itemId); return [ 'success' => true, 'is_available' => (bool) $item['is_available'], 'status_badge' => $item['is_available'] ? '● Available' : '○ Sold Out / Hidden', 'status_class' => $item['is_available'] ? 'active' : 'inactive', 'btn_text' => $item['is_available'] ? 'Mark Sold Out' : 'Mark Available', ]; } function handle_move_item(array $post): array { $itemId = (int) ($post['item_id'] ?? 0); $direction = post_str($post, 'direction'); if ($itemId <= 0 || !get_menu_item_by_id($itemId)) { return ['success' => false, 'error' => 'Menu item not found.']; } if (!in_array($direction, ['up', 'down'], true)) { return ['success' => false, 'error' => 'Invalid direction.']; } return move_menu_item($itemId, $direction); } function handle_delete_item(array $post): array { $itemId = (int) ($post['item_id'] ?? 0); if ($itemId <= 0) { return ['success' => false, 'error' => 'Menu item not found.']; } delete_menu_item($itemId); return ['success' => true]; } function handle_save_category(array $post): array { $name = post_str($post, 'name'); if ($name === '') { return ['success' => false, 'error' => 'Category name is required.']; } $catId = !empty($post['category_id']) ? (int) $post['category_id'] : null; if ($catId !== null && ($catId <= 0 || !get_category_by_id($catId))) { return ['success' => false, 'error' => 'Category not found.']; } $savedId = save_category([ 'name' => $name, 'description' => post_str($post, 'description'), ], $catId); return ['success' => true, 'category' => get_category_by_id($savedId), 'is_new' => $catId === null]; } function handle_move_category(array $post): array { $catId = (int) ($post['category_id'] ?? 0); $direction = post_str($post, 'direction'); if ($catId <= 0 || !get_category_by_id($catId)) { return ['success' => false, 'error' => 'Category not found.']; } if (!in_array($direction, ['up', 'down'], true)) { return ['success' => false, 'error' => 'Invalid direction.']; } return move_category($catId, $direction); } function handle_delete_category(array $post): array { $catId = (int) ($post['category_id'] ?? 0); if ($catId <= 0) { return ['success' => false, 'error' => 'Category not found.']; } delete_category($catId); return ['success' => true]; } function handle_menu_action(string $action, array $post): array { return match ($action) { 'save_item' => handle_save_item($post), 'toggle_item' => handle_toggle_item($post), 'move_item' => handle_move_item($post), 'delete_item' => handle_delete_item($post), 'save_category' => handle_save_category($post), 'move_category' => handle_move_category($post), 'delete_category' => handle_delete_category($post), default => ['success' => false, 'error' => 'Unknown action'], }; } // Handle AJAX actions (JSON response) if ($_SERVER['REQUEST_METHOD'] === 'POST') { header('Content-Type: application/json; charset=utf-8'); $csrfToken = $_POST['csrf_token'] ?? null; if (!verify_csrf_token(is_string($csrfToken) ? $csrfToken : null)) { http_response_code(403); echo json_encode(['success' => false, 'error' => 'Session expired or invalid security token. Please refresh.']); exit; } $action = is_string($_POST['action'] ?? null) ? $_POST['action'] : ''; echo json_encode(handle_menu_action($action, $_POST)); exit; } $categories = get_all_categories(); $menuGrouped = get_full_menu(false); ?> Menu Management | The Old Fitz Admin

Food & Drink

Online Menu Management

No categories or menu items yet.

$category): ?>

$item): ?> '>
Status Item Price Tag Actions
No items in this category yet.
● Available ○ Sold Out / Hidden
—