/
Francuz
/
DailyPort
Обзор
Документация
Войти
/
Francuz
/
DailyPort
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/Link.php
158 строк
6 KB
Francuz
docs: подробные комментарии ко всем PHP-файлам проекта
15 июн 2026, 08:08
15 июн 2026, 08:08
594585d
Код
Авторство
О чём код?
<?php /** * Класс Link — модель ссылки. * * Управляет ссылками, которые отображаются на страницах типа "database". * Каждая ссылка привязана к странице через поле page (slug). * * Поддерживает: * - получение ссылок по странице * - CRUD операции (создание, чтение, обновление, удаление) * - загрузку иконок * - изменение порядка сортировки (drag-and-drop) * - архивирование при удалении (soft delete через Archive) */ class Link { /** @var Database Подключение к БД */ private Database $db; public function __construct(Database $db) { $this->db = $db; } /** * Получить все ссылки для указанной страницы. * * @param string $pageSlug Slug страницы (home, hosts, useful и т.д.) * @return array Массив ссылок, отсортированных по sort_order */ public function getByPage(string $page): array { $page = $this->db->escape($page); $result = $this->db->query("SELECT * FROM links WHERE page = '$page' ORDER BY sort_order ASC, id ASC"); return $result->fetch_all(MYSQLI_ASSOC); } /** * Получить все ссылки (для админки). * * @return array Массив всех ссылок, сгруппированных по странице */ public function all(): array { $result = $this->db->query("SELECT * FROM links ORDER BY page, sort_order ASC, id ASC"); return $result->fetch_all(MYSQLI_ASSOC); } /** * Найти ссылку по ID. * * @param int $id ID ссылки * @return array|null Данные ссылки или null */ public function find(int $id): ?array { $id = $this->db->escape((string)$id); $result = $this->db->query("SELECT * FROM links WHERE id = $id"); return $result->fetch_assoc() ?: null; } /** * Создать новую ссылку. * * Автоматически вычисляет sort_order как MAX(sort_order) + 1 для страницы. * * @param string $page Slug страницы * @param string $title Название ссылки * @param string $url URL ссылки * @return int ID созданной ссылки */ public function create(string $page, string $title, string $url): int { $page = $this->db->escape($page); $title = $this->db->escape($title); $url = $this->db->escape($url); // Вычисляем следующий порядок сортировки $maxOrder = $this->db->query("SELECT COALESCE(MAX(sort_order), 0) + 1 AS next_order FROM links WHERE page = '$page'")->fetch_assoc(); $order = $maxOrder['next_order']; $this->db->query("INSERT INTO links (page, title, url, sort_order) VALUES ('$page', '$title', '$url', $order)"); return (int)$this->db->query("SELECT LAST_INSERT_ID() AS id")->fetch_assoc()['id']; } /** * Обновить название и URL ссылки. * * @param int $id ID ссылки * @param string $title Новое название * @param string $url Новый URL * @return bool */ public function update(int $id, string $title, string $url): bool { $id = $this->db->escape((string)$id); $title = $this->db->escape($title); $url = $this->db->escape($url); $this->db->query("UPDATE links SET title = '$title', url = '$url' WHERE id = $id"); return true; } /** * Обновить путь к иконке ссылки. * * @param int $id ID ссылки * @param string $iconPath Путь к файлу иконки (/uploads/icons/icon_1_123.png) * @return bool */ public function updateIcon(int $id, string $iconPath): bool { $id = $this->db->escape((string)$id); $icon = $this->db->escape($iconPath); $this->db->query("UPDATE links SET icon = '$icon' WHERE id = $id"); return true; } /** * Удалить ссылку (с архивированием). * * Перед удалением сохраняет данные ссылки в таблицу archive, * чтобы потом можно было восстановить. * * @param int $id ID ссылки * @return bool false если ссылка не найдена */ public function delete(int $id): bool { $id = $this->db->escape((string)$id); $link = $this->find((int)$id); if (!$link) return false; // Архивируем перед удалением $archive = new Archive($this->db); $archive->archiveLink($link); $this->db->query("DELETE FROM links WHERE id = $id"); return true; } /** * Обновить порядок сортировки ссылок (drag-and-drop). * * @param string $page Slug страницы * @param array $orderedIds Массив ID ссылок в новом порядке * @return bool */ public function updateSortOrder(string $page, array $orderedIds): bool { $page = $this->db->escape($page); foreach ($orderedIds as $position => $id) { $id = $this->db->escape((string)$id); $this->db->query("UPDATE links SET sort_order = $position WHERE id = $id AND page = '$page'"); } return true; } }