From 5d22f969a1ca27d2a81c27596978e7e0479310fb Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sat, 5 Mar 2011 01:55:52 -0800 Subject: [PATCH] * Integrate search input box * Fix ordering --- plugins/Directory/DirectoryPlugin.php | 12 +- plugins/Directory/actions/userdirectory.php | 137 ++++++++++++++---- plugins/Directory/css/directory.css | 2 +- plugins/Directory/lib/alphanav.php | 4 +- .../lib/sortablesubscriptionlist.php | 16 +- 5 files changed, 128 insertions(+), 43 deletions(-) diff --git a/plugins/Directory/DirectoryPlugin.php b/plugins/Directory/DirectoryPlugin.php index 8fd7785ec9..50a0da7cf9 100644 --- a/plugins/Directory/DirectoryPlugin.php +++ b/plugins/Directory/DirectoryPlugin.php @@ -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; } diff --git a/plugins/Directory/actions/userdirectory.php b/plugins/Directory/actions/userdirectory.php index f6ff0b3eec..005fb787d3 100644 --- a/plugins/Directory/actions/userdirectory.php +++ b/plugins/Directory/actions/userdirectory.php @@ -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; } diff --git a/plugins/Directory/css/directory.css b/plugins/Directory/css/directory.css index 76c9fc2583..14fd2ce23b 100644 --- a/plugins/Directory/css/directory.css +++ b/plugins/Directory/css/directory.css @@ -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; diff --git a/plugins/Directory/lib/alphanav.php b/plugins/Directory/lib/alphanav.php index 33380b0b2b..645cdfa601 100644 --- a/plugins/Directory/lib/alphanav.php +++ b/plugins/Directory/lib/alphanav.php @@ -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'); diff --git a/plugins/Directory/lib/sortablesubscriptionlist.php b/plugins/Directory/lib/sortablesubscriptionlist.php index a22aeadb3d..8f6e66d20a 100644 --- a/plugins/Directory/lib/sortablesubscriptionlist.php +++ b/plugins/Directory/lib/sortablesubscriptionlist.php @@ -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');