* Integrate search input box

* Fix ordering
This commit is contained in:
Zach Copley 2011-03-05 01:55:52 -08:00
parent 5f1a795b73
commit 5d22f969a1
5 changed files with 128 additions and 43 deletions

View File

@ -112,18 +112,18 @@ class DirectoryPlugin extends Plugin
*/
function onRouterInitialized($m)
{
$m->connect(
'directory/users/:filter',
array('action' => 'userdirectory'),
array('filter' => '[0-9a-zA-Z_]{1,64}')
);
$m->connect(
'directory/users',
array('action' => 'userdirectory'),
array('filter' => 'all')
);
$m->connect(
'directory/users/:filter',
array('action' => 'userdirectory'),
array('filter' => '[0-9a-zA-Z_]{1,64}')
);
return true;
}

View File

@ -50,14 +50,35 @@ class UserdirectoryAction extends Action
*
* @var integer
*/
protected $page = null;
public $page;
/**
* what to filter the search results by
* What to filter the search results by
*
* @var string
*/
protected $filter = null;
public $filter;
/**
* Column to sort by
*
* @var string
*/
public $sort;
/**
* How to order search results, ascending or descending
*
* @var string
*/
public $reverse;
/**
* Query
*
* @var string
*/
public $q;
/**
* Title of the page
@ -120,11 +141,11 @@ class UserdirectoryAction extends Action
{
parent::prepare($args);
$this->page = ($this->arg('page')) ? ($this->arg('page') + 0) : 1;
$filter = $this->arg('filter');
$this->filter = isset($filter) ? $filter : 'all';
$this->sort = $this->arg('sort');
$this->order = $this->boolean('asc'); // ascending or decending
$this->page = ($this->arg('page')) ? ($this->arg('page') + 0) : 1;
$this->filter = $this->arg('filter', 'all');
$this->reverse = $this->boolean('reverse');
$this->q = $this->trimmed('q');
$this->sort = $this->arg('sort', 'nickname');
common_set_returnto($this->selfUrl());
@ -185,15 +206,14 @@ class UserdirectoryAction extends Action
*/
function showContent()
{
// XXX Need search bar
$this->showForm();
$this->elementStart('div', array('id' => 'user_directory'));
$alphaNav = new AlphaNav($this, true, array('All'));
$alphaNav->show();
// XXX Maybe use a more specialized version of ProfileList here
$profile = null;
$profile = $this->getUsers();
$cnt = 0;
@ -205,55 +225,116 @@ class UserdirectoryAction extends Action
);
$cnt = $profileList->show();
$profile->free();
if (0 == $cnt) {
$this->showEmptyListMessage();
}
}
$args = array();
if (isset($this->q)) {
$args['q'] = $this->q;
} else {
$args['filter'] = $this->filter;
}
$this->pagination(
$this->page > 1,
$cnt > PROFILES_PER_PAGE,
$this->page,
'userdirectory',
array('filter' => $this->filter)
$args
);
$this->elementEnd('div');
}
function showForm($error=null)
{
$this->elementStart(
'form',
array(
'method' => 'get',
'id' => 'form_search',
'class' => 'form_settings',
'action' => common_local_url('userdirectory')
)
);
$this->elementStart('fieldset');
$this->element('legend', null, _('Search site'));
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
$this->input('q', _('Keyword(s)'), $this->q);
$this->submit('search', _m('BUTTON','Search'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
/*
* Get users filtered by the current filter, sort key,
* sort order, and page
*/
function getUsers()
{
$profile = new Profile();
$offset = ($this->page - 1) * PROFILES_PER_PAGE;
$limit = PROFILES_PER_PAGE + 1;
$sort = $this->getSortKey();
$sql = 'SELECT profile.* FROM profile, user WHERE profile.id = user.id';
if ($this->filter != 'all') {
if (isset($this->q)) {
// User is searching via query
$search_engine = $profile->getSearchEngine('profile');
$mode = 'reverse_chron';
if ($this->sort == 'nickname') {
if ($this->reverse) {
$mode = 'nickname_desc';
} else {
$mode = 'nickname_asc';
}
} else {
if ($this->reverse) {
$mode = 'chron';
}
}
$search_engine->set_sort_mode($mode);
$search_engine->limit($offset, $limit);
$search_engine->query($this->q);
$profile->find();
} else {
// User is browsing via AlphaNav
$sort = $this->getSortKey();
$sql = 'SELECT profile.* FROM profile, user WHERE profile.id = user.id';
if ($this->filter != 'all') {
$sql .= sprintf(
' AND LEFT(LOWER(profile.nickname), 1) = \'%s\'',
$this->filter
);
}
$sql .= sprintf(
' AND LEFT(LOWER(profile.nickname), 1) = \'%s\'',
$this->filter
' ORDER BY profile.%s %s, profile.nickname ASC LIMIT %d, %d',
$sort,
$this->reverse ? 'DESC' : 'ASC',
$offset,
$limit
);
$profile->query($sql);
}
$sql .= sprintf(
' ORDER BY profile.%s %s, profile.nickname DESC LIMIT %d, %d',
$sort,
($this->order) ? 'ASC' : 'DESC',
$offset,
$limit
);
$profile->query($sql);
return $profile;
}

View File

@ -57,7 +57,7 @@ th.current {
background-position: 60% 2px;
}
th.current.asc {
th.current.reverse {
background-image: url(../images/control_arrow_up.gif);
background-repeat: no-repeat;
background-position: 60% 2px;

View File

@ -121,8 +121,8 @@ class AlphaNav extends Widget
}
// sort order
if (!empty($this->action->order)) {
$params['asc'] = 'true';
if ($this->action->reverse) {
$params['reverse'] = 'true';
}
$current = $this->action->arg('filter');

View File

@ -68,16 +68,16 @@ class SortableSubscriptionList extends SubscriptionList
);
foreach ($tableHeaders as $id => $label) {
$attrs = array('id' => $id);
$attrs = array('id' => $id);
$current = (!empty($this->action->sort) && $this->action->sort == $id);
if ($current || empty($this->action->sort) && $id == 'nickname') {
$attrs['class'] = 'current';
}
if ($current && !$this->action->boolean('asc')) {
$attrs['class'] .= ' asc';
if ($current && $this->action->reverse) {
$attrs['class'] .= ' reverse';
$attrs['class'] = trim($attrs['class']);
}
@ -86,8 +86,12 @@ class SortableSubscriptionList extends SubscriptionList
$linkAttrs = array();
$params = array('sort' => $id);
if ($current && !$this->action->boolean('asc')) {
$params['asc'] = "true";
if (!empty($this->action->q)) {
$params['q'] = $this->action->q;
}
if ($current && !$this->action->reverse) {
$params['reverse'] = 'true';
}
$args = array();
@ -108,7 +112,7 @@ class SortableSubscriptionList extends SubscriptionList
$this->out->element('th', array('id' => 'subscriptions'), 'Subscriptions');
$this->out->element('th', array('id' => 'notices'), 'Notices');
//$this->out->element('th', array('id' => 'controls'), 'Controls');
$this->out->element('th', array('id' => 'controls'), null);
$this->out->elementEnd('tr');
$this->out->elementEnd('thead');