Files
web_work/public/includes/functions.php
kirill.khorkov 29b9aaac50 Исправление багов авторизации, корзины и админки
- Исправлено выпадающее меню профиля (hover-баг с margin-top)
- Исправлена авторизация: правильные пути к API (api/auth.php)
- Исправлены ссылки на админку (admin/index.php вместо admin_panel.php)
- Исправлены пути API корзины в catalog.php и checkout.php
- Добавлена форма добавления/редактирования товаров в админке
- Исправлены кнопки +/- в корзине (улучшена обработка AJAX)
- Исправлена регистрация: правильные пути и обработка boolean в PostgreSQL
- Добавлена миграция для назначения прав админа пользователю admin@mail.ru
- Удален тестовый блок 'Быстрый вход' для неавторизованных пользователей
- Улучшена обработка ошибок во всех API-эндпоинтах
2025-12-16 02:58:44 +03:00

141 lines
4.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Общие функции для AETERNA
*/
/**
* Проверка авторизации пользователя
*/
function isLoggedIn(): bool {
return isset($_SESSION['isLoggedIn']) && $_SESSION['isLoggedIn'] === true;
}
/**
* Проверка прав администратора
*/
function isAdmin(): bool {
return isset($_SESSION['isAdmin']) && $_SESSION['isAdmin'] === true;
}
/**
* Требовать авторизацию - редирект на login если не авторизован
*/
function requireAuth(string $redirectUrl = 'login.php'): void {
if (!isLoggedIn()) {
header('Location: ' . $redirectUrl . '?error=auth_required&redirect=' . urlencode($_SERVER['REQUEST_URI']));
exit();
}
}
/**
* Требовать права администратора
*/
function requireAdmin(string $redirectUrl = 'login.php'): void {
if (!isAdmin()) {
header('Location: ' . $redirectUrl . '?error=admin_required');
exit();
}
}
/**
* Получить текущего пользователя
*/
function getCurrentUser(): ?array {
if (!isLoggedIn()) {
return null;
}
return [
'user_id' => $_SESSION['user_id'] ?? 0,
'email' => $_SESSION['user_email'] ?? '',
'full_name' => $_SESSION['full_name'] ?? '',
'is_admin' => isAdmin()
];
}
/**
* Форматирование цены
*/
function formatPrice(float $price): string {
return number_format($price, 0, '', ' ') . ' ₽';
}
/**
* Безопасный вывод HTML
*/
function e(string $str): string {
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
/**
* Генерация номера заказа
*/
function generateOrderNumber(): string {
return 'AET-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6));
}
/**
* Генерация SKU для товара
*/
function generateSKU(string $productName): string {
$prefix = strtoupper(substr(preg_replace('/[^a-zA-Z0-9]/', '', transliterate($productName)), 0, 6));
return $prefix . '-' . rand(100, 999);
}
/**
* Транслитерация кириллицы в латиницу
*/
function transliterate(string $str): string {
$converter = [
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i',
'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n',
'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't',
'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D',
'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I',
'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N',
'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T',
'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch',
'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '',
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
];
return strtr($str, $converter);
}
/**
* Создание slug из строки
*/
function createSlug(string $str): string {
$slug = transliterate($str);
$slug = strtolower($slug);
$slug = preg_replace('/[^a-z0-9]+/', '-', $slug);
$slug = trim($slug, '-');
return $slug;
}
/**
* Показать flash-сообщение
*/
function setFlashMessage(string $type, string $message): void {
$_SESSION['flash_message'] = [
'type' => $type,
'message' => $message
];
}
/**
* Получить и удалить flash-сообщение
*/
function getFlashMessage(): ?array {
if (isset($_SESSION['flash_message'])) {
$message = $_SESSION['flash_message'];
unset($_SESSION['flash_message']);
return $message;
}
return null;
}