Passed
Pull Request — master (#103)
by
unknown
03:08
created

searchuser.php (1 issue)

Severity
1
<?php
2
/**
3
 * Extended User Profile
4
 *
5
 * You may not change or alter any portion of this comment or credits
6
 * of supporting developers from this source code or any supporting source code
7
 * which is considered copyrighted (c) material of the original comment or credit authors.
8
 * This program is distributed in the hope that it will be useful,
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * @copyright       (c) 2000-2016 XOOPS Project (www.xoops.org)
13
 * @license             GNU GPL 2 (http://www.gnu.org/licenses/gpl-2.0.html)
14
 * @package             profile
15
 * @since               2.3.0
16
 * @author              Jan Pedersen
17
 * @author              Taiwen Jiang <[email protected]>
18
 */
19
20
use Xmf\Request;
21
use XoopsModules\Suico\IndexController;
22
23
$op = $_REQUEST['op'] ?? 'search';
24
25
switch ($op) {
26
    default:
27
    case 'search':
28
29
        $GLOBALS['xoopsOption']['template_main'] = 'suico_search.tpl';
30
        require __DIR__ . '/header.php';
31
32
        $myts       = MyTextSanitizer::getInstance();
33
        $controller = new IndexController($xoopsDB, $xoopsUser, $xoopsModule);
0 ignored issues
show
The call to XoopsModules\Suico\IndexController::__construct() has too many arguments starting with $xoopsModule. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

33
        $controller = /** @scrutinizer ignore-call */ new IndexController($xoopsDB, $xoopsUser, $xoopsModule);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
34
        $nbSections = $controller->getNumbersSections();
35
36
        $limit_default = 20;
37
38
        $groups                     = $GLOBALS['xoopsUser'] ? $GLOBALS['xoopsUser']->getGroups() : [XOOPS_GROUP_ANONYMOUS];
39
        $xoopsOption['cache_group'] = implode('', $groups);
40
        $searchable_types           = [
41
            'textbox',
42
            'select',
43
            'radio',
44
            'yesno',
45
            'date',
46
            'datetime',
47
            'timezone',
48
            'language',
49
        ];
50
51
        $sortby_arr = [];
52
53
        // Dynamic fields
54
        $profileHandler = $helper->getHandler('Profile');
55
        // Get fields
56
        $fields = $profileHandler->loadFields();
57
        // Get ids of fields that can be searched
58
        /* @var  XoopsGroupPermHandler $grouppermHandler */
59
        $grouppermHandler  = xoops_getHandler('groupperm');
60
        $searchable_fields = $grouppermHandler->getItemIds('profile_search', $groups, $GLOBALS['xoopsModule']->getVar('mid'));
61
62
        include_once $GLOBALS['xoops']->path('class/xoopsformloader.php');
63
        $searchform = new XoopsThemeForm('', 'searchform', 'searchuser.php', 'post');
64
65
        $name_tray = new XoopsFormElementTray(_US_NICKNAME);
66
        $name_tray->addElement(new XoopsFormSelectMatchOption('', 'uname_match'));
67
        $name_tray->addElement(new XoopsFormText('', 'uname', 35, 255));
68
        $searchform->addElement($name_tray);
69
70
        $email_tray = new XoopsFormElementTray(_US_EMAIL);
71
        $email_tray->addElement(new XoopsFormSelectMatchOption('', 'email_match'));
72
        $email_tray->addElement(new XoopsFormText('', 'email', 35, 255));
73
        $searchform->addElement($email_tray);
74
75
        // add search groups , only for Webmasters
76
        if ($GLOBALS['xoopsUser'] && $GLOBALS['xoopsUser']->isAdmin()) {
77
            $group_tray = new XoopsFormElementTray(_US_GROUPS);
78
            $group_tray->addElement(new XoopsFormSelectGroup('', 'selgroups', null, false, 5, true));
79
            $searchform->addElement($group_tray);
80
        }
81
82
        foreach (array_keys($fields) as $i) {
83
            if (!in_array($fields[$i]->getVar('field_id'), $searchable_fields) || !in_array($fields[$i]->getVar('field_type'), $searchable_types)) {
84
                continue;
85
            }
86
            $sortby_arr[$i] = $fields[$i]->getVar('field_title');
87
            switch ($fields[$i]->getVar('field_type')) {
88
                case 'textbox':
89
                    if (XOBJ_DTYPE_INT == $fields[$i]->getVar('field_valuetype')) {
90
                        $searchform->addElement(new XoopsFormText(sprintf(_MD_SUICO_LARGERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name') . '_larger', 35, 35));
91
                        $searchform->addElement(new XoopsFormText(sprintf(_MD_SUICO_SMALLERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name') . '_smaller', 35, 35));
92
                    } else {
93
                        $tray = new XoopsFormElementTray($fields[$i]->getVar('field_title'));
94
                        $tray->addElement(new XoopsFormSelectMatchOption('', $fields[$i]->getVar('field_name') . '_match'));
95
                        $tray->addElement(new XoopsFormText('', $fields[$i]->getVar('field_name'), 35, $fields[$i]->getVar('field_maxlength')));
96
                        $searchform->addElement($tray);
97
                        unset($tray);
98
                    }
99
                    break;
100
                case 'radio':
101
                case 'select':
102
                    $options = $fields[$i]->getVar('field_options');
103
                    $size    = min(count($options), 10);
104
                    $element = new XoopsFormSelect($fields[$i]->getVar('field_title'), $fields[$i]->getVar('field_name'), null, $size, true);
105
                    asort($options);
106
                    $element->addOptionArray($options);
107
                    $searchform->addElement($element);
108
                    unset($element);
109
                    break;
110
                case 'yesno':
111
                    $element = new XoopsFormSelect($fields[$i]->getVar('field_title'), $fields[$i]->getVar('field_name'), null, 2, true);
112
                    $element->addOption(1, _YES);
113
                    $element->addOption(0, _NO);
114
                    $searchform->addElement($element);
115
                    unset($element);
116
                    break;
117
                case 'date':
118
                case 'datetime':
119
                    $searchform->addElement(new XoopsFormTextDateSelect(sprintf(_MD_SUICO_LATERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name') . '_larger', 15, 1));
120
                    $searchform->addElement(new XoopsFormTextDateSelect(sprintf(_MD_SUICO_EARLIERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name') . '_smaller', 15, time()));
121
                    break;
122
                case 'timezone':
123
                    $element = new XoopsFormSelect($fields[$i]->getVar('field_title'), $fields[$i]->getVar('field_name'), null, 6, true);
124
                    include_once $GLOBALS['xoops']->path('class/xoopslists.php');
125
                    $element->addOptionArray(XoopsLists::getTimeZoneList());
126
                    $searchform->addElement($element);
127
                    unset($element);
128
                    break;
129
                case 'language':
130
                    $element = new XoopsFormSelectLang($fields[$i]->getVar('field_title'), $fields[$i]->getVar('field_name'), null, 6);
131
                    $searchform->addElement($element);
132
                    unset($element);
133
                    break;
134
            }
135
        }
136
        asort($sortby_arr);
137
        $sortby_arr    = array_merge(['' => _NONE, 'uname' => _US_NICKNAME, 'email' => _US_EMAIL], $sortby_arr);
138
        $sortby_select = new XoopsFormSelect(_MD_SUICO_SORTBY, 'sortby');
139
        $sortby_select->addOptionArray($sortby_arr);
140
        $searchform->addElement($sortby_select);
141
142
        $order_select = new XoopsFormRadio(_MD_SUICO_ORDER, 'order', 0);
143
        $order_select->addOption(0, _ASCENDING);
144
        $order_select->addOption(1, _DESCENDING);
145
        $searchform->addElement($order_select);
146
147
        $limit_text = new XoopsFormText(_MD_SUICO_PERPAGE, 'limit', 15, 10, $limit_default);
148
        $searchform->addElement($limit_text);
149
        $searchform->addElement(new XoopsFormHidden('op', 'results'));
150
        $searchform->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
151
152
        $searchform->assign($GLOBALS['xoopsTpl']);
153
        $GLOBALS['xoopsTpl']->assign('page_title', _MD_SUICO_SEARCH);
154
155
        //added count user
156
        /* @var XoopsMemberHandler $memberHandler */
157
        $memberHandler = xoops_getHandler('member');
158
        $acttotal      = $memberHandler->getUserCount(new Criteria('level', 0, '>'));
159
        $total         = sprintf(_MD_SUICO_ACTUS, "<span style='color:#ff0000;'>{$acttotal}</span>");
160
        $GLOBALS['xoopsTpl']->assign('total_users', $total);
161
        break;
162
    case 'results':
163
        $GLOBALS['xoopsOption']['template_main'] = 'suico_results.tpl';
164
        require __DIR__ . '/header.php';
165
166
        $myts       = MyTextSanitizer::getInstance();
167
        $controller = new IndexController($xoopsDB, $xoopsUser, $xoopsModule);
168
        $nbSections = $controller->getNumbersSections();
169
170
        $GLOBALS['xoopsTpl']->assign('page_title', _MD_SUICO_RESULTS);
171
        $xoBreadcrumbs[] = [
172
            'link'  => XOOPS_URL . '/modules/' . $GLOBALS['xoopsModule']->getVar('dirname', 'n') . '/searchuser.php',
173
            'title' => _SEARCH,
174
        ];
175
        $xoBreadcrumbs[] = ['title' => _MD_SUICO_RESULTS];
176
        /* @var XoopsMemberHandler $memberHandler */
177
        $memberHandler = xoops_getHandler('member');
178
        // Dynamic fields
179
        $profileHandler = $helper->getHandler('Profile');
180
        // Get fields
181
        $fields = $profileHandler->loadFields();
182
        // Get ids of fields that can be searched
183
        /* @var  XoopsGroupPermHandler $grouppermHandler */
184
        $grouppermHandler  = xoops_getHandler('groupperm');
185
        $searchable_fields = $grouppermHandler->getItemIds('profile_search', $groups, $GLOBALS['xoopsModule']->getVar('mid'));
186
        $searchvars        = [];
187
        $search_url        = [];
188
189
        $criteria = new CriteriaCompo(new Criteria('level', 0, '>'));
190
191
        if (isset($_REQUEST['uname']) && '' !== $_REQUEST['uname']) {
192
            $string = $myts->addSlashes(trim($_REQUEST['uname']));
193
            switch ($_REQUEST['uname_match']) {
194
                case XOOPS_MATCH_START:
195
                    $string .= '%';
196
                    break;
197
                case XOOPS_MATCH_END:
198
                    $string = '%' . $string;
199
                    break;
200
                case XOOPS_MATCH_CONTAIN:
201
                    $string = '%' . $string . '%';
202
                    break;
203
            }
204
            $criteria->add(new Criteria('uname', $string, 'LIKE'));
205
            $search_url[] = 'uname=' . $_REQUEST['uname'];
206
            $search_url[] = 'uname_match=' . $_REQUEST['uname_match'];
207
            $searchvars[] = 'uname';
208
        }
209
        if (isset($_REQUEST['email']) && '' !== $_REQUEST['email']) {
210
            $string = $myts->addSlashes(trim($_REQUEST['email']));
211
            switch ($_REQUEST['email_match']) {
212
                case XOOPS_MATCH_START:
213
                    $string .= '%';
214
                    break;
215
                case XOOPS_MATCH_END:
216
                    $string = '%' . $string;
217
                    break;
218
                case XOOPS_MATCH_CONTAIN:
219
                    $string = '%' . $string . '%';
220
                    break;
221
            }
222
            $searchvars[] = 'email';
223
            $search_url[] = 'email=' . $_REQUEST['email'];
224
            $search_url[] = 'email_match=' . $_REQUEST['email_match'];
225
            $criteria->add(new Criteria('email', $string, 'LIKE'));
226
            $criteria->add(new Criteria('user_viewemail', 1));
227
        }
228
229
        //$search_url = array();
230
        foreach (array_keys($fields) as $i) {
231
            //Radio and Select fields
232
            if (!in_array($fields[$i]->getVar('field_id'), $searchable_fields) || !in_array($fields[$i]->getVar('field_type'), $searchable_types)) {
233
                continue;
234
            }
235
            $fieldname = $fields[$i]->getVar('field_name');
236
            if (in_array($fields[$i]->getVar('field_type'), ['select', 'radio'])) {
237
                if (empty($_REQUEST[$fieldname])) {
238
                    continue;
239
                }
240
241
                //If field value is sent through request and is not an empty value
242
                switch ($fields[$i]->getVar('field_valuetype')) {
243
                    case XOBJ_DTYPE_OTHER:
244
                    case XOBJ_DTYPE_INT:
245
                        $value        = array_map('\intval', $_REQUEST[$fieldname]);
246
                        $searchvars[] = $fieldname;
247
                        $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
248
                        break;
249
                    case XOBJ_DTYPE_URL:
250
                    case XOBJ_DTYPE_TXTBOX:
251
                    case XOBJ_DTYPE_TXTAREA:
252
                        $value        = array_map([$GLOBALS['xoopsDB'], 'quoteString'], $_REQUEST[$fieldname]);
253
                        $searchvars[] = $fieldname;
254
                        $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
255
                        break;
256
                }
257
                foreach ($_REQUEST[$fieldname] as $value) {
258
                    $search_url[] = $fieldname . '[]=' . $value;
259
                }
260
            } else {
261
                //Other fields (not radio, not select)
262
                switch ($fields[$i]->getVar('field_valuetype')) {
263
                    case XOBJ_DTYPE_OTHER:
264
                    case XOBJ_DTYPE_INT:
265
                        switch ($fields[$i]->getVar('field_type')) {
266
                            case 'date':
267
                            case 'datetime':
268
                                $value = $_REQUEST[$fieldname . '_larger'];
269
                                if (!($value = strtotime($_REQUEST[$fieldname . '_larger']))) {
270
                                    $value = (int)$_REQUEST[$fieldname . '_larger'];
271
                                }
272
                                if ($value > 0) {
273
                                    $search_url[] = $fieldname . '_larger=' . $value;
274
                                    $searchvars[] = $fieldname;
275
                                    $criteria->add(new Criteria($fieldname, $value, '>='));
276
                                }
277
278
                                $value = $_REQUEST[$fieldname . '_smaller'];
279
                                if (!($value = strtotime($_REQUEST[$fieldname . '_smaller']))) {
280
                                    $value = (int)$_REQUEST[$fieldname . '_smaller'];
281
                                }
282
                                if ($value > 0) {
283
                                    $search_url[] = $fieldname . '_smaller=' . $value;
284
                                    $searchvars[] = $fieldname;
285
                                    $criteria->add(new Criteria($fieldname, $value + 24 * 3600, '<='));
286
                                }
287
                                break;
288
                            default:
289
                                if (isset($_REQUEST[$fieldname . '_larger']) && 0 !== (int)$_REQUEST[$fieldname . '_larger']) {
290
                                    $value        = (int)$_REQUEST[$fieldname . '_larger'];
291
                                    $search_url[] = $fieldname . '_larger=' . $value;
292
                                    $searchvars[] = $fieldname;
293
                                    $criteria->add(new Criteria($fieldname, $value, '>='));
294
                                }
295
296
                                if (isset($_REQUEST[$fieldname . '_smaller']) && 0 !== (int)$_REQUEST[$fieldname . '_smaller']) {
297
                                    $value        = (int)$_REQUEST[$fieldname . '_smaller'];
298
                                    $search_url[] = $fieldname . '_smaller=' . $value;
299
                                    $searchvars[] = $fieldname;
300
                                    $criteria->add(new Criteria($fieldname, $value, '<='));
301
                                }
302
                                break;
303
                        }
304
305
                        if (isset($_REQUEST[$fieldname]) && !isset($_REQUEST[$fieldname . '_smaller']) && !isset($_REQUEST[$fieldname . '_larger'])) {
306
                            if (!is_array($_REQUEST[$fieldname])) {
307
                                $value        = (int)$_REQUEST[$fieldname];
308
                                $search_url[] = $fieldname . '=' . $value;
309
                                $criteria->add(new Criteria($fieldname, $value, '='));
310
                            } else {
311
                                $value = array_map('\intval', $_REQUEST[$fieldname]);
312
                                foreach ($value as $thisvalue) {
313
                                    $search_url[] = $fieldname . '[]=' . $thisvalue;
314
                                }
315
                                $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
316
                            }
317
318
                            $searchvars[] = $fieldname;
319
                        }
320
                        break;
321
                    case XOBJ_DTYPE_URL:
322
                    case XOBJ_DTYPE_TXTBOX:
323
                    case XOBJ_DTYPE_TXTAREA:
324
                        if (isset($_REQUEST[$fieldname]) && '' !== $_REQUEST[$fieldname]) {
325
                            $value = $myts->addSlashes(trim($_REQUEST[$fieldname]));
326
                            switch ($_REQUEST[$fieldname . '_match']) {
327
                                case XOOPS_MATCH_START:
328
                                    $value .= '%';
329
                                    break;
330
                                case XOOPS_MATCH_END:
331
                                    $value = '%' . $value;
332
                                    break;
333
                                case XOOPS_MATCH_CONTAIN:
334
                                    $value = '%' . $value . '%';
335
                                    break;
336
                            }
337
                            $search_url[] = $fieldname . '=' . $_REQUEST[$fieldname];
338
                            $search_url[] = $fieldname . '_match=' . $_REQUEST[$fieldname . '_match'];
339
                            $operator     = 'LIKE';
340
                            $criteria->add(new Criteria($fieldname, $value, $operator));
341
                            $searchvars[] = $fieldname;
342
                        }
343
                        break;
344
                }
345
            }
346
        }
347
348
        //        if ($_REQUEST['sortby'] == "name") {
349
        //            $criteria->setSort("name");
350
        //        } else if ($_REQUEST['sortby'] == "email") {
351
        //            $criteria->setSort("email");
352
        //        } else if ($_REQUEST['sortby'] == "uname") {
353
        //            $criteria->setSort("uname");
354
        //        } else if (isset($fields[$_REQUEST['sortby']])) {
355
        //            $criteria->setSort($fields[$_REQUEST['sortby']]->getVar('field_name'));
356
        //        }
357
358
        // change by zyspec:
359
        $sortby = 'uname';
360
        if (!empty($_REQUEST['sortby'])) {
361
            switch ($_REQUEST['sortby']) {
362
                case 'name':
363
                case 'email':
364
                case 'uname':
365
                    $sortby = $_REQUEST['sortby'];
366
                    break;
367
                default:
368
                    if (isset($fields[$_REQUEST['sortby']])) {
369
                        $sortby = $fields[$_REQUEST['sortby']]->getVar('field_name');
370
                    }
371
                    break;
372
            }
373
            $criteria->setSort($sortby);
374
        }
375
376
        // add search groups , only for Webmasters
377
        $searchgroups = [];
378
        if ($GLOBALS['xoopsUser'] && $GLOBALS['xoopsUser']->isAdmin()) {
379
            $searchgroups = empty($_REQUEST['selgroups']) ? [] : array_map('\intval', $_REQUEST['selgroups']);
380
            foreach ($searchgroups as $group) {
381
                $search_url[] = 'selgroups[]=' . $group;
382
            }
383
        }
384
385
        $order = 0 == $_REQUEST['order'] ? 'ASC' : 'DESC';
386
        $criteria->setOrder($order);
387
388
        $limit = empty($_REQUEST['limit']) ? $limit_default : (int)$_REQUEST['limit'];
389
        $criteria->setLimit($limit);
390
391
        $start = isset($_REQUEST['start']) ? (int)$_REQUEST['start'] : 0;
392
        $criteria->setStart($start);
393
394
        [$users, $profiles, $total_users] = $profileHandler->search($criteria, $searchvars, $searchgroups);
395
396
        $total = sprintf(_MD_SUICO_FOUNDUSER, "<span class='red'>{$total_users}</span>") . ' ';
397
        $GLOBALS['xoopsTpl']->assign('total_users', $total);
398
399
        //Sort information
400
        foreach (array_keys($users) as $k) {
401
            $userarray             = [];
402
            $userarray['output'][] = "<a href='userinfo.php?uid=" . $users[$k]->getVar('uid') . "' title=''>" . $users[$k]->getVar('uname') . '</a>';
403
            $userarray['output'][] = (1 == $users[$k]->getVar('user_viewemail') || (is_object($GLOBALS['xoopsUser']) && $GLOBALS['xoopsUser']->isAdmin())) ? $users[$k]->getVar('email') : '';
404
405
            foreach (array_keys($fields) as $i) {
406
                if (in_array($fields[$i]->getVar('field_id'), $searchable_fields) && in_array($fields[$i]->getVar('field_type'), $searchable_types) && in_array($fields[$i]->getVar('field_name'), $searchvars)) {
407
                    $userarray['output'][] = $fields[$i]->getOutputValue($users[$k], $profiles[$k]);
408
                }
409
            }
410
            $GLOBALS['xoopsTpl']->append('users', $userarray);
411
            unset($userarray);
412
        }
413
414
        //Get captions
415
        $captions[] = _US_NICKNAME;
416
        $captions[] = _US_EMAIL;
417
        foreach (array_keys($fields) as $i) {
418
            if (in_array($fields[$i]->getVar('field_id'), $searchable_fields) && in_array($fields[$i]->getVar('field_type'), $searchable_types) && in_array($fields[$i]->getVar('field_name'), $searchvars)) {
419
                $captions[] = $fields[$i]->getVar('field_title');
420
            }
421
        }
422
        $GLOBALS['xoopsTpl']->assign('captions', $captions);
423
424
        if ($total_users > $limit) {
425
            $search_url[] = 'op=results';
426
            $search_url[] = 'order=' . $order;
427
            //TODO remove it for final release
428
            //            $search_url[] = "sortby=" . htmlspecialchars($_REQUEST['sortby']);
429
            $search_url[] = 'sortby=' . htmlspecialchars($sortby, ENT_QUOTES | ENT_HTML5); // change by zyspec
430
            $search_url[] = 'limit=' . $limit;
431
            if (isset($search_url)) {
432
                $args = implode('&amp;', $search_url);
433
            }
434
435
            include_once $GLOBALS['xoops']->path('class/pagenav.php');
436
            $nav = new XoopsPageNav($total_users, $limit, $start, 'start', $args);
437
            $GLOBALS['xoopsTpl']->assign('nav', $nav->renderNav(5));
438
        }
439
        break;
440
}
441
require __DIR__ . '/footer.php';
442
require dirname(__DIR__, 2) . '/footer.php';
443