prepare('UPDATE navigation SET sort_order = ? WHERE id = ?'); foreach ($order as $pos => $navId) { $stmt->execute([$pos, (int) $navId]); } } if (!empty($_SERVER['HTTP_X_REQUESTED_WITH'])) { header('Content-Type: application/json'); echo json_encode(['success' => true]); exit; } flash('success', 'Reihenfolge aktualisiert.'); redirect('/admin/navigation.php'); } if (isset($_POST['delete_id'])) { $stmt = $pdo->prepare('DELETE FROM navigation WHERE id = ?'); $stmt->execute([(int) $_POST['delete_id']]); flash('success', 'Navigationspunkt gelöscht.'); redirect('/admin/navigation.php'); } if (isset($_POST['save'])) { $navId = !empty($_POST['nav_id']) ? (int) $_POST['nav_id'] : null; $label = trim($_POST['label'] ?? ''); $type = $_POST['type'] ?? 'url'; $target = trim($_POST['target'] ?? ''); $sortOrder = (int) ($_POST['sort_order'] ?? 0); if (!in_array($type, ['url', 'page', 'category', 'home'])) { $type = 'url'; } if ($label === '') { flash('error', 'Bezeichnung ist erforderlich.'); } else { if ($navId) { $stmt = $pdo->prepare('UPDATE navigation SET label=?, type=?, target=?, sort_order=? WHERE id=?'); $stmt->execute([$label, $type, $target, $sortOrder, $navId]); flash('success', 'Navigationspunkt aktualisiert.'); } else { $maxOrder = (int) $pdo->query('SELECT COALESCE(MAX(sort_order),0) FROM navigation')->fetchColumn(); $stmt = $pdo->prepare('INSERT INTO navigation (label, type, target, sort_order) VALUES (?, ?, ?, ?)'); $stmt->execute([$label, $type, $target, $maxOrder + 1]); flash('success', 'Navigationspunkt erstellt.'); } } redirect('/admin/navigation.php'); } } $navItems = $pdo->query('SELECT * FROM navigation ORDER BY sort_order')->fetchAll(); $allPages = $pdo->query("SELECT id, title FROM pages WHERE status='published' ORDER BY title")->fetchAll(); $allCategories = $pdo->query('SELECT id, name FROM categories ORDER BY sort_order, name')->fetchAll(); $editNav = null; if (isset($_GET['edit'])) { $stmt = $pdo->prepare('SELECT * FROM navigation WHERE id = ?'); $stmt->execute([(int) $_GET['edit']]); $editNav = $stmt->fetch(); } $pageTitle = 'Navigation'; $currentPage = 'navigation'; ob_start(); ?>

Abbrechen

Navigationspunkte

Keine Navigationspunkte vorhanden.

function updateTargetField(type) { var input = document.getElementById("targetInput"); var pageSelect = document.getElementById("targetPageSelect"); var catSelect = document.getElementById("targetCatSelect"); input.style.display = "none"; pageSelect.style.display = "none"; catSelect.style.display = "none"; input.name = ""; pageSelect.name = ""; catSelect.name = ""; if (type === "url") { input.style.display = ""; input.name = "target"; } else if (type === "page") { pageSelect.style.display = ""; pageSelect.name = "target"; } else if (type === "category") { catSelect.style.display = ""; catSelect.name = "target"; } else { input.value = ""; input.name = "target"; } } document.addEventListener("DOMContentLoaded", function() { updateTargetField(document.getElementById("type").value); // Drag & Drop Sortierung var tbody = document.getElementById("navBody"); if (!tbody) return; var dragEl = null; tbody.querySelectorAll("tr").forEach(function(row) { row.draggable = true; row.addEventListener("dragstart", function(e) { dragEl = row; row.style.opacity = "0.4"; }); row.addEventListener("dragend", function() { row.style.opacity = "1"; }); row.addEventListener("dragover", function(e) { e.preventDefault(); }); row.addEventListener("drop", function(e) { e.preventDefault(); if (dragEl !== row) { tbody.insertBefore(dragEl, row); saveOrder(); } }); }); function saveOrder() { var ids = []; tbody.querySelectorAll("tr").forEach(function(r) { ids.push(r.dataset.id); }); var formData = new FormData(); formData.append("reorder", JSON.stringify(ids)); formData.append("csrf_token", ""); fetch("/admin/navigation.php", { method: "POST", body: formData, headers: {"X-Requested-With": "XMLHttpRequest"} }); } }); '; include __DIR__ . '/templates/layout.php';