From 97a03d8f83a95d7879ca2a0973ecef2bc5f1f984 Mon Sep 17 00:00:00 2001 From: Shish Date: Sun, 22 Jul 2018 19:23:34 +0100 Subject: [PATCH] paginated user list --- ext/user/main.php | 21 +++++++++++++-------- ext/user/theme.php | 24 ++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/ext/user/main.php b/ext/user/main.php index 7d4a6428..cf75c5cc 100644 --- a/ext/user/main.php +++ b/ext/user/main.php @@ -95,11 +95,14 @@ class UserPage extends Extension { $this->page_create(); } else if($event->get_arg(0) == "list") { - $offset = 0; $limit = 50; - $q = "SELECT * FROM users WHERE 1=1"; - $a = array("offset"=>$offset, "limit"=>$limit); + $page_num = int_escape($event->get_arg(1)); + if($page_num <= 0) $page_num = 1; + $offset = ($page_num-1) * $limit; + + $q = "WHERE 1=1"; + $a = array(); if(@$_GET['username']) { $q .= " AND SCORE_STRNORM(name) LIKE SCORE_STRNORM(:name)"; @@ -107,7 +110,7 @@ class UserPage extends Extension { } if($user->can('delete_user') && @$_GET['email']) { - $q .= " AND SCORE_STRNORM(name) LIKE SCORE_STRNORM(:email)"; + $q .= " AND SCORE_STRNORM(email) LIKE SCORE_STRNORM(:email)"; $a["email"] = '%' . $_GET['email'] . '%'; } @@ -115,12 +118,14 @@ class UserPage extends Extension { $q .= " AND class LIKE :class"; $a["class"] = $_GET['class']; } + $where = $database->scoreql_to_sql($q); - $q .= " LIMIT :limit OFFSET :offset"; - - $rows = $database->get_all($database->scoreql_to_sql($q), $a); + $count = $database->get_one("SELECT count(*) FROM users $where", $a); + $a["offset"] = $offset; + $a["limit"] = $limit; + $rows = $database->get_all("SELECT * FROM users $where LIMIT :limit OFFSET :offset", $a); $users = array_map("_new_user", $rows); - $this->theme->display_user_list($page, $users, $user); + $this->theme->display_user_list($page, $users, $user, $page_num, $count/$limit); } else if($event->get_arg(0) == "logout") { $this->page_logout(); diff --git a/ext/user/theme.php b/ext/user/theme.php index 44f80042..b261ec08 100644 --- a/ext/user/theme.php +++ b/ext/user/theme.php @@ -14,7 +14,7 @@ class UserPageTheme extends Themelet { * @param User[] $users * @param User $user */ - public function display_user_list(Page $page, array $users, User $user) { + public function display_user_list(Page $page, array $users, User $user, int $page_num, int $page_total) { $page->set_title("User List"); $page->set_heading("User List"); $page->add_block(new NavBlock()); @@ -36,7 +36,7 @@ class UserPageTheme extends Themelet { $html .= "" . make_form("user_admin/list", "GET"); $html .= ""; if($user->can('delete_user')) - $html .= ""; + $html .= ""; $html .= ""; $html .= ""; $html .= ""; @@ -60,6 +60,26 @@ class UserPageTheme extends Themelet { $html .= ""; $page->add_block(new Block("Users", $html)); + $this->display_paginator($page, "user_admin/list", $this->get_args(), $page_num, $page_total); + } + + protected function ueie($var) { + if(isset($_GET[$var])) return $var."=".url_escape($_GET[$var]); + else return ""; + } + protected function get_args() { + $args = ""; + // Check if each arg is actually empty and skip it if so + if(strlen($this->ueie("username"))) + $args .= $this->ueie("username")."&"; + if(strlen($this->ueie("email"))) + $args .= $this->ueie("email")."&"; + if(strlen($this->ueie("class"))) + $args .= $this->ueie("class")."&"; + // If there are no args at all, set $args to null to prevent an unnecessary ? at the end of the paginator url + if(strlen($args) == 0) + $args = null; + return $args; } public function display_user_links(Page $page, User $user, $parts) {