500 lines
20 KiB
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>
|