diff --git a/controllers/AdminController.php b/controllers/AdminController.php index 7abee6b..677f925 100755 --- a/controllers/AdminController.php +++ b/controllers/AdminController.php @@ -11,13 +11,112 @@ class AdminController extends BaseController { public function users() { $userModel = new User($this->pdo); - $users = $userModel->findAll(); + + // Параметры пагинации + $current_page = isset($_GET['page']) ? (int)$_GET['page'] : 1; + $per_page = isset($_GET['per_page']) ? (int)$_GET['per_page'] : 10; + + // Валидация параметров + $current_page = max(1, $current_page); + $allowed_per_page = [5, 10, 50, 100]; + if (!in_array($per_page, $allowed_per_page)) { + $per_page = 10; + } + + // Получаем общее количество пользователей + $total_users = $userModel->getTotalUsersCount(); + + // Вычисляем общее количество страниц + $total_pages = ceil($total_users / $per_page); + + // Корректируем текущую страницу, если она выходит за пределы + if ($current_page > $total_pages && $total_pages > 0) { + $current_page = $total_pages; + } + + // Вычисляем смещение + $offset = ($current_page - 1) * $per_page; + + // Получаем пользователей для текущей страницы + $users = $userModel->getUsersPaginated($offset, $per_page); + + // Генерируем пагинацию + $pagination = $this->generatePagination($current_page, $total_pages); $this->render('admin/users', [ 'users' => $users, - 'page_title' => 'Управление пользователями' + 'page_title' => 'Управление пользователями', + 'pagination' => $pagination, + 'current_page' => $current_page, + 'total_pages' => $total_pages, + 'per_page' => $per_page, + 'total_users' => $total_users, + 'allowed_per_page' => $allowed_per_page ]); } + + private function generatePagination($current_page, $total_pages) { + if ($total_pages <= 1) { + return []; + } + + $pagination = []; + $max_visible_pages = 5; // Количество видимых страниц до и после текущей + + // Всегда добавляем первую страницу + $pagination[] = [ + 'page' => 1, + 'label' => '1', + 'active' => (1 == $current_page), + 'type' => 'page' + ]; + + // Определяем диапазон видимых страниц + $start_page = max(2, $current_page - $max_visible_pages); + $end_page = min($total_pages - 1, $current_page + $max_visible_pages); + + // Добавляем многоточие после первой страницы, если нужно + if ($start_page > 2) { + $pagination[] = [ + 'page' => null, + 'label' => '...', + 'active' => false, + 'type' => 'ellipsis' + ]; + } + + // Добавляем видимые страницы + for ($i = $start_page; $i <= $end_page; $i++) { + $pagination[] = [ + 'page' => $i, + 'label' => $i, + 'active' => ($i == $current_page), + 'type' => 'page' + ]; + } + + // Добавляем многоточие перед последней страницей, если нужно + if ($end_page < $total_pages - 1) { + $pagination[] = [ + 'page' => null, + 'label' => '...', + 'active' => false, + 'type' => 'ellipsis' + ]; + } + + // Добавляем последнюю страницу, если она не первая + if ($total_pages > 1) { + $pagination[] = [ + 'page' => $total_pages, + 'label' => $total_pages, + 'active' => ($total_pages == $current_page), + 'type' => 'page' + ]; + } + + return $pagination; + } public function toggleUserStatus($user_id) { if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !verify_csrf_token($_POST['csrf_token'] ?? '')) { @@ -25,10 +124,13 @@ class AdminController extends BaseController { $this->redirect('/admin/users'); return; } + // Сохраняем параметры пагинации + $page = $_GET['page'] ?? 1; + $per_page = $_GET['per_page'] ?? 10; if ($user_id == $_SESSION['user_id']) { $_SESSION['error'] = "Нельзя изменить статус собственного аккаунта"; - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); return; } @@ -37,7 +139,7 @@ class AdminController extends BaseController { if (!$user) { $_SESSION['error'] = "Пользователь не найден"; - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); return; } @@ -48,7 +150,7 @@ class AdminController extends BaseController { $_SESSION['error'] = "Ошибка при обновлении статуса"; } - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); } public function deleteUser($user_id) { @@ -58,9 +160,13 @@ class AdminController extends BaseController { return; } + // Сохраняем параметры пагинации + $page = $_GET['page'] ?? 1; + $per_page = $_GET['per_page'] ?? 10; + if ($user_id == $_SESSION['user_id']) { $_SESSION['error'] = "Нельзя удалить собственный аккаунт"; - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); return; } @@ -69,7 +175,7 @@ class AdminController extends BaseController { if (!$user) { $_SESSION['error'] = "Пользователь не найден"; - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); return; } @@ -79,13 +185,17 @@ class AdminController extends BaseController { $_SESSION['error'] = "Ошибка при удалении пользователя"; } - $this->redirect('/admin/users'); + $this->redirect("/admin/users?page=$page&per_page=$per_page"); } public function addUser() { $error = ''; $success = ''; + // Сохраняем параметры пагинации для возврата + $return_page = $_GET['page'] ?? 1; + $return_per_page = $_GET['per_page'] ?? 10; + if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!verify_csrf_token($_POST['csrf_token'] ?? '')) { $error = "Ошибка безопасности"; @@ -119,9 +229,9 @@ class AdminController extends BaseController { ]; if ($userModel->create($data)) { - $success = 'Пользователь успешно создан'; - // Очищаем поля формы - $_POST = []; + $_SESSION['success'] = 'Пользователь успешно создан'; + $this->redirect("/admin/users?page=1&per_page=$return_per_page"); + return; } else { $error = 'Ошибка при создании пользователя'; } @@ -133,7 +243,9 @@ class AdminController extends BaseController { $this->render('admin/add_user', [ 'error' => $error, 'success' => $success, - 'page_title' => 'Добавление пользователя' + 'page_title' => 'Добавление пользователя', + 'return_page' => $return_page, + 'return_per_page' => $return_per_page ]); } } diff --git a/models/User.php b/models/User.php index ecd46e0..a45e4b7 100755 --- a/models/User.php +++ b/models/User.php @@ -115,5 +115,23 @@ class User { $stmt = $this->pdo->prepare($sql); return $stmt->execute($params); } + + public function getTotalUsersCount() { + $stmt = $this->pdo->prepare("SELECT COUNT(*) FROM users"); + $stmt->execute(); + return $stmt->fetchColumn(); + } + + public function getUsersPaginated($offset, $limit) { + $stmt = $this->pdo->prepare(" + SELECT * FROM users + ORDER BY id DESC + LIMIT :limit OFFSET :offset + "); + $stmt->bindValue(':limit', $limit, PDO::PARAM_INT); + $stmt->bindValue(':offset', $offset, PDO::PARAM_INT); + $stmt->execute(); + return $stmt->fetchAll(PDO::FETCH_ASSOC); + } } ?> \ No newline at end of file diff --git a/views/admin/add_user.php b/views/admin/add_user.php index df265a5..6230ded 100755 --- a/views/admin/add_user.php +++ b/views/admin/add_user.php @@ -3,7 +3,7 @@

Добавление пользователя

- + Назад к пользователям
diff --git a/views/admin/users.php b/views/admin/users.php index 3ba6875..32a8cdb 100755 --- a/views/admin/users.php +++ b/views/admin/users.php @@ -4,7 +4,12 @@

Управление пользователями

-

Всего пользователей:

+

+ Всего пользователей: + 0): ?> + | Показано - + +

Добавить пользователя @@ -27,6 +32,30 @@
+ +
+
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
@@ -111,7 +140,66 @@
+ + + + + + +
+

+ Страница из + 1): ?> + | Перейти: +

+ + +
+ +

+
+ + + \ No newline at end of file