add filters for ?name? and ?email? to user listing (implements #82)

This commit is contained in:
oliver 2015-04-19 15:53:45 +02:00
commit 0b8c5f614f
3 changed files with 55 additions and 10 deletions

View file

@ -57,12 +57,16 @@
// Set filters // Set filters
$sortorder = 'username'; $sortorder = 'username';
$username = null; $username = null;
$name = null;
$email = null;
$page = 1; $page = 1;
if($this->request->getRequestMethod() == 'GET') if($this->request->getRequestMethod() == 'GET')
{ {
$sortorder = $this->request->getGetParam('sortorder'); $sortorder = $this->request->getGetParam('sortorder');
$sortorder = !empty($sortorder) ? $sortorder : 'username'; $sortorder = !empty($sortorder) ? $sortorder : 'username';
$username = (!is_null($this->request->getGetParam('username'))) ? $this->request->getGetParam('username') : $username; $username = (!is_null($this->request->getGetParam('username'))) ? $this->request->getGetParam('username') : $username;
$name = (!is_null($this->request->getGetParam('name'))) ? $this->request->getGetParam('name') : $name;
$email = (!is_null($this->request->getGetParam('email'))) ? $this->request->getGetParam('email') : $email;
$page = $this->request->getGetParam('page'); $page = $this->request->getGetParam('page');
$page = !empty($page) ? intval($page) : 1; $page = !empty($page) ? intval($page) : 1;
} }
@ -70,8 +74,8 @@
// Get registered users // Get registered users
$limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null; $limit = ($all != 'all') ? \nre\configs\AppConfig::$misc['lists_limit'] : null;
$offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0; $offset = ($all != 'all') ? max((intval($page) - 1), 0) * $limit : 0;
$usersCount = $this->Users->getUsersCount($username); $usersCount = $this->Users->getUsersCount($username, $name, $email);
$users = $this->Users->getUsers($sortorder, $username, $limit, $offset); $users = $this->Users->getUsers($sortorder, $username, $name, $email, $limit, $offset);
foreach($users as &$user) { foreach($users as &$user) {
$user['roles'] = array_map(function($r) { return $r['name']; }, $this->Userroles->getUserrolesForUserById($user['id'])); $user['roles'] = array_map(function($r) { return $r['name']; }, $this->Userroles->getUserrolesForUserById($user['id']));
} }
@ -85,6 +89,8 @@
$this->set('usersCount', $usersCount); $this->set('usersCount', $usersCount);
$this->set('sortorder', $sortorder); $this->set('sortorder', $sortorder);
$this->set('username', $username); $this->set('username', $username);
$this->set('name', $name);
$this->set('email', $email);
$this->set('all', $all); $this->set('all', $all);
$this->set('page', $page); $this->set('page', $page);
$this->set('limit', $limit); $this->set('limit', $limit);

View file

@ -40,12 +40,25 @@
* @param string $username Only get users with the given username (optional) * @param string $username Only get users with the given username (optional)
* @return int Count of users * @return int Count of users
*/ */
public function getUsersCount($username=null) public function getUsersCount($username=null, $name=null, $email=null)
{ {
// Create array of values
$values = array();
if(!is_null($username)) {
$values[] = sprintf('username LIKE \'%%%s%%\'', $username);
}
if(!is_null($name)) {
$values[] = sprintf('(surname LIKE \'%%%s%%\' OR prename LIKE \'%%%s%%\')', $name, $name);
}
if(!is_null($email)) {
$values[] = sprintf('email LIKE \'%%%s%%\'', $email);
}
// Execute query
$data = $this->db->query( $data = $this->db->query(
'SELECT count(DISTINCT id) AS c '. 'SELECT count(DISTINCT id) AS c '.
'FROM users '. 'FROM users '.
(!is_null($username) ? sprintf('WHERE username LIKE \'%%%s%%\'', $username) : null ) (!empty($values) ? sprintf('WHERE %s', implode(' AND ', $values)) : null)
); );
if(!empty($data)) { if(!empty($data)) {
return $data[0]['c']; return $data[0]['c'];
@ -66,8 +79,21 @@
* @param int $offset Offset (optional) * @param int $offset Offset (optional)
* @return array Users * @return array Users
*/ */
public function getUsers($sort, $username=null, $limit=null, $offset=0) public function getUsers($sort, $username=null, $name=null, $email=null, $limit=null, $offset=0)
{ {
// Create array of values
$values = array();
if(!is_null($username)) {
$values[] = sprintf('username LIKE \'%%%s%%\'', $username);
}
if(!is_null($name)) {
$values[] = sprintf('(surname LIKE \'%%%s%%\' OR prename LIKE \'%%%s%%\')', $name, $name);
}
if(!is_null($email)) {
$values[] = sprintf('email LIKE \'%%%s%%\'', $email);
}
// Execute query
switch($sort) switch($sort)
{ {
case 'username': case 'username':
@ -80,7 +106,7 @@
return $this->db->query( return $this->db->query(
'SELECT id, created, username, url, surname, prename, email, mailing '. 'SELECT id, created, username, url, surname, prename, email, mailing '.
'FROM users '. 'FROM users '.
(!is_null($username) ? sprintf('WHERE username LIKE \'%%%s%%\' ', $username) : null). (!empty($values) ? sprintf('WHERE %s ', implode(' AND ', $values)) : null).
sprintf('ORDER BY %s %s ', $sort, $orders[$sort]). sprintf('ORDER BY %s %s ', $sort, $orders[$sort]).
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null) (!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null)
); );
@ -91,7 +117,7 @@
'FROM users '. 'FROM users '.
'LEFT JOIN users_userroles ON users_userroles.user_id = users.id '. 'LEFT JOIN users_userroles ON users_userroles.user_id = users.id '.
'LEFT JOIN userroles ON userroles.id = users_userroles.user_id '. 'LEFT JOIN userroles ON userroles.id = users_userroles.user_id '.
(!is_null($username) ? sprintf('WHERE username LIKE \'%%%s%%\' ', $username) : null). (!empty($values) ? sprintf('WHERE %s ', implode(' AND ', $values)) : null).
'ORDER BY userroles.id IS NULL, userroles.id ASC '. 'ORDER BY userroles.id IS NULL, userroles.id ASC '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null) (!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null)
); );

View file

@ -10,7 +10,7 @@
<form method="get" class="logreg admnqf"> <form method="get" class="logreg admnqf">
<fieldset> <fieldset>
<legend><?=_('Filters')?></legend> <legend><?=_('Filters')?></legend>
<p><small><?=_('Sortorder')?>:</small></p> <small><?=_('Sortorder')?>:</small>
<select name="sortorder" onchange="this.form.submit();"> <select name="sortorder" onchange="this.form.submit();">
<option value="username" <?php if($sortorder == 'username') : ?>selected="selected"<?php endif ?>><?=_('Username')?></option> <option value="username" <?php if($sortorder == 'username') : ?>selected="selected"<?php endif ?>><?=_('Username')?></option>
<option value="role" <?php if($sortorder == 'role') : ?>selected="selected"<?php endif ?>><?=_('Role')?></option> <option value="role" <?php if($sortorder == 'role') : ?>selected="selected"<?php endif ?>><?=_('Role')?></option>
@ -18,6 +18,10 @@
</select> </select>
<label for="username"><?=_('Username')?>:</label> <label for="username"><?=_('Username')?>:</label>
<input id="username" type="text" name="username" placeholder="<?=_('Username')?>" value="<?=$username?>" /> <input id="username" type="text" name="username" placeholder="<?=_('Username')?>" value="<?=$username?>" />
<label for="name"><?=_('Name')?>:</label>
<input id="name" type="text" name="name" placeholder="<?=_('Name')?>" value="<?=$name?>" />
<label for="email"><?=_('Email address')?>:</label>
<input id="email" type="text" name="email" placeholder="<?=_('Email address')?>" value="<?=$email?>" />
</fieldset> </fieldset>
<input type="submit" value="<?=_('Apply filters')?>" /> <input type="submit" value="<?=_('Apply filters')?>" />
</form> </form>
@ -29,6 +33,11 @@
<?php if(in_array('admin', $user['roles'])) : ?><small>(<?=_('Admin')?>)</small><?php endif ?> <?php if(in_array('admin', $user['roles'])) : ?><small>(<?=_('Admin')?>)</small><?php endif ?>
<?php if(in_array('moderator', $user['roles'])) : ?><small>(<?=_('Moderator')?>)</small><?php endif ?> <?php if(in_array('moderator', $user['roles'])) : ?><small>(<?=_('Moderator')?>)</small><?php endif ?>
<?php if(in_array('user', $user['roles'])) : ?><small>(<?=_('User')?>)</small><?php endif ?> <?php if(in_array('user', $user['roles'])) : ?><small>(<?=_('User')?>)</small><?php endif ?>
<br />
<small>
<?=$user['prename']?> <?=$user['surname']?>,
<a href="mailto:<?=$user['email']?>"><?=$user['email']?></a>
</small>
</p> </p>
</li> </li>
<?php endforeach ?> <?php endforeach ?>
@ -36,7 +45,7 @@
<?php if(is_null($all) && ($page*$limit) < $usersCount) : ?> <?php if(is_null($all) && ($page*$limit) < $usersCount) : ?>
<nav class="admin"> <nav class="admin">
<li><a id="show-more" href="<?=$linker->link(null,1,true,array('page'=>$page+1,'sortorder'=>$sortorder))?>"><?=_('Show more')?></a></li> <li><a id="show-more" href="<?=$linker->link(null,1,true,array('page'=>$page+1,'sortorder'=>$sortorder),false)?>"><?=_('Show more')?></a></li>
<li><a id="show-all" href="<?=$linker->link('all',1,true,array('sortorder'=>$sortorder))?>"><?=_('Show all')?></a></li> <li><a id="show-all" href="<?=$linker->link('all',1,true,array('sortorder'=>$sortorder))?>"><?=_('Show all')?></a></li>
</nav> </nav>
<?php endif ?> <?php endif ?>
@ -45,7 +54,7 @@
var page = 1; var page = 1;
var request; var request;
var linkUser = "<?=$linker->link(array('users','user','USER'))?>"; var linkUser = "<?=$linker->link(array('users','user','USER'))?>";
var linkPage = "<?=$linker->link(null,1,true,array('page'=>'PAGE','sortorder'=>$sortorder))?>"; var linkPage = "<?=$linker->link(null,1,true,array('page'=>'PAGE','sortorder'=>$sortorder),false)?>";
$("#show-more").click(function(event) { $("#show-more").click(function(event) {
if(request) { if(request) {
@ -60,6 +69,10 @@
"<li><p>" + "<li><p>" +
"<a href=\"" + urlUser + "\">" + user['username'] + "</a><span class=\"xp\"><small>" + user['created'] + "</small></span>\n" + "<a href=\"" + urlUser + "\">" + user['username'] + "</a><span class=\"xp\"><small>" + user['created'] + "</small></span>\n" +
(user['roles'].length > 0 ? "<small>(" + user['roles'].join(', ') + ")</small>" : '') + (user['roles'].length > 0 ? "<small>(" + user['roles'].join(', ') + ")</small>" : '') +
"<br /><small>" + user['prename'] + " " + user['surname'] + ", " +
"<a href=\"mailto:" + user['email'] + "\">" + user['email'] + "</a></small>" +
"</p></li>" "</p></li>"
); );
}); });