View file dcms-help.ru/admin.php

File size: 20.49Kb
<?php
session_start();
require_once 'config.php';
require_once 'functions.php';

if (!isLoggedIn() || !isAdmin()) {
    redirect('index.php');
}

// Обработка действий (удаление пользователя, одобрение/удаление сайта, удаление категории)
if (isset($_GET['action']) && isAdmin()) {
    $action = $_GET['action'];
    $id = isset($_GET['id']) ? (int)$_GET['id'] : 0;

    switch ($action) {
        case 'delete_user':
            if ($id > 0) {
                // Перед удалением пользователя, можно переназначить его сайты
                // или удалить их. В этом примере просто удаляем пользователя.
                $conn->query("DELETE FROM users WHERE id = $id");
            }
            break;
        case 'approve_site':
            if ($id > 0) {
                $conn->query("UPDATE sites SET approved = 1 WHERE id = $id");
            }
            break;
        case 'delete_site':
            if ($id > 0) {
                // Удаляем связанные данные
                $conn->query("DELETE FROM stats WHERE site_id = $id");
                $conn->query("DELETE FROM reviews WHERE site_id = $id");
                // Удаляем записи stats_visitors, связанные со stats для этого сайта
                $conn->query("DELETE sv FROM stats_visitors sv JOIN stats s ON sv.stat_id = s.id WHERE s.site_id = $id");

                $conn->query("DELETE FROM sites WHERE id = $id");
                // Удаляем скриншот, если он существует
                $screenshot_path = SCREENSHOT_PATH . $id . '.png';
                if (file_exists($screenshot_path)) {
                    unlink($screenshot_path);
                }
            }
            break;
         case 'add_category':
             if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['category_name'])) {
                 $category_name = trim($_POST['category_name']);
                 if (!empty($category_name)) {
                     $stmt = $conn->prepare("INSERT INTO categories (name) VALUES (?)");
                     $stmt->bind_param("s", $category_name);
                     $stmt->execute();
                     $stmt->close();
                 }
             }
             break;
        case 'edit_category':
             if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['category_name']) && $id > 0) {
                 $category_name = trim($_POST['category_name']);
                 if (!empty($category_name)) {
                     $stmt = $conn->prepare("UPDATE categories SET name = ? WHERE id = ?");
                     $stmt->bind_param("si", $category_name, $id);
                     $stmt->execute();
                     $stmt->close();
                 }
             }
             break;
        case 'delete_category':
            if ($id > 0) {
                // Перед удалением категории, нужно решить, что делать с сайтами в этой категории
                // В этом примере, сайты останутся без категории (можно добавить NULL) или должны быть переназначены.
                // Простой вариант: удалить сайты в этой категории (если CASCADE DELETE настроен в БД) или установить category_id в NULL
                 $conn->query("UPDATE sites SET category_id = NULL WHERE category_id = $id"); // Устанавливаем категорию в NULL
                 $conn->query("DELETE FROM categories WHERE id = $id"); // Удаляем категорию
            }
            break;
    }

    // Перенаправление обратно в админку после действия, сохраняя активную вкладку
    $active_tab = isset($_POST['active_tab']) ? $_POST['active_tab'] : (isset($_GET['tab']) ? $_GET['tab'] : 'users'); // Получаем активную вкладку
    redirect("admin.php?tab=" . urlencode($active_tab)); // Перенаправляем с параметром вкладки
}

// Получение данных для вкладок
// Пользователи
$users = [];
$result = $conn->query("SELECT id, login, email, created_at, role FROM users ORDER BY created_at DESC");
while ($row = $result->fetch_assoc()) {
    $users[] = $row;
}

