cms/admin/menus.php

500 lines
20 KiB
PHP

<?php
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/functions.php';
requireLogin();
$message = '';
$db = getDB();
// Obsługa akcji
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['action'])) {
switch ($_POST['action']) {
case 'create_menu':
$stmt = $db->prepare("INSERT INTO menus (name, location) VALUES (?, ?)");
if ($stmt->execute([$_POST['name'], $_POST['location']])) {
$message = 'Menu zostało utworzone';
logActivity('menu_created', 'menu', $db->lastInsertId());
}
break;
case 'delete_menu':
$stmt = $db->prepare("DELETE FROM menus WHERE id = ?");
if ($stmt->execute([$_POST['menu_id']])) {
$message = 'Menu zostało usunięte';
logActivity('menu_deleted', 'menu', $_POST['menu_id']);
}
break;
case 'add_menu_item':
$stmt = $db->prepare("
INSERT INTO menu_items (menu_id, title, url, page_id, parent_id, sort_order, target, css_class)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
");
$pageId = !empty($_POST['page_id']) ? $_POST['page_id'] : null;
$parentId = !empty($_POST['parent_id']) ? $_POST['parent_id'] : null;
if ($stmt->execute([
$_POST['menu_id'],
$_POST['title'],
$_POST['url'],
$pageId,
$parentId,
$_POST['sort_order'] ?? 0,
$_POST['target'] ?? '_self',
$_POST['css_class'] ?? ''
])) {
$message = 'Element menu został dodany';
logActivity('menu_item_created', 'menu_item', $db->lastInsertId());
}
break;
case 'delete_menu_item':
$stmt = $db->prepare("DELETE FROM menu_items WHERE id = ?");
if ($stmt->execute([$_POST['item_id']])) {
$message = 'Element menu został usunięty';
logActivity('menu_item_deleted', 'menu_item', $_POST['item_id']);
}
break;
}
}
}
// Pobierz wszystkie menu
$menus = $db->query("SELECT * FROM menus ORDER BY name")->fetchAll();
// Pobierz wszystkie strony do wyboru
$pages = $db->query("SELECT id, title FROM pages WHERE status = 'published' ORDER BY title")->fetchAll();
// Wybrane menu do edycji
$selectedMenuId = $_GET['menu_id'] ?? ($menus[0]['id'] ?? null);
$menuItems = [];
if ($selectedMenuId) {
$stmt = $db->prepare("
SELECT mi.*, p.title as page_title
FROM menu_items mi
LEFT JOIN pages p ON mi.page_id = p.id
WHERE mi.menu_id = ?
ORDER BY mi.sort_order, mi.id
");
$stmt->execute([$selectedMenuId]);
$menuItems = $stmt->fetchAll();
}
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zarządzanie menu - Panel CMS</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: #f5f5f5;
}
.header {
background: #2c3e50;
color: white;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
height: 60px;
}
.sidebar {
position: fixed;
left: 0;
top: 60px;
width: 250px;
background: white;
height: calc(100vh - 60px);
border-right: 1px solid #e0e0e0;
overflow-y: auto;
}
.sidebar nav a {
display: block;
padding: 15px 20px;
color: #333;
text-decoration: none;
border-left: 3px solid transparent;
}
.sidebar nav a:hover, .sidebar nav a.active {
background: #f0f4ff;
border-left-color: #667eea;
color: #667eea;
}
.main-content {
margin-left: 250px;
padding: 30px;
}
.btn {
display: inline-block;
padding: 10px 20px;
background: #667eea;
color: white;
text-decoration: none;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 14px;
}
.btn:hover { background: #5568d3; }
.btn-sm { padding: 6px 12px; font-size: 13px; }
.btn-danger { background: #e74c3c; }
.btn-danger:hover { background: #c0392b; }
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
margin-bottom: 20px;
}
.card-header {
padding: 20px;
border-bottom: 1px solid #e0e0e0;
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body { padding: 20px; }
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-weight: 500;
color: #333;
}
.form-group input, .form-group select {
width: 100%;
padding: 10px;
border: 2px solid #e1e8ed;
border-radius: 5px;
font-size: 14px;
}
.form-group small {
display: block;
margin-top: 5px;
color: #666;
font-size: 13px;
}
table {
width: 100%;
border-collapse: collapse;
}
table th, table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #e0e0e0;
}
table th {
background: #f8f9fa;
font-weight: 600;
}
.message {
padding: 12px 20px;
background: #d4edda;
color: #155724;
border-radius: 5px;
margin-bottom: 20px;
}
.menu-tabs {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
.menu-tab {
padding: 10px 20px;
background: white;
border: 2px solid #e0e0e0;
border-radius: 5px;
cursor: pointer;
transition: all 0.3s;
}
.menu-tab.active {
background: #667eea;
color: white;
border-color: #667eea;
}
.menu-tab:hover {
border-color: #667eea;
}
.grid-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.menu-item-row {
background: #f8f9fa;
padding: 10px;
margin-bottom: 5px;
border-radius: 5px;
display: flex;
justify-content: space-between;
align-items: center;
}
.menu-item-row.child {
margin-left: 30px;
background: #e9ecef;
}
</style>
</head>
<body>
<div class="header">
<h1>Panel CMS</h1>
<a href="index.php" class="btn btn-sm">← Powrót</a>
</div>
<div class="sidebar">
<nav>
<a href="index.php">📊 Dashboard</a>
<a href="pages.php">📄 Strony</a>
<a href="media.php">🖼️ Media</a>
<a href="menus.php" class="active">🔗 Menu</a>
<a href="categories.php">📁 Kategorie</a>
<?php if (hasRole('admin')): ?>
<a href="users.php">👥 Użytkownicy</a>
<a href="settings.php">⚙️ Ustawienia</a>
<?php endif; ?>
</nav>
</div>
<div class="main-content">
<h1 style="margin-bottom: 30px;">Zarządzanie menu</h1>
<?php if ($message): ?>
<div class="message"><?php echo escape($message); ?></div>
<?php endif; ?>
<!-- Tworzenie nowego menu -->
<div class="card">
<div class="card-header">
<h2>Utwórz nowe menu</h2>
</div>
<div class="card-body">
<form method="POST">
<input type="hidden" name="action" value="create_menu">
<div class="grid-2">
<div class="form-group">
<label>Nazwa menu</label>
<input type="text" name="name" required placeholder="np. Menu główne">
</div>
<div class="form-group">
<label>Lokalizacja</label>
<select name="location" required>
<option value="header">Nagłówek (header)</option>
<option value="footer">Stopka (footer)</option>
<option value="sidebar">Pasek boczny (sidebar)</option>
<option value="mobile">Menu mobilne (mobile)</option>
</select>
</div>
</div>
<button type="submit" class="btn">Utwórz menu</button>
</form>
</div>
</div>
<?php if (!empty($menus)): ?>
<!-- Zakładki menu -->
<div class="menu-tabs">
<?php foreach ($menus as $menu): ?>
<a href="?menu_id=<?php echo $menu['id']; ?>"
class="menu-tab <?php echo $selectedMenuId == $menu['id'] ? 'active' : ''; ?>">
<?php echo escape($menu['name']); ?> (<?php echo escape($menu['location']); ?>)
</a>
<?php endforeach; ?>
</div>
<?php if ($selectedMenuId): ?>
<!-- Dodawanie elementu menu -->
<div class="card">
<div class="card-header">
<h2>Dodaj element do menu</h2>
</div>
<div class="card-body">
<form method="POST">
<input type="hidden" name="action" value="add_menu_item">
<input type="hidden" name="menu_id" value="<?php echo $selectedMenuId; ?>">
<div class="grid-2">
<div class="form-group">
<label>Tytuł</label>
<input type="text" name="title" required placeholder="Tekst wyświetlany w menu">
</div>
<div class="form-group">
<label>Link do strony</label>
<select name="page_id">
<option value="">-- Wybierz stronę lub podaj URL --</option>
<?php foreach ($pages as $page): ?>
<option value="<?php echo $page['id']; ?>">
<?php echo escape($page['title']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="grid-2">
<div class="form-group">
<label>Własny URL (opcjonalnie)</label>
<input type="text" name="url" placeholder="https://example.com">
<small>Zostaw puste jeśli wybrano stronę powyżej</small>
</div>
<div class="form-group">
<label>Element nadrzędny</label>
<select name="parent_id">
<option value="">-- Brak (element główny) --</option>
<?php foreach ($menuItems as $item): ?>
<?php if (!$item['parent_id']): ?>
<option value="<?php echo $item['id']; ?>">
<?php echo escape($item['title']); ?>
</option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="grid-2">
<div class="form-group">
<label>Kolejność</label>
<input type="number" name="sort_order" value="0" min="0">
</div>
<div class="form-group">
<label>Cel otwarcia</label>
<select name="target">
<option value="_self">Ta sama karta</option>
<option value="_blank">Nowa karta</option>
</select>
</div>
</div>
<button type="submit" class="btn">Dodaj element</button>
</form>
</div>
</div>
<!-- Lista elementów menu -->
<div class="card">
<div class="card-header">
<h2>Elementy menu</h2>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="delete_menu">
<input type="hidden" name="menu_id" value="<?php echo $selectedMenuId; ?>">
<button type="submit" class="btn btn-sm btn-danger"
onclick="return confirm('Czy na pewno chcesz usunąć to menu i wszystkie jego elementy?')">
Usuń całe menu
</button>
</form>
</div>
<div class="card-body">
<?php if (empty($menuItems)): ?>
<p style="color: #999; text-align: center; padding: 20px;">
To menu nie ma jeszcze żadnych elementów
</p>
<?php else: ?>
<?php
// Najpierw wyświetl elementy główne
foreach ($menuItems as $item):
if ($item['parent_id']) continue;
?>
<div class="menu-item-row">
<div>
<strong><?php echo escape($item['title']); ?></strong><br>
<small style="color: #666;">
<?php if ($item['page_id']): ?>
Strona: <?php echo escape($item['page_title']); ?>
<?php else: ?>
URL: <?php echo escape($item['url']); ?>
<?php endif; ?>
| Kolejność: <?php echo $item['sort_order']; ?>
</small>
</div>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="delete_menu_item">
<input type="hidden" name="item_id" value="<?php echo $item['id']; ?>">
<button type="submit" class="btn btn-sm btn-danger"
onclick="return confirm('Usunąć ten element?')">
Usuń
</button>
</form>
</div>
<?php
// Wyświetl elementy podrzędne
foreach ($menuItems as $child):
if ($child['parent_id'] == $item['id']):
?>
<div class="menu-item-row child">
<div>
↳ <strong><?php echo escape($child['title']); ?></strong><br>
<small style="color: #666;">
<?php if ($child['page_id']): ?>
Strona: <?php echo escape($child['page_title']); ?>
<?php else: ?>
URL: <?php echo escape($child['url']); ?>
<?php endif; ?>
</small>
</div>
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="delete_menu_item">
<input type="hidden" name="item_id" value="<?php echo $child['id']; ?>">
<button type="submit" class="btn btn-sm btn-danger"
onclick="return confirm('Usunąć ten element?')">
Usuń
</button>
</form>
</div>
<?php
endif;
endforeach;
?>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
<?php else: ?>
<div class="card">
<div class="card-body" style="text-align: center; padding: 40px; color: #999;">
Nie masz jeszcze żadnych menu. Utwórz pierwsze menu powyżej.
</div>
</div>
<?php endif; ?>
</div>
</body>
</html>