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