// Сайты на модерации
$pending_sites = [];
$result = $conn->query("SELECT s.id, s.name, s.url, s.description, u.login AS user_login, c.name AS category_name
                       FROM sites s
                       JOIN users u ON s.user_id = u.id
                       JOIN categories c ON s.category_id = c.id
                       WHERE s.approved = 0
                       ORDER BY s.id ASC");
while ($row = $result->fetch_assoc()) {
    $pending_sites[] = $row;
}

// Все сайты (одобренные)
$approved_sites = [];
$result = $conn->query("SELECT s.id, s.name, s.url, s.description, u.login AS user_login, c.name AS category_name
                       FROM sites s
                       JOIN users u ON s.user_id = u.id
                       JOIN categories c ON s.category_id = c.id
                       WHERE s.approved = 1
                       ORDER BY s.id ASC");
while ($row = $result->fetch_assoc()) {
    $approved_sites[] = $row;
}

// Категории
$categories = [];
$result = $conn->query("SELECT id, name FROM categories ORDER BY name");
while ($row = $result->fetch_assoc()) {
    $categories[] = $row;
}

// Получение данных для редактирования категории, если запрошено
$edit_category = null;
if (isset($_GET['action']) && $_GET['action'] === 'edit_category' && isset($_GET['id'])) {
    $category_id_to_edit = (int)$_GET['id'];
    $stmt = $conn->prepare("SELECT id, name FROM categories WHERE id = ?");
    $stmt->bind_param("i", $category_id_to_edit);
    $stmt->execute();
    $edit_category = $stmt->get_result()->fetch_assoc();
    $stmt->close();
}


// Получение списка категорий для правого сайдбара (если нужно)
$sidebar_categories = [];
$result = $conn->query("SELECT id, name FROM categories ORDER BY name");
while ($row = $result->fetch_assoc()) {
    $sidebar_categories[] = $row;
}
?>

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Админ-панель - Toppyc.ru</title>
    <link rel="stylesheet" href="styles.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> </head>
<body>
    <div class="container">
        <?php include 'sidebar_left.php'; ?>

        <div class="main-content">
            <h2>Админ-панель</h2>

            <div class="tab-container">
                <div class="tab" data-tab="users"><i class="fas fa-users"></i> Пользователи</div> <div class="tab" data-tab="pending-sites"><i class="fas fa-hourglass-half"></i> Модерация сайтов</div> <div class="tab" data-tab="approved-sites"><i class="fas fa-check-circle"></i> Одобренные сайты</div> <div class="tab" data-tab="categories"><i class="fas fa-tags"></i> Категории</div> </div>

            <div id="users-content" class="tab-content"> <h3>Список пользователей</h3>
                 <table>
                    <thead>
                        <tr>
                            <th>ID</th>
                            <th>Логин</th>
                            <th>Email</th>
                            <th>Дата регистрации</th>
                            <th>Роль</th>
                            <th>Действия</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($users as $user_item): ?>
                            <tr>
                                <td><?php echo $user_item['id']; ?></td>
                                <td><?php echo escape($user_item['login']); ?></td>
                                <td><?php echo escape($user_item['email']); ?></td>
                                <td><?php echo $user_item['created_at']; ?></td>
                                <td><?php echo escape($user_item['role']); ?></td>
                                <td>
                                    <?php if ($user_item['id'] !== $_SESSION['user_id']): // Нельзя удалить самого себя ?>
                                        <a href="admin.php?action=delete_user&id=<?php echo $user_item['id']; ?>" class="btn btn-danger btn-small" onclick="return confirm('Вы уверены, что хотите удалить пользователя <?php echo escape($user_item['login']); ?>?');"><i class="fas fa-trash-alt"></i> Удалить</a>
                                    <?php else: ?>
                                         <span style="color: #999;">(Вы)</span>
                                    <?php endif; ?>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <div id="pending-sites-content" class="tab-content"> <h3>Сайты на модерации</h3>
                 <?php if (empty($pending_sites)): ?>
                     <p>Нет сайтов на модерации.</p>
                 <?php else: ?>
                    <table>
                       <thead>
                           <tr>
                               <th>ID</th>
                               <th>Название</th>
                               <th>URL</th>
                               <th>Пользователь</th>
                               <th>Категория</th>
                               <th>Действия</th>
                           </tr>
                       </thead>
                       <tbody>
                           <?php foreach ($pending_sites as $site): ?>
                               <tr>
                                   <td><?php echo $site['id']; ?></td>
                                   <td><a href="site.php?id=<?php echo $site['id']; ?>" target="_blank"><?php echo escape($site['name']); ?></a></td>
                                   <td><a href="<?php echo escape($site['url']); ?>" target="_blank"><?php echo escape($site['url']); ?></a></td>
                                   <td><?php echo escape($site['user_login']); ?></td>
                                   <td><?php echo escape($site['category_name']); ?></td>
                                   <td>
                                       <a href="admin.php?action=approve_site&id=<?php echo $site['id']; ?>" class="btn btn-success btn-small"><i class="fas fa-check"></i> Одобрить</a>
                                       <a href="admin.php?action=delete_site&id=<?php echo $site['id']; ?>" class="btn btn-danger btn-small" onclick="return confirm('Вы уверены, что хотите удалить сайт <?php echo escape($site['name']); ?>?');"><i class="fas fa-trash-alt"></i> Удалить</a>
                                   </td>
                               </tr>
                           <?php endforeach; ?>
                       </tbody>
                   </table>
                 <?php endif; ?>
            </div>

             <div id="approved-sites-content" class="tab-content"> <h3>Одобренные сайты</h3>
                 <?php if (empty($approved_sites)): ?>
                     <p>Нет одобренных сайтов.</p>
                 <?php else: ?>
                    <table>
                       <thead>
                           <tr>
                               <th>ID</th>
                               <th>Название</th>
                               <th>URL</th>
                               <th>Пользователь</th>
                               <th>Категория</th>
                               <th>Действия</th>
                           </tr>
                       </thead>
                       <tbody>
                           <?php foreach ($approved_sites as $site): ?>
                               <tr>
                                   <td><?php echo $site['id']; ?></td>
                                   <td><a href="site.php?id=<?php echo $site['id']; ?>" target="_blank"><?php echo escape($site['name']); ?></a></td>
                                   <td><a href="<?php echo escape($site['url']); ?>" target="_blank"><?php echo escape($site['url']); ?></a></td>
                                   <td><?php echo escape($site['user_login']); ?></td>
                                   <td><?php echo escape($site['category_name']); ?></td>
                                   <td>
                                        <a href="site.php?id=<?php echo $site['id']; ?>" class="btn btn-info btn-small"><i class="fas fa-chart-line"></i> Статистика</a>
                                       <a href="admin.php?action=delete_site&id=<?php echo $site['id']; ?>" class="btn btn-danger btn-small" onclick="return confirm('Вы уверены, что хотите удалить сайт <?php echo escape($site['name']); ?>?');"><i class="fas fa-trash-alt"></i> Удалить</a>
                                   </td>
                               </tr>
                           <?php endforeach; ?>
                       </tbody>
                   </table>
                 <?php endif; ?>
            </div>

             <div id="categories-content" class="tab-content"> <h3>Управление категориями</h3>
                 <?php if ($edit_category): ?>
                    <h4>Редактировать категорию: <?php echo escape($edit_category['name']); ?></h4>
                     <form action="admin.php?action=edit_category&id=<?php echo $edit_category['id']; ?>" method="POST">
                         <p>
                             <label for="category_name">Название категории:</label>
                             <input type="text" id="category_name" name="category_name" class="input" value="<?php echo escape($edit_category['name']); ?>" required>
                         </p>
                         <button type="submit" class="btn btn-primary"><i class="fas fa-save"></i> Сохранить</button>
                          <a href="admin.php?tab=categories" class="btn btn-secondary"><i class="fas fa-times"></i> Отмена</a> <input type="hidden" name="active_tab" value="categories"> </form>
                 <?php else: ?>
                     <h4>Добавить новую категорию</h4>
                     <form action="admin.php?action=add_category" method="POST">
                         <p>
                             <label for="category_name">Название категории:</label>
                             <input type="text" id="category_name" name="category_name" class="input" required>
                         </p>
                         <button type="submit" class="btn btn-primary"><i class="fas fa-plus"></i> Добавить</button>
                         <input type="hidden" name="active_tab" value="categories"> </form>
                 <?php endif; ?>

                <h4 style="margin-top: 30px; padding-top: 20px;">Существующие категории</h4>
                <?php if (empty($categories)): ?>
                    <p>Категорий пока нет.</p>
                <?php else: ?>
                    <table>
                        <thead>
                            <tr>
                                <th>ID</th>
                                <th>Название</th>
                                <th>Действия</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($categories as $category): ?>
                                <tr>
                                    <td><?php echo $category['id']; ?></td>
                                    <td><?php echo escape($category['name']); ?></td>
                                    <td>
                                        <a href="admin.php?action=edit_category&id=<?php echo $category['id']; ?>&tab=categories" class="btn btn-info btn-small"><i class="fas fa-edit"></i> Изменить</a> <?php if ($conn->query("SELECT COUNT(*) FROM sites WHERE category_id = {$category['id']}")->fetch_row()[0] == 0): // Проверка, есть ли сайты в категории ?>
                                             <a href="admin.php?action=delete_category&id=<?php echo $category['id']; ?>" class="btn btn-danger btn-small" onclick="return confirm('Вы уверены, что хотите удалить категорию «<?php echo escape($category['name']); ?>»?');"><i class="fas fa-trash-alt"></i> Удалить</a>
                                        <?php else: ?>
                                             <span style="color: #999; font-size: 12px;">(Есть сайты)</span>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                <?php endif; ?>
            </div>


        </div>

        <div class="sidebar-right">
            <h3>Категории сайтов</h3>
            <?php foreach ($sidebar_categories as $category): ?>
                <a href="category.php?id=<?php echo $category['id']; ?>"><i class="fas fa-folder"></i> <?php echo escape($category['name']); ?></a>
            <?php endforeach; ?>
        </div>
    </div>

     <script>
        document.addEventListener('DOMContentLoaded', function() {
            const tabs = document.querySelectorAll('.tab-container .tab');
            const tabContents = document.querySelectorAll('.main-content .tab-content');

             // Функция для переключения вкладок
            function activateTab(tabId) {
                tabs.forEach(tab => {
                    tab.classList.remove('active');
                });
                tabContents.forEach(content => {
                    // Скрываем все блоки содержимого
                    content.classList.remove('active');
                     content.style.display = 'none'; // Явно скрываем
                });

                const activeTab = document.querySelector(`.tab[data-tab="${tabId}"]`);
                const activeContent = document.getElementById(`${tabId}-content`);

                if (activeTab) {
                    activeTab.classList.add('active');
                }
                if (activeContent) {
                    activeContent.classList.add('active');
                    activeContent.style.display = 'block'; // Явно показываем
                }

                // Сохраняем активную вкладку в localStorage
                localStorage.setItem('activeAdminTab', tabId); // Уникальный ключ для админки
            }

            // Восстановление активной вкладки при загрузке
            // Проверяем, есть ли параметр 'tab' в URL (после действия)
            const urlParams = new URLSearchParams(window.location.search);
            const tabFromUrl = urlParams.get('tab');

            const initialTab = tabFromUrl || localStorage.getItem('activeAdminTab') || 'users'; // Приоритет: URL > localStorage > default
            activateTab(initialTab);


            // Назначаем обработчики кликов на табы
            tabs.forEach(tab => {
                tab.addEventListener('click', function() {
                    const tabId = this.getAttribute('data-tab');
                    activateTab(tabId);
                });
            });

             // Если мы на странице редактирования категории, переключаемся на вкладку категорий
             <?php if ($edit_category): ?>
             activateTab('categories');
             <?php endif; ?>
        });
    </script>
</body>
</html>

<?php
$conn->close();
?>