Passed
Push — master ( b149e1...cca0b5 )
by
unknown
06:07 queued 03:08
created

search.php (2 issues)

Labels
Severity
1
<?php declare(strict_types=1);
2
3
/*
4
 You may not change or alter any portion of this comment or credits
5
 of supporting developers from this source code or any supporting source code
6
 which is considered copyrighted (c) material of the original comment or credit authors.
7
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
13
/**
14
 * @copyright    XOOPS Project https://xoops.org/
15
 * @license      GNU GPL 2 or later (http://www.gnu.org/licenses/gpl-2.0.html)
16
 * @author       Marcello Brandão aka  Suico
17
 * @author       XOOPS Development Team
18
 * @since
19
 */
20
21
use Xmf\Request;
22
23
require __DIR__ . '/header.php';
24
25
$myts   = MyTextSanitizer::getInstance();
26
$op     = Request::getString('op', 'search');
27
$groups = $xoopsUser ? $xoopsUser->getGroups() : [XOOPS_GROUP_ANONYMOUS];
28
switch ($op) {
29
    default:
30
    case 'search':
31
        $xoopsOption['cache_group']              = implode('', $groups);
32
        $GLOBALS['xoopsOption']['template_main'] = 'yogurt_search.tpl';
33
        require XOOPS_ROOT_PATH . '/header.php';
34
35
        // Dynamic fields
36
        $profileHandler = xoops_getModuleHandler('profile');
37
        // Get fields
38
        $fields = $profileHandler->loadFields();
39
        // Get ids of fields that can be searched
40
        $gpermHandler      = xoops_getHandler('groupperm');
41
        $searchable_fields = $gpermHandler->getItemIds('smartprofile_search', $groups, $xoopsModule->getVar('mid'));
0 ignored issues
show
The method getItemIds() does not exist on XoopsObjectHandler. It seems like you code against a sub-type of XoopsObjectHandler such as XoopsGroupPermHandler or XoopsPersistableObjectHandler. ( Ignorable by Annotation )

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

41
        /** @scrutinizer ignore-call */ 
42
        $searchable_fields = $gpermHandler->getItemIds('smartprofile_search', $groups, $xoopsModule->getVar('mid'));
Loading history...
42
43
        require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
44
        $searchform = new XoopsThemeForm('', 'searchform', 'search.php', 'post');
45
46
        $name_tray = new XoopsFormElementTray(_MD_YOGURT_PROFILE_DISPLAYNAME);
47
        $name_tray->addElement(new XoopsFormSelectMatchOption('', 'uname_match'));
48
        $name_tray->addElement(new XoopsFormText('', 'uname', 35, 255));
49
        $searchform->addElement($name_tray);
50
        $sortby_arr['uname'] = _MD_YOGURT_PROFILE_DISPLAYNAME;
51
52
        $email_tray = new XoopsFormElementTray(_MD_YOGURT_PROFILE_EMAIL);
53
        $email_tray->addElement(new XoopsFormSelectMatchOption('', 'email_match'));
54
        $email_tray->addElement(new XoopsFormText('', 'email', 35, 255));
55
        $searchform->addElement($email_tray);
56
        $sortby_arr['email'] = _MD_YOGURT_PROFILE_EMAIL;
57
58
        $searchable_types = [
59
            'textbox',
60
            'select',
61
            'radio',
62
            'yesno',
63
            'date',
64
            'datetime',
65
            'timezone',
66
            'language',
67
        ];
68
        foreach (array_keys($fields) as $i) {
69
            if (in_array($fields[$i]->getVar('fieldid'), $searchable_fields, true)
70
                && in_array(
71
                    $fields[$i]->getVar('field_type'),
72
                    $searchable_types,
73
                    true
74
                )) {
75
                $sortby_arr[$fields[$i]->getVar('fieldid')] = $fields[$i]->getVar('field_title');
76
                switch ($fields[$i]->getVar('field_type')) {
77
                    case 'textbox':
78
                        if (XOBJ_DTYPE_INT === $fields[$i]->getVar('field_valuetype')) {
79
                            $searchform->addElement(
80
                                new XoopsFormText(
81
                                    sprintf(
82
                                        _MD_YOGURT_PROFILE_LARGERTHAN,
83
                                        $fields[$i]->getVar('field_title')
84
                                    ),
85
                                    $fields[$i]->getVar(
86
                                        'field_name'
87
                                    ) . '_larger',
88
                                    35,
89
                                    35
90
                                )
91
                            );
92
                            $searchform->addElement(
93
                                new XoopsFormText(
94
                                    sprintf(
95
                                        _MD_YOGURT_PROFILE_SMALLERTHAN,
96
                                        $fields[$i]->getVar('field_title')
97
                                    ),
98
                                    $fields[$i]->getVar(
99
                                        'field_name'
100
                                    ) . '_smaller',
101
                                    35,
102
                                    35
103
                                )
104
                            );
105
                        } else {
106
                            $tray = new XoopsFormElementTray($fields[$i]->getVar('field_title'));
107
                            $tray->addElement(
108
                                new XoopsFormSelectMatchOption('', $fields[$i]->getVar('field_name') . '_match')
109
                            );
110
                            $tray->addElement(
111
                                new XoopsFormText(
112
                                    '',
113
                                    $fields[$i]->getVar('field_name'),
114
                                    35,
115
                                    $fields[$i]->getVar(
116
                                        'field_maxlength'
117
                                    )
118
                                )
119
                            );
120
                            $searchform->addElement($tray);
121
                            unset($tray);
122
                        }
123
                        break;
124
                    case 'radio':
125
                    case 'select':
126
                        $size    = count($fields[$i]->getVar('field_options')) > 10 ? 10 : count(
127
                            $fields[$i]->getVar('field_options')
128
                        );
129
                        $element = new XoopsFormSelect(
130
                            $fields[$i]->getVar('field_title'),
131
                            $fields[$i]->getVar(
132
                                'field_name'
133
                            ),
134
                            null,
135
                            $size,
136
                            true
137
                        );
138
                        $options = $fields[$i]->getVar('field_options');
139
                        asort($options);
140
                        $element->addOptionArray($options);
141
                        $searchform->addElement($element);
142
                        unset($element);
143
                        break;
144
                    case 'yesno':
145
                        $element = new XoopsFormSelect(
146
                            $fields[$i]->getVar('field_title'),
147
                            $fields[$i]->getVar(
148
                                'field_name'
149
                            ),
150
                            null,
151
                            2,
152
                            true
153
                        );
154
                        $element->addOption(1, _YES);
155
                        $element->addOption(0, _NO);
156
                        $searchform->addElement($element);
157
                        unset($element);
158
                        break;
159
                    case 'date':
160
                    case 'datetime':
161
                        $searchform->addElement(
162
                            new XoopsFormTextDateSelect(
163
                                sprintf(
164
                                    _MD_YOGURT_PROFILE_LATERTHAN,
165
                                    $fields[$i]->getVar('field_title')
166
                                ),
167
                                $fields[$i]->getVar(
168
                                    'field_name'
169
                                ) . '_larger',
170
                                15,
171
                                0
172
                            )
173
                        );
174
                        $searchform->addElement(
175
                            new XoopsFormTextDateSelect(
176
                                sprintf(
177
                                    _MD_YOGURT_PROFILE_EARLIERTHAN,
178
                                    $fields[$i]->getVar('field_title')
179
                                ),
180
                                $fields[$i]->getVar(
181
                                    'field_name'
182
                                ) . '_smaller',
183
                                15,
184
                                time()
185
                            )
186
                        );
187
                        break;
188
                    //                    case "datetime":
189
                    //                        $searchform->addElement(new XoopsFormDateTime(sprintf(_MD_YOGURT_PROFILE_LATERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name')."_larger", 15, 1));
190
                    //                        $searchform->addElement(new XoopsFormDateTime(sprintf(_MD_YOGURT_PROFILE_EARLIERTHAN, $fields[$i]->getVar('field_title')), $fields[$i]->getVar('field_name')."_smaller", 15, 0));
191
                    //                        break;
192
193
                    case 'timezone':
194
                        $element = new XoopsFormSelect(
195
                            $fields[$i]->getVar('field_title'),
196
                            $fields[$i]->getVar(
197
                                'field_name'
198
                            ),
199
                            null,
200
                            6,
201
                            true
202
                        );
203
                        require_once XOOPS_ROOT_PATH . '/class/xoopslists.php';
204
                        $element->addOptionArray(XoopsLists::getTimeZoneList());
205
                        $searchform->addElement($element);
206
                        unset($element);
207
                        break;
208
                    case 'language':
209
                        $element = new XoopsFormSelectLang(
210
                            $fields[$i]->getVar('field_title'),
211
                            $fields[$i]->getVar(
212
                                'field_name'
213
                            ),
214
                            null,
215
                            6
216
                        );
217
                        $searchform->addElement($element);
218
                        unset($element);
219
                        break;
220
                }
221
            }
222
        }
223
        asort($sortby_arr);
224
        $sortby_select = new XoopsFormSelect(_MD_YOGURT_PROFILE_SORTBY, 'sortby');
225
        $sortby_select->addOptionArray($sortby_arr);
226
        $searchform->addElement($sortby_select);
227
228
        $order_select = new XoopsFormRadio(_MD_YOGURT_PROFILE_ORDER, 'order', 0);
229
        $order_select->addOption(0, _ASCENDING);
230
        $order_select->addOption(1, _DESCENDING);
231
        $searchform->addElement($order_select);
232
233
        $limit_text = new XoopsFormText(_MD_YOGURT_PROFILE_PERPAGE, 'limit', 15, 10);
234
        $searchform->addElement($limit_text);
235
        $searchform->addElement(new XoopsFormHidden('op', 'results'));
236
237
        $searchform->addElement(new XoopsFormButton('', 'submit', _SUBMIT, 'submit'));
238
239
        $searchform->assign($xoopsTpl);
240
        break;
241
    case 'results':
242
        $GLOBALS['xoopsOption']['template_main'] = 'smartprofile_results.tpl';
243
        require_once XOOPS_ROOT_PATH . '/header.php';
244
245
        $memberHandler = xoops_getHandler('member');
246
        // Dynamic fields
247
        $profileHandler = xoops_getModuleHandler('profile');
248
        // Get fields
249
        $fields = $profileHandler->loadFields();
250
        // Get ids of fields that can be searched
251
        $gpermHandler      = xoops_getHandler('groupperm');
252
        $searchable_fields = $gpermHandler->getItemIds('smartprofile_search', $groups, $xoopsModule->getVar('mid'));
253
        $searchvars        = [];
254
255
        $criteria = new CriteriaCompo(new Criteria('level', 0, '>'));
256
        if (isset($_REQUEST['uname']) && '' !== Request::getString('uname', '', 'REQUEST')) {
257
            $string = $myts->addSlashes(trim(Request::getString('uname', '', 'REQUEST')));
258
            switch ($_REQUEST['uname_match']) {
259
                case XOOPS_MATCH_START:
260
                    $string .= '%';
261
                    break;
262
                case XOOPS_MATCH_END:
263
                    $string = '%' . $string;
264
                    break;
265
                case XOOPS_MATCH_CONTAIN:
266
                    $string = '%' . $string . '%';
267
                    break;
268
            }
269
            $criteria->add(new Criteria('uname', $string, 'LIKE'));
270
            $searchvars[] = 'uname';
271
        }
272
        if (isset($_REQUEST['email']) && '' !== Request::getString('email', '', 'REQUEST')) {
273
            $string = $myts->addSlashes(trim(Request::getString('email', '', 'REQUEST')));
274
            switch (Request::getString('email_match', '', 'REQUEST')) {
275
                case XOOPS_MATCH_START:
276
                    $string .= '%';
277
                    break;
278
                case XOOPS_MATCH_END:
279
                    $string = '%' . $string;
280
                    break;
281
                case XOOPS_MATCH_CONTAIN:
282
                    $string = '%' . $string . '%';
283
                    break;
284
            }
285
            $searchvars[] = 'email';
286
            $criteria->add(new Criteria('email', $string, 'LIKE'));
287
            $criteria->add(new Criteria('user_viewemail', 1));
288
        }
289
        $searchable_types = [
290
            'textbox',
291
            'select',
292
            'radio',
293
            'yesno',
294
            'date',
295
            'datetime',
296
            'timezone',
297
            'language',
298
        ];
299
300
        foreach (array_keys($fields) as $i) {
301
            if (in_array($fields[$i]->getVar('fieldid'), $searchable_fields, true)
302
                && in_array(
303
                    $fields[$i]->getVar('field_type'),
304
                    $searchable_types,
305
                    true
306
                )) {
307
                $fieldname = $fields[$i]->getVar('field_name');
308
                if (in_array($fields[$i]->getVar('field_type'), ['select', 'radio'], true)) {
309
                    if (isset($_REQUEST[$fieldname]) && $_REQUEST[$fieldname]) {
310
                        //If field value is sent through request and is not an empty value
311
                        switch ($fields[$i]->getVar(
312
                            'field_valuetype'
313
                        )) {
314
                            case XOBJ_DTYPE_OTHER:
315
                            case XOBJ_DTYPE_INT:
316
                                $value        = array_map('\intval', $_REQUEST[$fieldname]);
317
                                $searchvars[] = $fieldname;
318
                                $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
319
                                break;
320
                            case XOBJ_DTYPE_URL:
321
                            case XOBJ_DTYPE_TXTBOX:
322
                            case XOBJ_DTYPE_TXTAREA:
323
                                $value        = array_map([$xoopsDB, 'quoteString'], $_REQUEST[$fieldname]);
324
                                $searchvars[] = $fieldname;
325
                                $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
326
                                break;
327
                        }
328
                    }
329
                } else {
330
                    switch ($fields[$i]->getVar('field_valuetype')) {
331
                        case XOBJ_DTYPE_OTHER:
332
                        case XOBJ_DTYPE_INT:
333
                            switch ($fields[$i]->getVar('field_type')) {
334
                                case 'date':
335
                                case 'datetime':
336
                                    $value = $_REQUEST[$fieldname . '_larger'];
337
                                    if (!($value = strtotime($_REQUEST[$fieldname . '_larger']))) {
338
                                        $value = (int)$_REQUEST[$fieldname . '_larger'];
339
                                    }
340
                                    if ($value > 0) {
341
                                        $search_url[] = $fieldname . '_larger=' . $value;
342
                                        $searchvars[] = $fieldname;
343
                                        $criteria->add(new Criteria($fieldname, $value, '>='));
344
                                    }
345
346
                                    $value = $_REQUEST[$fieldname . '_smaller'];
347
                                    if (!($value = strtotime($_REQUEST[$fieldname . '_smaller']))) {
348
                                        $value = (int)$_REQUEST[$fieldname . '_smaller'];
349
                                    }
350
                                    if ($value > 0) {
351
                                        $search_url[] = $fieldname . '_smaller=' . $value;
352
                                        $searchvars[] = $fieldname;
353
                                        $criteria->add(new Criteria($fieldname, $value, '<='));
354
                                    }
355
                                    break;
356
                                //                                case "datetime":
357
                                //                                    $value = $_REQUEST[$fieldname."_larger"]['date'];
358
                                //                                    if (intval($value) < 0) { //intval() of a date string is -1
359
                                //                                        $value = strtotime($_REQUEST[$fieldname."_larger"]['date']);
360
                                //                                    }
361
                                //                                    else {
362
                                //                                        $value = intval($_REQUEST[$fieldname."_larger"]['date']);
363
                                //                                    }
364
                                //                                    $search_url[] = $fieldname."_larger=".$value;
365
                                //                                    $searchvars[] = $fieldname;
366
                                //                                    $criteria->add(new Criteria($fieldname, $value, ">="));
367
                                //
368
                                //                                    $value = $_REQUEST[$fieldname."_smaller"]['date'];
369
                                //                                    if (intval($value) < 0) { //intval() of a date string is -1
370
                                //                                        $value = strtotime($_REQUEST[$fieldname."_smaller"]['date']);
371
                                //                                    }
372
                                //                                    else {
373
                                //                                        $value = intval($_REQUEST[$fieldname."_smaller"]['date']);
374
                                //                                    }
375
                                //                                    $search_url[] = $fieldname."_smaller=".$value;
376
                                //                                    $searchvars[] = $fieldname;
377
                                //                                    $criteria->add(new Criteria($fieldname, $value, "<="));
378
                                //                                    break;
379
380
                                default:
381
                                    if (isset($_REQUEST[$fieldname . '_larger']) && 0 !== (int)$_REQUEST[$fieldname . '_larger']) {
382
                                        $value        = (int)$_REQUEST[$fieldname . '_larger'];
383
                                        $search_url[] = $fieldname . '_larger=' . $value;
384
                                        $searchvars[] = $fieldname;
385
                                        $criteria->add(new Criteria($fieldname, $value, '>='));
386
                                    }
387
388
                                    if (isset($_REQUEST[$fieldname . '_smaller']) && 0 !== (int)$_REQUEST[$fieldname . '_smaller']) {
389
                                        $value        = (int)$_REQUEST[$fieldname . '_smaller'];
390
                                        $search_url[] = $fieldname . '_smaller=' . $value;
391
                                        $searchvars[] = $fieldname;
392
                                        $criteria->add(new Criteria($fieldname, $value, '<='));
393
                                    }
394
                                    break;
395
                            }
396
397
                            if (isset($_REQUEST[$fieldname]) && !isset($_REQUEST[$fieldname . '_smaller']) && !isset($_REQUEST[$fieldname . '_larger'])) {
398
                                if (!is_array($_REQUEST[$fieldname])) {
399
                                    $value        = (int)$_REQUEST[$fieldname];
400
                                    $search_url[] = $fieldname . '=' . $value;
401
                                    $criteria->add(new Criteria($fieldname, $value, '='));
402
                                } else {
403
                                    $value = array_map('\intval', $_REQUEST[$fieldname]);
404
                                    foreach ($value as $thisvalue) {
405
                                        $search_url[] = $fieldname . '[]=' . $thisvalue;
406
                                    }
407
                                    $criteria->add(new Criteria($fieldname, '(' . implode(',', $value) . ')', 'IN'));
408
                                }
409
410
                                $searchvars[] = $fieldname;
411
                            }
412
                            break;
413
                        case XOBJ_DTYPE_URL:
414
                        case XOBJ_DTYPE_TXTBOX:
415
                        case XOBJ_DTYPE_TXTAREA:
416
                            if (isset($_REQUEST[$fieldname]) && '' !== $_REQUEST[$fieldname]) {
417
                                $value = $myts->addSlashes(trim($_REQUEST[$fieldname]));
418
                                switch ($_REQUEST[$fieldname . '_match']) {
419
                                    case XOOPS_MATCH_START:
420
                                        $value .= '%';
421
                                        break;
422
                                    case XOOPS_MATCH_END:
423
                                        $value = '%' . $value;
424
                                        break;
425
                                    case XOOPS_MATCH_CONTAIN:
426
                                        $value = '%' . $value . '%';
427
                                        break;
428
                                }
429
                                $search_url[] = $fieldname . '=' . $value;
430
                                $operator     = 'LIKE';
431
                                $criteria->add(new Criteria($fieldname, $value, $operator));
432
                                $searchvars[] = $fieldname;
433
                            }
434
                            break;
435
                    }
436
                }
437
            }
438
        }
439
440
        if ($searchvars === []) {
441
            break;
442
        }
443
444
        if ('name' === Request::getString('sortby', '', 'REQUEST')) {
445
            $criteria->setSort('name');
446
        } elseif ('email' === Request::getString('sortby', '', 'REQUEST')) {
447
            $criteria->setSort('email');
448
        } elseif ('uname' === Request::getString('sortby', '', 'REQUEST')) {
449
            $criteria->setSort('uname');
450
        } elseif (isset($fields[Request::getString('sortby', '', 'REQUEST')])) {
451
            $criteria->setSort($fields[Request::getString('sortby', '', 'REQUEST')]->getVar('field_name'));
452
        }
453
        $order = 0 === $_REQUEST['order'] ? 'ASC' : 'DESC';
454
        $criteria->setOrder($order);
455
456
        $limit = isset($_REQUEST['limit']) && Request::getInt('limit', 0, 'REQUEST') > 0 ? Request::getInt('limit', 0, 'REQUEST') : 20;
457
        $criteria->setLimit($limit);
458
459
        $start = Request::getInt('start', 0, 'REQUEST');
460
        $criteria->setStart($start);
461
462
        //Get users based on criteria
463
        $profileHandler = xoops_getModuleHandler('profile');
464
        [$users, $profiles, $total_users] = $profileHandler->search($criteria, $searchvars);
0 ignored issues
show
The method search() does not exist on XoopsObjectHandler. It seems like you code against a sub-type of XoopsObjectHandler such as XoopsPersistableObjectHandler. ( Ignorable by Annotation )

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

464
        /** @scrutinizer ignore-call */ 
465
        [$users, $profiles, $total_users] = $profileHandler->search($criteria, $searchvars);
Loading history...
465
466
        //Sort information
467
        foreach (array_keys($users) as $k) {
468
            $userarray['output'][] = "<a href='userinfo.php?uid=" . (int)$users[$k]->getVar(
469
                'uid'
470
            ) . "'>" . $users[$k]->getVar(
471
                    'uname'
472
                ) . '</a>';
473
            $userarray['output'][] = 1 === $users[$k]->getVar(
474
                'user_viewemail'
475
            )
476
                                     || $xoopsUser->isAdmin() ? $users[$k]->getVar(
477
                                         'email'
478
                                     ) : '';
479
480
            foreach (array_keys($fields) as $i) {
481
                if (in_array($fields[$i]->getVar('fieldid'), $searchable_fields, true)
482
                    && in_array(
483
                        $fields[$i]->getVar('field_type'),
484
                        $searchable_types,
485
                        true
486
                    )
487
                    && in_array(
488
                        $fields[$i]->getVar('field_name'),
489
                        $searchvars,
490
                        true
491
                    )) {
492
                    $userarray['output'][] = $fields[$i]->getOutputValue($users[$k], $profiles[$k]);
493
                }
494
            }
495
            $xoopsTpl->append('users', $userarray);
496
            unset($userarray);
497
        }
498
499
        //Get captions
500
        $captions[] = _MD_YOGURT_PROFILE_DISPLAYNAME;
501
        $captions[] = _MD_YOGURT_PROFILE_EMAIL;
502
        foreach (array_keys($fields) as $i) {
503
            if (in_array($fields[$i]->getVar('fieldid'), $searchable_fields, true)
504
                && in_array(
505
                    $fields[$i]->getVar('field_type'),
506
                    $searchable_types,
507
                    true
508
                )
509
                && in_array(
510
                    $fields[$i]->getVar('field_name'),
511
                    $searchvars,
512
                    true
513
                )) {
514
                $captions[] = $fields[$i]->getVar('field_title');
515
            }
516
        }
517
        $xoopsTpl->assign('captions', $captions);
518
519
        if ($total_users > $limit) {
520
            $search_url[] = 'op=results';
521
            $search_url[] = 'order=' . $order;
522
            $search_url[] = 'sortby=' . Request::getString('sortby', '', 'REQUEST');
523
            $search_url[] = 'limit=' . $limit;
524
            if (isset($search_url)) {
525
                $args = implode('&amp;', $search_url);
526
            }
527
            require_once XOOPS_ROOT_PATH . '/class/pagenav.php';
528
            $nav = new XoopsPageNav($total_users, $limit, $start, 'start', $args);
529
            $xoopsTpl->assign('nav', $nav->renderNav(5));
530
        }
531
        break;
532
}
533
require XOOPS_ROOT_PATH . '/footer.php';
534