*
* @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
{
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());
*/
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;
);
$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
);
- }
-
- $sql .= sprintf(
- ' ORDER BY profile.%s %s, profile.nickname DESC LIMIT %d, %d',
- $sort,
- ($this->order) ? 'ASC' : 'DESC',
- $offset,
- $limit
- );
- $profile->query($sql);
+ $profile->query($sql);
+ }
return $profile;
}
);
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']);
}
$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();
$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');