Admin

Enter your password to manage recipes.

$r) { if (($r['slug'] ?? '') === $slugEdit) { $editing = $r; $editIndex = $idx; $editingEn = $r['i18n']['en'] ?? []; $editingDe = $r['i18n']['de'] ?? []; break; } } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'delete') { $slugDel = trim($_POST['slug'] ?? ''); $before = count($allRecipes); $allRecipes = array_values(array_filter($allRecipes, fn($r) => ($r['slug'] ?? '') !== $slugDel)); if ($before !== count($allRecipes) && save_recipes($allRecipes)) { $message = 'Recipe deleted.'; } else { $message = 'Could not delete. Check permissions.'; } $editing = null; $editIndex = null; } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'save') { // helpers $parse_csv = fn($text) => array_values(array_filter(array_map('trim', explode(',', $text ?? '')), 'strlen')); $parse_lines = fn($text) => array_values(array_filter(array_map('trim', preg_split('/\\r?\\n/', $text ?? '')), 'strlen')); $titleEn = trim($_POST['title_en'] ?? ''); $titleDe = trim($_POST['title_de'] ?? ''); $descriptionEn = trim($_POST['description_en'] ?? ''); $descriptionDe = trim($_POST['description_de'] ?? ''); $hero = trim($_POST['hero'] ?? ''); $categoryEn = trim($_POST['category_en'] ?? ''); $categoryDe = trim($_POST['category_de'] ?? ''); $tagsEn = $parse_csv($_POST['tags_en'] ?? ''); $tagsDe = $parse_csv($_POST['tags_de'] ?? ''); $prep = (int) ($_POST['prep_time'] ?? 0); $cook = (int) ($_POST['cook_time'] ?? 0); $total = (int) ($_POST['total_time'] ?? ($prep + $cook)); $servings = (int) ($_POST['servings'] ?? 0); $difficultyEn = trim($_POST['difficulty_en'] ?? 'Easy'); $difficultyDe = trim($_POST['difficulty_de'] ?? 'Einfach'); $ingredientsEn = $parse_lines($_POST['ingredients_en'] ?? ''); $ingredientsDe = $parse_lines($_POST['ingredients_de'] ?? ''); $utensilsEn = $parse_lines($_POST['utensils_en'] ?? ''); $utensilsDe = $parse_lines($_POST['utensils_de'] ?? ''); $stepsEn = $parse_lines($_POST['steps_en'] ?? ''); $stepsDe = $parse_lines($_POST['steps_de'] ?? ''); $featured = isset($_POST['featured']) && $_POST['featured'] === '1'; $comingSoon = isset($_POST['coming_soon']) && $_POST['coming_soon'] === '1'; $slugOriginal = trim($_POST['slug_original'] ?? ''); // keep previous language data if fields left blank while editing $prevEn = $editing['i18n']['en'] ?? []; $prevDe = $editing['i18n']['de'] ?? []; $titleEn = $titleEn !== '' ? $titleEn : ($prevEn['title'] ?? ''); $titleDe = $titleDe !== '' ? $titleDe : ($prevDe['title'] ?? ''); $descriptionEn = $descriptionEn !== '' ? $descriptionEn : ($prevEn['description'] ?? ''); $descriptionDe = $descriptionDe !== '' ? $descriptionDe : ($prevDe['description'] ?? ''); $categoryEn = $categoryEn !== '' ? $categoryEn : ($prevEn['category'] ?? ''); $categoryDe = $categoryDe !== '' ? $categoryDe : ($prevDe['category'] ?? ''); $difficultyEn = $difficultyEn !== '' ? $difficultyEn : ($prevEn['difficulty'] ?? 'Easy'); $difficultyDe = $difficultyDe !== '' ? $difficultyDe : ($prevDe['difficulty'] ?? 'Einfach'); $tagsEn = !empty($tagsEn) ? $tagsEn : ($prevEn['tags'] ?? []); $tagsDe = !empty($tagsDe) ? $tagsDe : ($prevDe['tags'] ?? []); $ingredientsEn = !empty($ingredientsEn) ? $ingredientsEn : ($prevEn['ingredients'] ?? []); $ingredientsDe = !empty($ingredientsDe) ? $ingredientsDe : ($prevDe['ingredients'] ?? []); $utensilsEn = !empty($utensilsEn) ? $utensilsEn : ($prevEn['utensils'] ?? []); $utensilsDe = !empty($utensilsDe) ? $utensilsDe : ($prevDe['utensils'] ?? []); $stepsEn = !empty($stepsEn) ? $stepsEn : ($prevEn['steps'] ?? []); $stepsDe = !empty($stepsDe) ? $stepsDe : ($prevDe['steps'] ?? []); if ($titleEn === '') { $message = 'English title is required.'; } elseif (!$comingSoon && (empty($ingredientsEn) || empty($stepsEn))) { $message = 'Ingredients and steps are required unless marked coming soon.'; } else { // determine slug if ($slugOriginal) { $slug = $slugOriginal; } else { $slug = slugify($titleEn ?: $titleDe); // ensure unique slug $existingSlugs = array_map(fn($r) => $r['slug'] ?? '', $allRecipes); $base = $slug; $i = 1; while (in_array($slug, $existingSlugs, true)) { $slug = $base . '-' . $i; $i++; } } if ($featured) { foreach ($allRecipes as &$r) { $r['featured'] = false; } unset($r); } $record = [ 'slug' => $slug, 'hero' => $hero, 'prep_time' => $prep, 'cook_time' => $cook, 'total_time' => $total, 'servings' => $servings, 'featured' => $featured, 'coming_soon' => $comingSoon, 'i18n' => [ 'en' => [ 'title' => $titleEn, 'description' => $descriptionEn, 'category' => $categoryEn, 'difficulty' => $difficultyEn, 'tags' => $tagsEn, 'ingredients' => $ingredientsEn, 'utensils' => $utensilsEn, 'steps' => $stepsEn, ], 'de' => [ 'title' => $titleDe ?: $titleEn, 'description' => $descriptionDe ?: $descriptionEn, 'category' => $categoryDe ?: $categoryEn, 'difficulty' => $difficultyDe, 'tags' => !empty($tagsDe) ? $tagsDe : $tagsEn, 'ingredients' => !empty($ingredientsDe) ? $ingredientsDe : $ingredientsEn, 'utensils' => !empty($utensilsDe) ? $utensilsDe : $utensilsEn, 'steps' => !empty($stepsDe) ? $stepsDe : $stepsEn, ], ], ]; if ($slugOriginal && $editIndex !== null) { $allRecipes[$editIndex] = $record; } else { $allRecipes[] = $record; } if (save_recipes($allRecipes)) { $message = $slugOriginal ? 'Saved changes.' : 'Saved! New recipe added.'; } else { $message = 'Could not save the file. Check permissions on data/recipes.json.'; } } } ?> FlixCooks Admin

FlixCooks Admin

View site Back

Accepts full URLs or relative paths (e.g. /assets/images/hero.jpg).


English


Deutsch

Existing recipes ()

No recipes yet.

Featured Coming soon
Edit