]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Directory/actions/userdirectory.php
* Fix pagination
[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         common_set_returnto($this->selfUrl());
124
125         return true;
126     }
127
128     /**
129      * Handle request
130      *
131      * Shows the page
132      *
133      * @param array $args $_REQUEST args; handled in prepare()
134      *
135      * @return void
136      */
137     function handle($args)
138     {
139         parent::handle($args);
140         $this->showPage();
141     }
142
143     /**
144      * Show the page notice
145      *
146      * Shows instructions for the page
147      *
148      * @return void
149      */
150     function showPageNotice()
151     {
152         $instr  = $this->getInstructions();
153         $output = common_markup_to_html($instr);
154
155         $this->elementStart('div', 'instructions');
156         $this->raw($output);
157         $this->elementEnd('div');
158     }
159
160     /**
161      * Local navigation
162      *
163      * This page is part of the public group, so show that.
164      *
165      * @return void
166      */
167     function showLocalNav()
168     {
169         $nav = new PublicGroupNav($this);
170         $nav->show();
171     }
172
173     /**
174      * Content area
175      *
176      * Shows the list of popular notices
177      *
178      * @return void
179      */
180     function showContent()
181     {
182         // XXX Need search bar
183
184         $this->elementStart('div', array('id' => 'user_directory'));
185
186         $alphaNav = new AlphaNav($this, true, array('All'));
187         $alphaNav->show();
188
189         // XXX Maybe use a more specialized version of ProfileList here
190
191         $profile = $this->getUsers();
192         $cnt     = 0;
193
194         if (!empty($profile)) {
195             $profileList = new SubscriptionList(
196                 $profile,
197                 common_current_user(),
198                 $this
199             );
200
201             $cnt = $profileList->show();
202
203             if (0 == $cnt) {
204                 $this->showEmptyListMessage();
205             }
206         }
207
208         $this->pagination(
209             $this->page > 1,
210             $cnt > PROFILES_PER_PAGE,
211             $this->page,
212             'userdirectory',
213             array('filter' => $this->filter)
214         );
215
216         $this->elementEnd('div');
217
218     }
219
220     /*
221      * Get users filtered by the current filter and page
222      */
223     function getUsers()
224     {
225         $offset = ($this->page - 1) * PROFILES_PER_PAGE;
226         $limit  =  PROFILES_PER_PAGE + 1;
227
228         $profile = new Profile();
229
230         // XXX Any chance of SQL injection here?
231
232         if ($this->filter != 'all') {
233             $profile->whereAdd(
234                 sprintf('LEFT(lower(nickname), 1) = \'%s\'', $this->filter)
235             );
236         }
237
238         $profile->orderBy('created DESC, nickname');
239         $profile->limit($limit, $offset);
240
241         $profile->find();
242
243         return $profile;
244     }
245
246     /**
247      * Show a nice message when there's no search results
248      */
249     function showEmptyListMessage()
250     {
251         $message = sprintf(_m('No users starting with %s'), $this->filter);
252
253         $this->elementStart('div', 'guide');
254         $this->raw(common_markup_to_html($message));
255         $this->elementEnd('div');
256     }
257
258 }