View file test.4imas.ru/public/register.php

File size: 6.45Kb
<?php
// =========================
// public/register.php
// Страница регистрации пользователя
// =========================

require_once __DIR__ . '/../config/bootstrap.php';
require_once __DIR__ . '/../config/auth.php';
require_once __DIR__ . '/../config/functions.php';

// Если пользователь уже авторизован, редирект на профиль
if (is_logged_in()) {
    redirect('/profile.php');
}

$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Проверка CSRF
    $csrf_token = $_POST['csrf_token'] ?? '';
    if (!check_csrf($csrf_token)) {
        $errors[] = 'Ошибка безопасности. Попробуйте снова.';
    } else {
        // Получаем данные
        $name = trim($_POST['name'] ?? '');
        $email = trim($_POST['email'] ?? '');
        $password = $_POST['password'] ?? '';
        $confirm_password = $_POST['confirm_password'] ?? '';

        // Валидация
        if (empty($name) || empty($email) || empty($password) || empty($confirm_password)) {
            $errors[] = 'Заполните все поля.';
        } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors[] = 'Введите корректный email.';
        } elseif ($password !== $confirm_password) {
            $errors[] = 'Пароли не совпадают.';
        } elseif (strlen($password) < 6) {
            $errors[] = 'Пароль должен быть не менее 6 символов.';
        } else {
            // Регистрация пользователя
            $res = register_user($name, $email, $password);
            if ($res['success']) {
                // Автовход после регистрации
                login_user($email, $password);
                redirect('/profile.php');
            } else {
                $errors[] = $res['error'] ?? 'Ошибка регистрации';
            }
        }
    }
}

// Подключаем header
include __DIR__ . '/../includes/header.php';
?>

<div class="container py-5">
    <div class="row justify-content-center">
        <div class="col-md-6 col-lg-5">
            <div class="card shadow-sm border-0 animate__animated animate__fadeInDown">
                <div class="card-body p-4">
                    <h3 class="card-title mb-4 text-center fw-bold">Регистрация в PhotoPrint</h3>

                    <?php
                    // Вывод ошибок
                    if ($errors) {
                        foreach ($errors as $error) {
                            echo '<div class="alert alert-danger mb-2">' . e($error) . '</div>';
                        }
                    }
                    ?>

                    <form method="POST" class="needs-validation" novalidate>
                        <!-- CSRF токен -->
                        <input type="hidden" name="csrf_token" value="<?= e($_SESSION['csrf_token'] ?? '') ?>">

                        <div class="mb-3">
                            <label for="name" class="form-label">Имя</label>
                            <input type="text" class="form-control" id="name" name="name" required 
                                   value="<?= e($_POST['name'] ?? '') ?>">
                            <div class="invalid-feedback">
                                Введите имя
                            </div>
                        </div>

                        <div class="mb-3">
                            <label for="email" class="form-label">Email</label>
                            <input type="email" class="form-control" id="email" name="email" required 
                                   value="<?= e($_POST['email'] ?? '') ?>">
                            <div class="invalid-feedback">
                                Введите корректный email
                            </div>
                        </div>

                        <div class="mb-3">
                            <label for="password" class="form-label">Пароль</label>
                            <input type="password" class="form-control" id="password" name="password" required
                                   minlength="6">
                            <div class="invalid-feedback">
                                Пароль должен быть не менее 6 символов
                            </div>
                        </div>

                        <div class="mb-3">
                            <label for="confirm_password" class="form-label">Повторите пароль</label>
                            <input type="password" class="form-control" id="confirm_password" name="confirm_password" required>
                            <div class="invalid-feedback">
                                Повторите пароль
                            </div>
                        </div>

                        <button type="submit" class="btn btn-primary w-100 mt-3">Зарегистрироваться</button>
                    </form>

                    <div class="text-center mt-3">
                        <small>Уже есть аккаунт? <a href="/login.php">Войти</a></small>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<script>
// Валидация формы на клиенте
document.addEventListener('DOMContentLoaded', function() {
    const forms = document.querySelectorAll('.needs-validation');
    
    Array.from(forms).forEach(form => {
        form.addEventListener('submit', event => {
            if (!form.checkValidity()) {
                event.preventDefault();
                event.stopPropagation();
            }
            
            // Проверка совпадения паролей
            const password = document.getElementById('password');
            const confirmPassword = document.getElementById('confirm_password');
            
            if (password.value !== confirmPassword.value) {
                confirmPassword.setCustomValidity('Пароли не совпадают');
                event.preventDefault();
                event.stopPropagation();
            } else {
                confirmPassword.setCustomValidity('');
            }
            
            form.classList.add('was-validated');
        }, false);
    });
});
</script>

<?php
// Подключаем footer
include __DIR__ . '/../includes/footer.php';
?>