]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Directory/actions/userdirectory.php
Merge branch '1.0.x' into directory
[quix0rs-gnu-social.git] / plugins / Directory / actions / userdirectory.php
1 <?php
2 /**
3  * StatusNet, the distributed open-source microblogging tool
4  *
5  * Output a user directory
6  *
7  * PHP version 5
8  *
9  * LICENCE: This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU Affero General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Affero General Public License for more details.
18  *
19  * You should have received a copy of the GNU Affero General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  * @category  Public
23  * @package   StatusNet
24  * @author    Zach Copley <zach@status.net>
25  * @copyright 2011 StatusNet, Inc.
26  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
27  * @link      http://status.net/
28  */
29
30 if (!defined('STATUSNET'))
31 {
32     exit(1);
33 }
34
35 require_once INSTALLDIR . '/lib/publicgroupnav.php';
36
37 /**
38  * User directory
39  *
40  * @category Personal
41  * @package  StatusNet
42  * @author   Zach Copley <zach@status.net>
43  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
44  * @link     http://status.net/
45  */
46 class UserdirectoryAction extends Action
47 {
48     /**
49      * @var $page       integer  the page we're on
50      */
51     protected $page   = null;
52
53     /**
54      * @var $filter     string    what to filter the search results by
55      */
56     protected $filter = null;
57
58     /**
59      * Title of the page
60      *
61      * @return string Title of the page
62      */
63     function title()
64     {
65         // @fixme: This looks kinda gross
66
67         if ($this->filter == 'all') {
68             if ($this->page != 1) {
69                 return(sprintf(_m('All users, page %d'), $this->page));
70             }
71             return _m('All users');
72         }
73
74         if ($this->page == 1) {
75             return sprintf(
76                 _m('Users with nicknames beginning with %s'),
77                 $this->filter
78             );
79         } else {
80             return sprintf(
81                 _m('Users with nicknames starting with %s, page %d'),
82                 $this->filter,
83                 $this->page
84             );
85         }
86     }
87
88     /**
89      * Instructions for use
90      *
91      * @return instructions for use
92      */
93     function getInstructions()
94     {
95         return _('User directory');
96     }
97
98     /**
99      * Is this page read-only?
100      *
101      * @return boolean true
102      */
103     function isReadOnly($args)
104     {
105         return true;
106     }
107
108     /**
109      * Take arguments for running
110      *
111      * @param array $args $_REQUEST args
112      *
113      * @return boolean success flag
114      *
115      * @todo move queries from showContent() to here
116      */
117     function prepare($args)
118     {
119         parent::prepare($args);
120
121         $this->page   = ($this->arg('page')) ? ($this->arg('page') + 0) : 1;
122         $this->filter = $this->arg('filter') ? $this->arg('filter') : 'all';
123         $this->sort   = $this->arg('sort');
124         $this->order  = $this->boolean('asc'); // ascending or decending
125
126         common_set_returnto($this->selfUrl());
127
128         return true;
129     }
130
131     /**
132      * Handle request
133      *
134      * Shows the page
135      *
136      * @param array $args $_REQUEST args; handled in prepare()
137      *
138      * @return void
139      */
140     function handle($args)
141     {
142         parent::handle($args);
143         $this->showPage();
144     }
145
146     /**
147      * Show the page notice
148      *
149      * Shows instructions for the page
150      *
151      * @return void
152      */
153     function showPageNotice()
154     {
155         $instr  = $this->getInstructions();
156         $output = common_markup_to_html($instr);
157
158         $this->elementStart('div', 'instructions');
159         $this->raw($output);
160         $this->elementEnd('div');
161     }
162
163     /**
164      * Local navigation
165      *
166      * This page is part of the public group, so show that.
167      *
168      * @return void
169      */
170     function showLocalNav()
171     {
172         $nav = new PublicGroupNav($this);
173         $nav->show();
174     }
175
176     /**
177      * Content area
178      *
179      * Shows the list of popular notices
180      *
181      * @return void
182      */
183     function showContent()
184     {
185         // XXX Need search bar
186
187         $this->elementStart('div', array('id' => 'user_directory'));
188
189         $alphaNav = new AlphaNav($this, true, array('All'));
190         $alphaNav->show();
191
192         // XXX Maybe use a more specialized version of ProfileList here
193
194         $profile = $this->getUsers();
195         $cnt     = 0;
196
197         if (!empty($profile)) {
198             $profileList = new SortableSubscriptionList(
199                 $profile,
200                 common_current_user(),
201                 $this
202             );
203
204             $cnt = $profileList->show();
205
206             if (0 == $cnt) {
207                 $this->showEmptyListMessage();
208             }
209         }
210
211         $this->pagination(
212             $this->page > 1,
213             $cnt > PROFILES_PER_PAGE,
214             $this->page,
215             'userdirectory',
216             array('filter' => $this->filter)
217         );
218
219         $this->elementEnd('div');
220
221     }
222
223     /*
224      * Get users filtered by the current filter and page
225      */
226     function getUsers()
227     {
228         $offset = ($this->page - 1) * PROFILES_PER_PAGE;
229         $limit  =  PROFILES_PER_PAGE + 1;
230
231         $profile = new Profile();
232
233         // XXX Any chance of SQL injection here?
234
235         if ($this->filter != 'all') {
236             $profile->whereAdd(
237                 sprintf('LEFT(lower(nickname), 1) = \'%s\'', $this->filter)
238             );
239         }
240
241         $sort  = $this->getSortKey();
242         $order = ($this->order) ? 'ASC' : 'DESC';
243
244         $profile->orderBy("$sort $order, nickname");
245         $profile->limit($limit, $offset);
246
247         $profile->find();
248
249         return $profile;
250     }
251
252     /**
253      * Filter the sort parameter
254      *
255      * @return string   a column name for sorting
256      */
257     function getSortKey()
258     {
259         switch ($this->sort) {
260         case 'nickname':
261             return $this->sort;
262             break;
263         case 'created':
264             return $this->sort;
265             break;
266         default:
267             return 'nickname';
268         }
269     }
270
271     /**
272      * Show a nice message when there's no search results
273      */
274     function showEmptyListMessage()
275     {
276         $message = sprintf(_m('No users starting with %s'), $this->filter);
277
278         $this->elementStart('div', 'guide');
279         $this->raw(common_markup_to_html($message));
280         $this->elementEnd('div');
281     }
282
283 }