]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/peoplesearch.php
change LACONICA to STATUSNET
[quix0rs-gnu-social.git] / actions / peoplesearch.php
index 2688e47084fc98b130754f234bee3180bb8c231b..43c966f9c12b5cf78b64c33352ca35920727ac6a 100644 (file)
@@ -1,7 +1,18 @@
 <?php
-/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
+/**
+ * People search action class.
+ *
+ * PHP version 5
+ *
+ * @category Action
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @author   Robin Millette <millette@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('LACONICA')) { exit(1); }
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/searchaction.php';
+require_once INSTALLDIR.'/lib/profilelist.php';
+
+/**
+ * People search action class.
+ *
+ * @category Action
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @author   Robin Millette <millette@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ */
+class PeoplesearchAction extends SearchAction
+{
+    function getInstructions()
+    {
+        return _('Search for people on %%site.name%% by their name, location, or interests. ' .
+                  'Separate the terms by spaces; they must be 3 characters or more.');
+    }
+
+    function title()
+    {
+        return _('People search');
+    }
 
-define(PROFILES_PER_PAGE, 10);
+    function showResults($q, $page)
+    {
+        $profile = new Profile();
+        $search_engine = $profile->getSearchEngine('identica_people');
+        $search_engine->set_sort_mode('chron');
+        // Ask for an extra to see if there's more.
+        $search_engine->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1);
+        if (false === $search_engine->query($q)) {
+            $cnt = 0;
+        }
+        else {
+            $cnt = $profile->find();
+        }
+        if ($cnt > 0) {
+            $terms = preg_split('/[\s,]+/', $q);
+            $results = new PeopleSearchResults($profile, $terms, $this);
+            $results->show();
+            $profile->free();
+            $this->pagination($page > 1, $cnt > PROFILES_PER_PAGE,
+                          $page, 'peoplesearch', array('q' => $q));
 
-# XXX common parent for people and content search?
+        } else {
+            $this->element('p', 'error', _('No results.'));
+            $this->searchSuggestions($q);
+            $profile->free();
+        }
+    }
+}
 
-class PeoplesearchAction extends Action {
-       
-       function handle($args) {
-               parent::handle($args);
-               $this->show_form();
-       }
+/**
+ * People search results class
+ *
+ * Derivative of ProfileList with specialization for highlighting search terms.
+ *
+ * @category Widget
+ * @package  StatusNet
+ * @author   Evan Prodromou <evan@status.net>
+ * @author   Robin Millette <millette@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link     http://status.net/
+ *
+ * @see PeoplesearchAction
+ */
 
-       function get_instructions() {
-               return _t('Search for people on %%site.name%% by their name, location, or interests.');
-       }
-       
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-       }
-       
-       function show_form($error=NULL) {
-               $q = $this->trimmed('q');
-               $page = $this->trimmed('page', 1);
-               
-               common_show_header(_t('Find people'), NULL, $error, array($this, 'show_top'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url('peoplesearch')));
-               common_element_start('p');
-               common_element('input', array('name' => 'q',
-                                                                         'id' => 'q',
-                                                                         'type' => 'text',
-                                                                         'class' => 'input_text',
-                                                                         'value' => ($q) ? $q : ''));
-               common_text(' ');
-               common_element('input', array('type' => 'submit',
-                                                                         'id' => 'search',
-                                                                         'name' => 'search',
-                                                                         'class' => 'submit',
-                                                                         'value' => _t('Search')));
-                                          
-               common_element_end('p');
-               common_element_end('form');
-               if ($q) {
-                       $this->show_results($q, $page);
-               }
-               common_show_footer();
-       }
-       
-       function show_results($q, $page) {
-               
-               $profile = new Profile();
+class PeopleSearchResults extends ProfileList
+{
+    var $terms = null;
+    var $pattern = null;
 
-               # lcase it for comparison
-               $q = strtolower($q);
-               $profile->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' . 
-                                                  'against (\''.addslashes($q).'\')');
+    function __construct($profile, $terms, $action)
+    {
+        parent::__construct($profile, $action);
 
-               # Ask for an extra to see if there's more.
-               
-               $profile->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1);
+        $this->terms = array_map('preg_quote',
+                                 array_map('htmlspecialchars', $terms));
 
-               $cnt = $profile->find();
+        $this->pattern = '/('.implode('|',$terms).')/i';
+    }
 
-               if ($cnt > 0) {
-                       $terms = preg_split('/[\s,]+/', $q);
-                       common_element_start('ul', array('id' => 'profiles'));
-                       for ($i = 0; $i < min($cnt, PROFILES_PER_PAGE); $i++) {
-                               if ($profile->fetch()) {
-                                       $this->show_profile($profile, $terms);
-                               } else {
-                                       // shouldn't happen!
-                                       break;
-                               }
-                       }
-                       common_element_end('ul');
-               } else {
-                       common_element('p', 'error', _t('No results'));
-               }
-               
-               common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
-                                                 $page, 'peoplesearch', array('q' => $q));
-       }
-       
-       function show_profile($profile, $terms) {
-               common_element_start('li', array('class' => 'profile_single',
-                                                                                'id' => 'profile-' . $profile->id));
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-               common_element_start('a', array('href' => $profile->profileurl));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_STREAM_SIZE,
-                                                                       'height' => AVATAR_STREAM_SIZE,
-                                                                       'alt' =>
-                                                                       ($profile->fullname) ? $profile->fullname :
-                                                                       $profile->nickname));
-               common_element_end('a');
-               common_element_start('p');
-               common_element_start('a', array('href' => $profile->profileurl,
-                                                                               'class' => 'nickname'));
-               common_raw($this->highlight($profile->nickname, $terms));
-               common_element_end('a');
-               if ($profile->fullname) {
-                       common_text(' | ');
-                       common_element_start('span', 'fullname');
-                       common_raw($this->highlight($profile->fullname, $terms));
-                       common_element_end('span');
-               }
-               if ($profile->location) {
-                       common_text(' | ');
-                       common_element_start('span', 'location');
-                       common_raw($this->highlight($profile->location, $terms));
-                       common_element_end('span');
-               }
-               common_element_end('p');
-               if ($profile->homepage) {
-                       common_element_start('p', 'website');
-                       common_element('a', array('href' => $profile->homepage),
-                                                  $profile->homepage);
-                       common_element_end('p');
-               }
-               if ($profile->bio) {
-                       common_element_start('p', 'bio');
-                       common_raw($this->highlight($profile->bio, $terms));
-                       common_element_end('p');
-               }
-               common_element_end('li');
-       }
+    function newProfileItem($profile)
+    {
+        return new PeopleSearchResultItem($profile, $this->action);
+    }
+}
 
-       function highlight($text, $terms) {
-               $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
-               $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
-               return $result;
-       }
+class PeopleSearchResultItem extends ProfileListItem
+{
+    function highlight($text)
+    {
+        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
+    }
 }
+