<?php
session_start();
require_once 'config.php';
require_once 'functions.php';
// Укажи здесь свой домен
$domain = SITE_URL;
if (!isLoggedIn()) {
redirect('login.php');
}
$errors = [];
$success = '';
$counter_code = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name']);
$url = trim($_POST['url']);
$description = trim($_POST['description']);
$category_id = (int)$_POST['category_id'];
$user_id = $_SESSION['user_id'];
// Валидация полей формы (существующая)
if (strlen($name) > 20) {
$errors[] = 'Название сайта не должно превышать 20 символов.';
}
if (!filter_var($url, FILTER_VALIDATE_URL)) {
$errors[] = 'Некорректный URL.';
}
if (strlen($description) > 100) {
$errors[] = 'Описание не должно превышать 100 символов.';
}
$stmt = $conn->prepare("SELECT id FROM categories WHERE id = ?");
$stmt->bind_param("i", $category_id);
$stmt->execute();
if ($stmt->get_result()->num_rows === 0) {
$errors[] = 'Выбранная категория не существует.';
}
$stmt->close();
// Проверка существования пользователя
$stmt = $conn->prepare("SELECT id FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
if ($stmt->get_result()->num_rows === 0) {
$errors[] = 'Пользователь не существует.';
}
$stmt->close();
// Проверка на дубликат сайта (по URL и user_id)
$stmt = $conn->prepare("SELECT id FROM sites WHERE url = ? AND user_id = ?");
$stmt->bind_param("si", $url, $user_id);
$stmt->execute();
if ($stmt->get_result()->num_rows > 0) {
$errors[] = 'Вы уже добавили сайт с таким URL.';
}
$stmt->close();
// --- Обработка загрузки файла скриншота ---
$screenshot_uploaded = false;
$screenshot_filename = '';
if (isset($_FILES['screenshot']) && $_FILES['screenshot']['error'] === UPLOAD_ERR_OK) {
$file_tmp_path = $_FILES['screenshot']['tmp_name'];
$file_name = $_FILES['screenshot']['name'];
$file_size = $_FILES['screenshot']['size'];
$file_type = $_FILES['screenshot']['type'];
$file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
// Валидация файла
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$max_file_size = 2 * 1024 * 1024; // 2MB
if (!in_array($file_extension, $allowed_extensions)) {
$errors[] = 'Разрешены только файлы изображений (JPG, JPEG, PNG, GIF).';
}
if ($file_size > $max_file_size) {
$errors[] = 'Размер файла скриншота не должен превышать 2MB.';
}
// Если нет ошибок загрузки файла
if (empty($errors)) {
$screenshot_uploaded = true;
// Временное имя файла (пока нет ID сайта)
$screenshot_filename = uniqid() . '.' . $file_extension;
}
} else {
// Если файл не был загружен или произошла ошибка при загрузке
switch ($_FILES['screenshot']['error']) {
case UPLOAD_ERR_NO_FILE:
$errors[] = 'Не выбран файл скриншота.';
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
$errors[] = 'Размер загруженного файла превысил допустимый лимит.';
break;
default:
$errors[] = 'Ошибка загрузки файла скриншота. Код ошибки: ' . $_FILES['screenshot']['error'];
break;
}
}
// --- Конец обработки загрузки файла ---
// Если нет ошибок (включая ошибки загрузки файла), добавляем сайт
if (empty($errors)) {
$reputation = 0;
$stmt = $conn->prepare("INSERT INTO sites (user_id, name, url, description, category_id, reputation) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("isssii", $user_id, $name, $url, $description, $category_id, $reputation);
if ($stmt->execute()) {
$site_id = $stmt->insert_id;
// --- Сохранение загруженного скриншота ---
if ($screenshot_uploaded) {
// Генерируем конечное имя файла на основе ID сайта
$final_screenshot_filename = $site_id . '.' . $file_extension;
$upload_path = SCREENSHOT_PATH . $final_screenshot_filename;
// Убедимся, что папка для скриншотов существует
if (!is_dir(SCREENSHOT_PATH)) {
mkdir(SCREENSHOT_PATH, 0755, true); // Создаем папку, если её нет
}
// Перемещаем загруженный файл в конечную папку с новым именем
if (move_uploaded_file($file_tmp_path, $upload_path)) {
// Файл успешно загружен и переименован
} else {
// Ошибка перемещения файла (редко, но может быть из-за прав или других проблем)
$errors[] = 'Ошибка при сохранении файла скриншота на сервере.';
// Возможно, стоит удалить добавленную запись сайта, если скриншот не сохранился
// $conn->query("DELETE FROM sites WHERE id = $site_id");
}
} else {
// Если файл не был загружен, но других ошибок не было (не должно произойти при required)
// Здесь можно использовать заглушку, если загрузка файла не обязательна,
// но по вашему запросу файл должен быть загружен.
}
// --- Конец сохранения загруженного скриншота ---
$success = 'Сайт успешно добавлен и отправлен на модерацию.';
// Генерация кода счётчика (сделано кликабельным)
$counter_code = "<a href=\"$domain/site.php?id=$site_id\" target=\"_blank\"><img src=\"$domain/counter-image.php?site_id=$site_id\" alt=\"Счётчик\"></a>";
} else {
$errors[] = 'Ошибка добавления сайта. Попробуйте снова. Код ошибки: ' . $stmt->error;
}
$stmt->close();
}
}
// Получение списка категорий
$categories = [];
$result = $conn->query("SELECT id, name FROM categories ORDER BY name");
while ($row = $result->fetch_assoc()) {
$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>
<?php if ($success): ?>
<div class="alert alert-success"><?php echo escape($success); ?></div>
<?php if ($counter_code): ?>
<h3>Установите счётчик на ваш сайт</h3>
<p>Скопируйте и вставьте этот код в HTML вашего сайта, чтобы отслеживать статистику в реальном времени:</p>
<textarea class="input" readonly rows="3"><?php echo escape($counter_code); ?></textarea>
<button class="btn btn-primary" onclick="copyCounterCodeAddSite()"><i class="fas fa-copy"></i> Копировать</button> <?php endif; ?>
<?php endif; ?>
<?php if (!empty($errors)): ?>
<div class="alert alert-error">
<?php foreach ($errors as $error): ?>
<p><?php echo escape($error); ?></p>
<? endforeach; ?>
</div>
<?php endif; ?>
<form action="add_site.php" method="POST" enctype="multipart/form-data"> <p>
<label for="name">Название (не более 20 символов):</label>
<input type="text" id="name" name="name" class="input" maxlength="20" required value="<?php echo isset($_POST['name']) ? escape($_POST['name']) : ''; ?>"> </p>
<p>
<label for="url">URL:</label>
<input type="url" id="url" name="url" class="input" required value="<?php echo isset($_POST['url']) ? escape($_POST['url']) : ''; ?>"> </p>
<p>
<label for="description">Описание (не более 100 символов):</label>
<textarea id="description" name="description" class="input" maxlength="100" required><?php echo isset($_POST['description']) ? escape($_POST['description']) : ''; ?></textarea> </p>
<p>
<label for="category_id">Категория:</label>
<select id="category_id" name="category_id" class="input" required>
<?php foreach ($categories as $category): ?>
<option value="<?php echo $category['id']; ?>" <?php echo (isset($_POST['category_id']) && $_POST['category_id'] == $category['id']) ? 'selected' : ''; ?>><?php echo escape($category['name']); ?></option> <?php endforeach; ?>
</select>
</p>
<p>
<label for="screenshot">Скриншот сайта (JPG, PNG, GIF, до 2MB):</label>
<input type="file" id="screenshot" name="screenshot" class="input" accept="image/jpeg, image/png, image/gif" required> </p>
<button type="submit" class="btn btn-primary"><i class="fas fa-plus"></i> Добавить</button>
</form>
</div>
<div class="sidebar-right">
<h3>Категории сайтов</h3>
<?php foreach ($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>
// Функция для копирования кода счетчика на странице добавления сайта
function copyCounterCodeAddSite() {
const textarea = document.querySelector('.main-content textarea[readonly]');
textarea.select();
document.execCommand('copy');
alert('Код счетчика скопирован!'); // Простое уведомление
}
</script>
</body>
</html>
<?php
$conn->close();
?>