Paginator for user manager admin view

Closes ticket #1557
Note: also optimizes the way item count is retrieved for users, saving <user_count>-1 queries when displaying this page
This commit is contained in:
Joe7
2011-01-09 20:52:31 +01:00
parent d74aad072d
commit 89737c09d5
3 changed files with 89 additions and 2 deletions

View File

@@ -22,8 +22,40 @@ class Admin_Users_Controller extends Admin_Controller {
$view = new Admin_View("admin.html");
$view->page_title = t("Users and groups");
$view->content = new View("admin_users.html");
$view->content->users = ORM::factory("user")->order_by("name", "ASC")->find_all();
// @todo: add this as a config option
$page_size = module::get_var("user", "page_size", 10);
$page = Input::instance()->get("page", "1");
$builder = db::build();
$user_count = $builder->from("users")->count_records();
list($offset, $max_pages) = Controller::get_pager_params($page, $user_count, $page_size);
// Make sure that the page references a valid offset
if ($page < 1) {
url::redirect(url::merge(array("page" => 1)));
} else if ($page > $max_pages) {
url::redirect(url::merge(array("page" => $max_pages)));
}
$view->content->users = ORM::factory("user")
->select(array("users.id", "users.admin", "users.name", "users.email", "users.full_name",
"users.last_login", "users.guest", db::expr("COUNT(items.id) as item_count")))
->join("items", "items.owner_id", "users.id", "LEFT")
->group_by("users.id")
->order_by("users.name", "ASC")
->find_all($page_size, $offset);
$view->content->groups = ORM::factory("group")->order_by("name", "ASC")->find_all();
$view->content->page = $page;
$view->content->max_pages = $max_pages;
if ($page < $max_pages) {
$view->content->next_page_url = url::site(url::merge(array("page" => $page + 1)));
}
if ( $page > 1 )
{
$view->content->previous_page_url = url::site(url::merge(array("page" => $page - 1)));
}
print $view;
}