diff options
author | Frédéric Guillot <fred@kanboard.net> | 2014-10-25 15:44:38 -0400 |
---|---|---|
committer | Frédéric Guillot <fred@kanboard.net> | 2014-10-25 15:44:38 -0400 |
commit | 45b5e8b879c1135398790cf988434188aa062cd4 (patch) | |
tree | 61b4db2e7bda95141a17b9f86f414a46aed24fde | |
parent | 471736bf8c9304606f183cd6b688b1fae64eea70 (diff) |
Add pagination for users page
-rw-r--r-- | app/Controller/User.php | 23 | ||||
-rw-r--r-- | app/Model/User.php | 56 | ||||
-rw-r--r-- | app/Template/user_index.php | 26 | ||||
-rwxr-xr-x | scripts/create-random-users.php | 17 | ||||
-rw-r--r-- | tests/units/UserTest.php | 9 |
5 files changed, 114 insertions, 17 deletions
diff --git a/app/Controller/User.php b/app/Controller/User.php index 834b2379..e757fa84 100644 --- a/app/Controller/User.php +++ b/app/Controller/User.php @@ -121,16 +121,31 @@ class User extends Base */ public function index() { - $users = $this->user->getAll(); - $nb_users = count($users); + $direction = $this->request->getStringParam('direction', 'ASC'); + $order = $this->request->getStringParam('order', 'username'); + $offset = $this->request->getIntegerParam('offset', 0); + $limit = 25; + + $users = $this->user->paginate($offset, $limit, $order, $direction); + $nb_users = $this->user->count(); $this->response->html( $this->template->layout('user_index', array( 'projects' => $this->project->getList(), - 'users' => $users, 'nb_users' => $nb_users, + 'users' => $users, 'menu' => 'users', - 'title' => t('Users').' ('.$nb_users.')' + 'title' => t('Users').' ('.$nb_users.')', + 'pagination' => array( + 'controller' => 'user', + 'action' => 'index', + 'direction' => $direction, + 'order' => $order, + 'total' => $nb_users, + 'offset' => $offset, + 'limit' => $limit, + 'params' => array(), + ), ))); } diff --git a/app/Model/User.php b/app/Model/User.php index 9544f3c9..41bad0bb 100644 --- a/app/Model/User.php +++ b/app/Model/User.php @@ -138,11 +138,65 @@ class User extends Base return $this->db ->table(self::TABLE) ->asc('username') - ->columns('id', 'username', 'name', 'email', 'is_admin', 'default_project_id', 'is_ldap_user', 'notifications_enabled', 'google_id', 'github_id') + ->columns( + 'id', + 'username', + 'name', + 'email', + 'is_admin', + 'default_project_id', + 'is_ldap_user', + 'notifications_enabled', + 'google_id', + 'github_id' + ) ->findAll(); } /** + * Get all users with pagination + * + * @access public + * @param integer $offset Offset + * @param integer $limit Limit + * @param string $column Sorting column + * @param string $direction Sorting direction + * @return array + */ + public function paginate($offset = 0, $limit = 25, $column = 'username', $direction = 'ASC') + { + return $this->db + ->table(self::TABLE) + ->columns( + 'id', + 'username', + 'name', + 'email', + 'is_admin', + 'default_project_id', + 'is_ldap_user', + 'notifications_enabled', + 'google_id', + 'github_id' + ) + ->offset($offset) + ->limit($limit) + ->orderBy($column, $direction) + ->findAll(); + } + + /** + * Get the number of users + * + * @access public + * @return integer + */ + public function count() + { + return $this->db->table(self::TABLE)->count(); + } + + /** * List all users (key-value pairs with id/username) * * @access public diff --git a/app/Template/user_index.php b/app/Template/user_index.php index d4e1bbf9..fc2b6307 100644 --- a/app/Template/user_index.php +++ b/app/Template/user_index.php @@ -3,7 +3,7 @@ <h2><?= t('Users') ?><span id="page-counter"> (<?= $nb_users ?>)</span></h2> <?php if (Helper\is_admin()): ?> <ul> - <li><a href="?controller=user&action=create"><?= t('New user') ?></a></li> + <li><?= Helper\a(t('New user'), 'user', 'create') ?></li> </ul> <?php endif ?> </div> @@ -13,29 +13,29 @@ <?php else: ?> <table> <tr> - <th><?= t('Id') ?></th> - <th><?= t('Username') ?></th> - <th><?= t('Name') ?></th> - <th><?= t('Email') ?></th> - <th><?= t('Administrator') ?></th> - <th><?= t('Default project') ?></th> - <th><?= t('Notifications') ?></th> + <th><?= Helper\order(t('Id'), 'id', $pagination) ?></th> + <th><?= Helper\order(t('Username'), 'username', $pagination) ?></th> + <th><?= Helper\order(t('Name'), 'name', $pagination) ?></th> + <th><?= Helper\order(t('Email'), 'email', $pagination) ?></th> + <th><?= Helper\order(t('Administrator'), 'is_admin', $pagination) ?></th> + <th><?= Helper\order(t('Default project'), 'default_project_id', $pagination) ?></th> + <th><?= Helper\order(t('Notifications'), 'notifications_enabled', $pagination) ?></th> <th><?= t('External accounts') ?></th> - <th><?= t('Account type') ?></th> + <th><?= Helper\order(t('Account type'), 'is_ldap_user', $pagination) ?></th> </tr> <?php foreach ($users as $user): ?> <tr> <td> - <a href="?controller=user&action=show&user_id=<?= $user['id'] ?>">#<?= $user['id'] ?></a> + <?= Helper\a('#'.$user['id'], 'user', 'show', array('user_id' => $user['id'])) ?> </td> <td> - <a href="?controller=user&action=show&user_id=<?= $user['id'] ?>"><?= Helper\escape($user['username']) ?></a> + <?= Helper\a(Helper\escape($user['username']), 'user', 'show', array('user_id' => $user['id'])) ?> </td> <td> <?= Helper\escape($user['name']) ?> </td> <td> - <?= Helper\escape($user['email']) ?> + <a href="mailto:<?= Helper\escape($user['email']) ?>"><?= Helper\escape($user['email']) ?></a> </td> <td> <?= $user['is_admin'] ? t('Yes') : t('No') ?> @@ -66,6 +66,8 @@ </tr> <?php endforeach ?> </table> + + <?= Helper\paginate($pagination) ?> <?php endif ?> </section> </section> diff --git a/scripts/create-random-users.php b/scripts/create-random-users.php new file mode 100755 index 00000000..47336c64 --- /dev/null +++ b/scripts/create-random-users.php @@ -0,0 +1,17 @@ +#!/usr/bin/env php +<?php + +require __DIR__.'/../app/common.php'; + +use Model\User; + +$userModel = new User($registry); + +for ($i = 0; $i < 500; $i++) { + $userModel->create(array( + 'username' => 'user'.$i, + 'password' => 'password'.$i, + 'name' => 'User #'.$i, + 'email' => 'user'.$i.'@localhost', + )); +} diff --git a/tests/units/UserTest.php b/tests/units/UserTest.php index b66a6c27..d4f9dd92 100644 --- a/tests/units/UserTest.php +++ b/tests/units/UserTest.php @@ -9,6 +9,15 @@ use Model\Project; class UserTest extends Base { + public function testPassword() + { + $password = 'test123'; + $hash = password_hash($password, PASSWORD_BCRYPT); + + $this->assertNotEmpty($hash); + $this->assertTrue(password_verify($password, $hash)); + } + public function testPrepare() { $u = new User($this->registry); |