]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
* Integrate search input box
authorZach Copley <zach@status.net>
Sat, 5 Mar 2011 09:55:52 +0000 (01:55 -0800)
committerZach Copley <zach@status.net>
Sat, 5 Mar 2011 09:55:52 +0000 (01:55 -0800)
* Fix ordering

plugins/Directory/DirectoryPlugin.php
plugins/Directory/actions/userdirectory.php
plugins/Directory/css/directory.css
plugins/Directory/lib/alphanav.php
plugins/Directory/lib/sortablesubscriptionlist.php

index 8fd7785ec9c4d91216b8e26fae331ac01d8e29b7..50a0da7cf96af81ba6a75ae4297777bd61f68731 100644 (file)
@@ -113,15 +113,15 @@ class DirectoryPlugin extends Plugin
     function onRouterInitialized($m)
     {
         $m->connect(
-            'directory/users/:filter',
+            'directory/users',
             array('action' => 'userdirectory'),
-            array('filter' => '[0-9a-zA-Z_]{1,64}')
+            array('filter' => 'all')
         );
 
         $m->connect(
-            'directory/users',
+            'directory/users/:filter',
             array('action' => 'userdirectory'),
-            array('filter' => 'all')
+            array('filter' => '[0-9a-zA-Z_]{1,64}')
         );
 
         return true;
index f6ff0b3eec1f76fa072b96e1dfe5c94065899d49..005fb787d35a6ed096f7b9c5a8bd3ccf89b34e23 100644 (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,54 +225,115 @@ 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
             );
-        }
-
-        $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;
     }
index 76c9fc2583c41b0e1059c1fa05f14288f50a8914..14fd2ce23bc8f072346534b0f4281750d290bf5e 100644 (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;
index 33380b0b2b82d5a17bba25327ae47fe62d3d927f..645cdfa601df499957610c745cb2cf2a729f2e6b 100644 (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');
index a22aeadb3d25873337abd7012ec328afaa068e87..8f6e66d20a13cde5a959343214a1ae69f9e6e913 100644 (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');