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 b78c9c2aa4
3 changed files with 55 additions and 10 deletions

View file

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

View file

@ -40,12 +40,25 @@
* @param string $username Only get users with the given username (optional)
* @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(
'SELECT count(DISTINCT id) AS c '.
'FROM users '.
(!is_null($username) ? sprintf('WHERE username LIKE \'%%%s%%\'', $username) : null )
(!empty($values) ? sprintf('WHERE %s', implode(' AND ', $values)) : null)
);
if(!empty($data)) {
return $data[0]['c'];
@ -66,8 +79,21 @@
* @param int $offset Offset (optional)
* @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)
{
case 'username':
@ -80,7 +106,7 @@
return $this->db->query(
'SELECT id, created, username, url, surname, prename, email, mailing '.
'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]).
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null)
);
@ -91,7 +117,7 @@
'FROM users '.
'LEFT JOIN users_userroles ON users_userroles.user_id = users.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 '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null)
);

View file

@ -10,7 +10,7 @@
<form method="get" class="logreg admnqf">
<fieldset>
<legend><?=_('Filters')?></legend>
<p><small><?=_('Sortorder')?>:</small></p>
<small><?=_('Sortorder')?>:</small>
<select name="sortorder" onchange="this.form.submit();">
<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>
@ -18,6 +18,10 @@
</select>
<label for="username"><?=_('Username')?>:</label>
<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>
<input type="submit" value="<?=_('Apply filters')?>" />
</form>
@ -29,6 +33,11 @@
<?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('user', $user['roles'])) : ?><small>(<?=_('User')?>)</small><?php endif ?>
<br />
<small>
<?=$user['prename']?> <?=$user['surname']?>,
<a href="mailto:<?=$user['email']?>"><?=$user['email']?></a>
</small>
</p>
</li>
<?php endforeach ?>
@ -36,7 +45,7 @@
<?php if(is_null($all) && ($page*$limit) < $usersCount) : ?>
<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>
</nav>
<?php endif ?>
@ -45,7 +54,7 @@
var page = 1;
var request;
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) {
if(request) {
@ -60,6 +69,10 @@
"<li><p>" +
"<a href=\"" + urlUser + "\">" + user['username'] + "</a><span class=\"xp\"><small>" + user['created'] + "</small></span>\n" +
(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>"
);
});