Completed
Push — master ( 01b1a5...81f493 )
by Michael
04:03
created

functions.php ➔ smart_getLinkedUnameFromId()   C

Complexity

Conditions 10
Paths 21

Size

Total Lines 61
Code Lines 47

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
cc 10
eloc 47
c 2
b 1
f 0
nc 21
nop 4
dl 0
loc 61
rs 6.4757

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 *
4
 * Module: SmartRental
5
 * Author: The SmartFactory <www.smartfactory.ca>
6
 * Licence: GNU
7
 * @param $cssfile
8
 * @return string
9
 */
10
// defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
0 ignored issues
show
Unused Code Comprehensibility introduced by
70% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
11
12
function smart_get_css_link($cssfile)
13
{
14
    $ret = '<link rel="stylesheet" type="text/css" href="' . $cssfile . '" />';
15
16
    return $ret;
17
}
18
19
/**
20
 * @return string
21
 */
22
function smart_get_page_before_form()
23
{
24
    global $smart_previous_page;
25
26
    return isset($_POST['smart_page_before_form']) ? $_POST['smart_page_before_form'] : $smart_previous_page;
27
}
28
29
/**
30
 * Checks if a user is admin of $module
31
 *
32
 * @param  bool  $module
33
 * @return bool: true if user is admin
0 ignored issues
show
Documentation introduced by
The doc-type bool: could not be parsed: Unknown type name "bool:" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
34
 */
35
function smart_userIsAdmin($module = false)
36
{
37
    global $xoopsUser;
38
    static $smart_isAdmin;
39
    if (!$module) {
40
        global $xoopsModule;
41
        $module = $xoopsModule->getVar('dirname');
42
    }
43
    if (isset($smart_isAdmin[$module])) {
44
        return $smart_isAdmin[$module];
45
    }
46
    if (!$xoopsUser) {
47
        $smart_isAdmin[$module] = false;
48
49
        return $smart_isAdmin[$module];
50
    }
51
    $smart_isAdmin[$module] = false;
52
    $smartModule            = smart_getModuleInfo($module);
53
    if (!is_object($smartModule)) {
54
        return false;
55
    }
56
    $module_id              = $smartModule->getVar('mid');
57
    $smart_isAdmin[$module] = $xoopsUser->isAdmin($module_id);
58
59
    return $smart_isAdmin[$module];
60
}
61
62
/**
63
 * @return bool
64
 */
65
function smart_isXoops22()
66
{
67
    $xoops22 = false;
68
    $xv      = str_replace('XOOPS ', '', XOOPS_VERSION);
69
    if (substr($xv, 2, 1) == '2') {
70
        $xoops22 = true;
71
    }
72
73
    return $xoops22;
74
}
75
76
/**
77
 * @param  bool   $withLink
78
 * @param  bool   $forBreadCrumb
79
 * @param  bool   $moduleName
80
 * @return string
81
 */
82
function smart_getModuleName($withLink = true, $forBreadCrumb = false, $moduleName = false)
83
{
84
    if (!$moduleName) {
85
        global $xoopsModule;
86
        $moduleName = $xoopsModule->getVar('dirname');
87
    }
88
    $smartModule       = smart_getModuleInfo($moduleName);
89
    $smartModuleConfig = smart_getModuleConfig($moduleName);
90
    if (!isset($smartModule)) {
91
        return '';
92
    }
93
94
    if ($forBreadCrumb && (isset($smartModuleConfig['show_mod_name_breadcrumb']) && !$smartModuleConfig['show_mod_name_breadcrumb'])) {
95
        return '';
96
    }
97
    if (!$withLink) {
98
        return $smartModule->getVar('name');
99
    } else {
100
        $seoMode = smart_getModuleModeSEO($moduleName);
101
        if ($seoMode === 'rewrite') {
102
            $seoModuleName = smart_getModuleNameForSEO($moduleName);
103
            $ret           = XOOPS_URL . '/' . $seoModuleName . '/';
104
        } elseif ($seoMode === 'pathinfo') {
105
            $ret = XOOPS_URL . '/modules/' . $moduleName . '/seo.php/' . $seoModuleName . '/';
0 ignored issues
show
Bug introduced by
The variable $seoModuleName seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
106
        } else {
107
            $ret = XOOPS_URL . '/modules/' . $moduleName . '/';
108
        }
109
110
        return '<a href="' . $ret . '">' . $smartModule->getVar('name') . '</a>';
111
    }
112
}
113
114
/**
115
 * @param  bool   $moduleName
116
 * @return string
117
 */
118
function smart_getModuleNameForSEO($moduleName = false)
119
{
120
    $smartModule       = smart_getModuleInfo($moduleName);
0 ignored issues
show
Unused Code introduced by
$smartModule is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
121
    $smartModuleConfig = smart_getModuleConfig($moduleName);
122
    if (isset($smartModuleConfig['seo_module_name'])) {
123
        return $smartModuleConfig['seo_module_name'];
124
    }
125
    $ret = smart_getModuleName(false, false, $moduleName);
126
127
    return strtolower($ret);
128
}
129
130
/**
131
 * @param  bool $moduleName
132
 * @return bool
133
 */
134
function smart_getModuleModeSEO($moduleName = false)
135
{
136
    $smartModule       = smart_getModuleInfo($moduleName);
0 ignored issues
show
Unused Code introduced by
$smartModule is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
137
    $smartModuleConfig = smart_getModuleConfig($moduleName);
138
139
    return isset($smartModuleConfig['seo_mode']) ? $smartModuleConfig['seo_mode'] : false;
140
}
141
142
/**
143
 * @param  bool $moduleName
144
 * @return bool
145
 */
146
function smart_getModuleIncludeIdSEO($moduleName = false)
147
{
148
    $smartModule       = smart_getModuleInfo($moduleName);
0 ignored issues
show
Unused Code introduced by
$smartModule is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
149
    $smartModuleConfig = smart_getModuleConfig($moduleName);
150
151
    return !empty($smartModuleConfig['seo_inc_id']);
152
}
153
154
/**
155
 * @param $key
156
 * @return string
157
 */
158
function smart_getenv($key)
159
{
160
    $ret = '';
0 ignored issues
show
Unused Code introduced by
$ret is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
161
    $ret = isset($_SERVER[$key]) ? $_SERVER[$key] : (isset($_ENV[$key]) ? $_ENV[$key] : '');
162
163
    return $ret;
164
}
165
166
function smart_xoops_cp_header()
167
{
168
    xoops_cp_header();
169
    global $xoopsModule, $xoopsConfig;
170
    /**
171
     * include SmartObject admin language file
172
     */
173
    $fileName = XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/' . $xoopsConfig['language'] . '/admin.php';
174 View Code Duplication
    if (file_exists($fileName)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
175
        include_once $fileName;
176
    } else {
177
        include_once XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/english/admin.php';
178
    }
179
    ?>
180
    <script type='text/javascript'>
181
        <!--
182
        var smart_url = '<?php echo SMARTOBJECT_URL ?>';
183
        var smart_modulename = '<?php echo $xoopsModule->getVar('dirname') ?>';
184
        // -->
185
    </script>
186
187
    <script
188
        type='text/javascript'
189
        src='<?php echo SMARTOBJECT_URL ?>include/smart.js'></script>
190
    <?php
191
192
    /**
193
     * Include the admin language constants for the SmartObject Framework
194
     */
195
    $admin_file = SMARTOBJECT_ROOT_PATH . 'language/' . $xoopsConfig['language'] . '/admin.php';
196
    if (!file_exists($admin_file)) {
197
        $admin_file = SMARTOBJECT_ROOT_PATH . 'language/english/admin.php';
198
    }
199
    include_once($admin_file);
200
}
201
202
/**
203
 * Detemines if a table exists in the current db
204
 *
205
 * @param  string $table the table name (without XOOPS prefix)
206
 * @return bool   True if table exists, false if not
207
 *
208
 * @access public
209
 * @author xhelp development team
210
 */
211
function smart_TableExists($table)
212
{
213
    $bRetVal = false;
214
    //Verifies that a MySQL table exists
215
    $xoopsDB  = XoopsDatabaseFactory::getDatabaseConnection();
216
    $realname = $xoopsDB->prefix($table);
217
    $sql      = 'SHOW TABLES FROM ' . XOOPS_DB_NAME;
218
    $ret      = $xoopsDB->queryF($sql);
219
    while (list($m_table) = $xoopsDB->fetchRow($ret)) {
220
        if ($m_table == $realname) {
221
            $bRetVal = true;
222
            break;
223
        }
224
    }
225
    $xoopsDB->freeRecordSet($ret);
226
227
    return $bRetVal;
228
}
229
230
/**
231
 * Gets a value from a key in the xhelp_meta table
232
 *
233
 * @param  string $key
234
 * @param  bool   $moduleName
235
 * @return string $value
236
 *
237
 * @access public
238
 * @author xhelp development team
239
 */
240
function smart_GetMeta($key, $moduleName = false)
241
{
242
    if (!$moduleName) {
243
        $moduleName = smart_getCurrentModuleName();
244
    }
245
    $xoopsDB = XoopsDatabaseFactory::getDatabaseConnection();
246
    $sql     = sprintf('SELECT metavalue FROM %s WHERE metakey=%s', $xoopsDB->prefix($moduleName . '_meta'), $xoopsDB->quoteString($key));
247
    $ret     = $xoopsDB->query($sql);
248
    if (!$ret) {
249
        $value = false;
250
    } else {
251
        list($value) = $xoopsDB->fetchRow($ret);
252
    }
253
254
    return $value;
255
}
256
257
/**
258
 * @return bool
259
 */
260
function smart_getCurrentModuleName()
261
{
262
    global $xoopsModule;
263
    if (is_object($xoopsModule)) {
264
        return $xoopsModule->getVar('dirname');
265
    } else {
266
        return false;
267
    }
268
}
269
270
/**
271
 * Sets a value for a key in the xhelp_meta table
272
 *
273
 * @param  string $key
274
 * @param  string $value
275
 * @param  bool   $moduleName
276
 * @return bool   TRUE if success, FALSE if failure
277
 *
278
 * @access public
279
 * @author xhelp development team
280
 */
281
function smart_SetMeta($key, $value, $moduleName = false)
282
{
283
    if (!$moduleName) {
284
        $moduleName = smart_getCurrentModuleName();
285
    }
286
    $xoopsDB = XoopsDatabaseFactory::getDatabaseConnection();
287
    $ret     = smart_GetMeta($key, $moduleName);
288
    if ($ret === '0' || $ret > 0) {
289
        $sql = sprintf('UPDATE %s SET metavalue = %s WHERE metakey = %s', $xoopsDB->prefix($moduleName . '_meta'), $xoopsDB->quoteString($value), $xoopsDB->quoteString($key));
290
    } else {
291
        $sql = sprintf('INSERT INTO %s (metakey, metavalue) VALUES (%s, %s)', $xoopsDB->prefix($moduleName . '_meta'), $xoopsDB->quoteString($key), $xoopsDB->quoteString($value));
292
    }
293
    $ret = $xoopsDB->queryF($sql);
294
    if (!$ret) {
295
        return false;
296
    }
297
298
    return true;
299
}
300
301
// Thanks to Mithrandir:-)
302
/**
303
 * @param         $str
304
 * @param         $start
305
 * @param         $length
306
 * @param  string $trimmarker
307
 * @return string
308
 */
309
function smart_substr($str, $start, $length, $trimmarker = '...')
310
{
311
    // if the string is empty, let's get out ;-)
312
    if ($str === '') {
313
        return $str;
314
    }
315
    // reverse a string that is shortened with '' as trimmarker
316
    $reversed_string = strrev(xoops_substr($str, $start, $length, ''));
317
    // find first space in reversed string
318
    $position_of_space = strpos($reversed_string, ' ', 0);
319
    // truncate the original string to a length of $length
320
    // minus the position of the last space
321
    // plus the length of the $trimmarker
322
    $truncated_string = xoops_substr($str, $start, $length - $position_of_space + strlen($trimmarker), $trimmarker);
323
324
    return $truncated_string;
325
}
326
327
/**
328
 * @param              $key
329
 * @param  bool        $moduleName
330
 * @param  string      $default
331
 * @return null|string
332
 */
333
function smart_getConfig($key, $moduleName = false, $default = 'default_is_undefined')
334
{
335
    if (!$moduleName) {
336
        $moduleName = smart_getCurrentModuleName();
337
    }
338
    $configs = smart_getModuleConfig($moduleName);
339
    if (isset($configs[$key])) {
340
        return $configs[$key];
341
    } else {
342
        if ($default === 'default_is_undefined') {
343
            return null;
344
        } else {
345
            return $default;
346
        }
347
    }
348
}
349
350
/**
351
 * Copy a file, or a folder and its contents
352
 *
353
 * @author      Aidan Lister <[email protected]>
354
 * @param  string $source The source
355
 * @param  string $dest   The destination
356
 * @return bool   Returns true on success, false on failure
357
 */
358
function smart_copyr($source, $dest)
359
{
360
    // Simple copy for a file
361
    if (is_file($source)) {
362
        return copy($source, $dest);
363
    }
364
    // Make destination directory
365
    if (!is_dir($dest)) {
366
        mkdir($dest);
367
    }
368
    // Loop through the folder
369
    $dir = dir($source);
370
    while (false !== $entry = $dir->read()) {
371
        // Skip pointers
372
        if ($entry === '.' || $entry === '..') {
373
            continue;
374
        }
375
        // Deep copy directories
376
        if (is_dir("$source/$entry") && ($dest !== "$source/$entry")) {
377
            copyr("$source/$entry", "$dest/$entry");
378
        } else {
379
            copy("$source/$entry", "$dest/$entry");
380
        }
381
    }
382
    // Clean up
383
    $dir->close();
384
385
    return true;
386
}
387
388
/**
389
 * Thanks to the NewBB2 Development Team
390
 * @param $target
391
 * @return bool
392
 */
393
function smart_admin_mkdir($target)
394
{
395
    // http://www.php.net/manual/en/function.mkdir.php
396
    // saint at corenova.com
397
    // bart at cdasites dot com
398
    if (is_dir($target) || empty($target)) {
399
        return true; // best case check first
400
    }
401
    if (file_exists($target) && !is_dir($target)) {
402
        return false;
403
    }
404
    if (smart_admin_mkdir(substr($target, 0, strrpos($target, '/')))) {
405
        if (!file_exists($target)) {
406
            $res = mkdir($target, 0777); // crawl back up & create dir tree
407
            smart_admin_chmod($target);
408
409
            return $res;
410
        }
411
    }
412
    $res = is_dir($target);
413
414
    return $res;
415
}
416
417
/**
418
 * Thanks to the NewBB2 Development Team
419
 * @param       $target
420
 * @param  int  $mode
421
 * @return bool
422
 */
423
function smart_admin_chmod($target, $mode = 0777)
424
{
425
    return @ chmod($target, $mode);
426
}
427
428
/**
429
 * @param $src
430
 * @param $maxWidth
431
 * @param $maxHeight
432
 * @return array
433
 */
434
function smart_imageResize($src, $maxWidth, $maxHeight)
435
{
436
    $width  = '';
437
    $height = '';
438
    $type   = '';
439
    $attr   = '';
440
    if (file_exists($src)) {
441
        list($width, $height, $type, $attr) = getimagesize($src);
0 ignored issues
show
Unused Code introduced by
The assignment to $attr is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
442
        if ($width > $maxWidth) {
443
            $originalWidth = $width;
444
            $width         = $maxWidth;
445
            $height        = $width * $height / $originalWidth;
446
        }
447
        if ($height > $maxHeight) {
448
            $originalHeight = $height;
449
            $height         = $maxHeight;
450
            $width          = $height * $width / $originalHeight;
451
        }
452
        $attr = " width='$width' height='$height'";
453
    }
454
455
    return array(
456
        $width,
457
        $height,
458
        $type,
459
        $attr
460
    );
461
}
462
463
/**
464
 * @param  bool  $moduleName
465
 * @return mixed
466
 */
467
function smart_getModuleInfo($moduleName = false)
468
{
469
    static $smartModules;
470
    if (isset($smartModules[$moduleName])) {
471
        $ret =& $smartModules[$moduleName];
472
473
        return $ret;
474
    }
475
    global $xoopsModule;
476
    if (!$moduleName) {
477
        if (isset($xoopsModule) && is_object($xoopsModule)) {
478
            $smartModules[$xoopsModule->getVar('dirname')] = $xoopsModule;
479
480
            return $smartModules[$xoopsModule->getVar('dirname')];
481
        }
482
    }
483
    if (!isset($smartModules[$moduleName])) {
484
        if (isset($xoopsModule) && is_object($xoopsModule) && $xoopsModule->getVar('dirname') == $moduleName) {
485
            $smartModules[$moduleName] = $xoopsModule;
486
        } else {
487
            $hModule = xoops_getHandler('module');
488
            if ($moduleName !== 'xoops') {
489
                $smartModules[$moduleName] = $hModule->getByDirname($moduleName);
490
            } else {
491
                $smartModules[$moduleName] = $hModule->getByDirname('system');
492
            }
493
        }
494
    }
495
496
    return $smartModules[$moduleName];
497
}
498
499
/**
500
 * @param  bool $moduleName
501
 * @return bool
502
 */
503
function smart_getModuleConfig($moduleName = false)
504
{
505
    static $smartConfigs;
506
    if (isset($smartConfigs[$moduleName])) {
507
        $ret =& $smartConfigs[$moduleName];
508
509
        return $ret;
510
    }
511
    global $xoopsModule, $xoopsModuleConfig;
512
    if (!$moduleName) {
513
        if (isset($xoopsModule) && is_object($xoopsModule)) {
514
            $smartConfigs[$xoopsModule->getVar('dirname')] = $xoopsModuleConfig;
515
516
            return $smartConfigs[$xoopsModule->getVar('dirname')];
517
        }
518
    }
519
    // if we still did not found the xoopsModule, this is because there is none
520
    if (!$moduleName) {
521
        $ret = false;
522
523
        return $ret;
524
    }
525
    if (isset($xoopsModule) && is_object($xoopsModule) && $xoopsModule->getVar('dirname') == $moduleName) {
526
        $smartConfigs[$moduleName] = $xoopsModuleConfig;
527
    } else {
528
        $module = smart_getModuleInfo($moduleName);
529
        if (!is_object($module)) {
530
            $ret = false;
531
532
            return $ret;
533
        }
534
        $hModConfig                = xoops_getHandler('config');
535
        $smartConfigs[$moduleName] =& $hModConfig->getConfigsByCat(0, $module->getVar('mid'));
536
    }
537
538
    return $smartConfigs[$moduleName];
539
}
540
541
/**
542
 * @param $dirname
543
 * @return bool
544
 */
545
function smart_deleteFile($dirname)
546
{
547
    // Simple delete for a file
548
    if (is_file($dirname)) {
549
        return unlink($dirname);
550
    }
551
}
552
553
/**
554
 * @param  array  $errors
555
 * @return string
556
 */
557
function smart_formatErrors($errors = array())
558
{
559
    $ret = '';
560
    foreach ($errors as $key => $value) {
561
        $ret .= '<br> - ' . $value;
562
    }
563
564
    return $ret;
565
}
566
567
/**
568
 * smart_getLinkedUnameFromId()
569
 *
570
 * @param  integer $userid      Userid of poster etc
571
 * @param  integer $name        :  0 Use Usenamer 1 Use realname
572
 * @param  array   $users
573
 * @param  bool    $withContact
574
 * @return string
575
 */
576
function smart_getLinkedUnameFromId($userid = 0, $name = 0, $users = array(), $withContact = false)
577
{
578
    if (!is_numeric($userid)) {
579
        return $userid;
580
    }
581
    $userid = (int)$userid;
582
    if ($userid > 0) {
583
        if ($users == array()) {
584
            //fetching users
585
            $memberHandler = xoops_getHandler('member');
586
            $user          =& $memberHandler->getUser($userid);
587
        } else {
588
            if (!isset($users[$userid])) {
589
                return $GLOBALS['xoopsConfig']['anonymous'];
590
            }
591
            $user =& $users[$userid];
592
        }
593
        if (is_object($user)) {
594
            $ts        = MyTextSanitizer:: getInstance();
595
            $username  = $user->getVar('uname');
596
            $fullname  = '';
597
            $fullname2 = $user->getVar('name');
598
            if ($name && !empty($fullname2)) {
599
                $fullname = $user->getVar('name');
600
            }
601
            if (!empty($fullname)) {
602
                $linkeduser = "$fullname [<a href='" . XOOPS_URL . '/userinfo.php?uid=' . $userid . "'>" . $ts->htmlSpecialChars($username) . '</a>]';
603
            } else {
604
                $linkeduser = "<a href='" . XOOPS_URL . '/userinfo.php?uid=' . $userid . "'>" . ucwords($ts->htmlSpecialChars($username)) . '</a>';
605
            }
606
            // add contact info: email + PM
607
            if ($withContact) {
608
                $linkeduser .= ' <a href="mailto:' .
609
                               $user->getVar('email') .
610
                               '"><img style="vertical-align: middle;" src="' .
611
                               XOOPS_URL .
612
                               '/images/icons/email.gif' .
613
                               '" alt="' .
614
                               _CO_SOBJECT_SEND_EMAIL .
615
                               '" title="' .
616
                               _CO_SOBJECT_SEND_EMAIL .
617
                               '"/></a>';
618
                $js = "javascript:openWithSelfMain('" . XOOPS_URL . '/pmlite.php?send2=1&to_userid=' . $userid . "', 'pmlite',450,370);";
619
                $linkeduser .= ' <a href="' .
620
                               $js .
621
                               '"><img style="vertical-align: middle;" src="' .
622
                               XOOPS_URL .
623
                               '/images/icons/pm.gif' .
624
                               '" alt="' .
625
                               _CO_SOBJECT_SEND_PM .
626
                               '" title="' .
627
                               _CO_SOBJECT_SEND_PM .
628
                               '"/></a>';
629
            }
630
631
            return $linkeduser;
632
        }
633
    }
634
635
    return $GLOBALS['xoopsConfig']['anonymous'];
636
}
637
638
/**
639
 * @param int    $currentoption
640
 * @param string $breadcrumb
641
 * @param bool   $submenus
642
 * @param int    $currentsub
643
 */
644
function smart_adminMenu($currentoption = 0, $breadcrumb = '', $submenus = false, $currentsub = -1)
645
{
646
    global $xoopsModule, $xoopsConfig;
647
    include_once XOOPS_ROOT_PATH . '/class/template.php';
648 View Code Duplication
    if (file_exists(XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/' . $xoopsConfig['language'] . '/modinfo.php')) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
649
        include_once XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/' . $xoopsConfig['language'] . '/modinfo.php';
650
    } else {
651
        include_once XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/english/modinfo.php';
652
    }
653 View Code Duplication
    if (file_exists(XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/' . $xoopsConfig['language'] . '/admin.php')) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
654
        include_once XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/' . $xoopsConfig['language'] . '/admin.php';
655
    } else {
656
        include_once XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/language/english/admin.php';
657
    }
658
    $headermenu = array();
659
    $adminmenu  = array();
660
    include XOOPS_ROOT_PATH . '/modules/' . $xoopsModule->getVar('dirname') . '/admin/menu.php';
661
    $tpl = new XoopsTpl();
662
    $tpl->assign(array(
663
                     'headermenu'      => $headermenu,
664
                     'adminmenu'       => $adminmenu,
665
                     'current'         => $currentoption,
666
                     'breadcrumb'      => $breadcrumb,
667
                     'headermenucount' => count($headermenu),
668
                     'submenus'        => $submenus,
669
                     'currentsub'      => $currentsub,
670
                     'submenuscount'   => count($submenus)
671
                 ));
672
    $tpl->display('db:smartobject_admin_menu.tpl');
673
}
674
675
/**
676
 * @param string $id
677
 * @param string $title
678
 * @param string $dsc
679
 */
680 View Code Duplication
function smart_collapsableBar($id = '', $title = '', $dsc = '')
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
681
{
682
    global $xoopsModule;
683
    echo "<h3 style=\"color: #2F5376; font-weight: bold; font-size: 14px; margin: 6px 0 0 0; \"><a href='javascript:;' onclick=\"togglecollapse('" . $id . "'); toggleIcon('" . $id . "_icon')\";>";
684
    echo "<img id='" . $id . "_icon' src=" . SMARTOBJECT_URL . "assets/images/close12.gif alt='' /></a>&nbsp;" . $title . '</h3>';
685
    echo "<div id='" . $id . "'>";
686
    if ($dsc !== '') {
687
        echo "<span style=\"color: #567; margin: 3px 0 12px 0; font-size: small; display: block; \">" . $dsc . '</span>';
688
    }
689
}
690
691
/**
692
 * @param string $id
693
 * @param string $title
694
 * @param string $dsc
695
 */
696 View Code Duplication
function smart_ajaxCollapsableBar($id = '', $title = '', $dsc = '')
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
697
{
698
    global $xoopsModule;
699
    $onClick = "ajaxtogglecollapse('$id')";
700
    //$onClick = "togglecollapse('$id'); toggleIcon('" . $id . "_icon')";
0 ignored issues
show
Unused Code Comprehensibility introduced by
36% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
701
    echo '<h3 style="border: 1px solid; color: #2F5376; font-weight: bold; font-size: 14px; margin: 6px 0 0 0; " onclick="' . $onClick . '">';
702
    echo "<img id='" . $id . "_icon' src=" . SMARTOBJECT_URL . "assets/images/close12.gif alt='' /></a>&nbsp;" . $title . '</h3>';
703
    echo "<div id='" . $id . "'>";
704
    if ($dsc !== '') {
705
        echo "<span style=\"color: #567; margin: 3px 0 12px 0; font-size: small; display: block; \">" . $dsc . '</span>';
706
    }
707
}
708
709
/**
710
 * Ajax testing......
711
 * @param $name
712
 */
713
/*
0 ignored issues
show
Unused Code Comprehensibility introduced by
45% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
714
 function smart_collapsableBar($id = '', $title = '', $dsc='')
715
 {
716
717
 global $xoopsModule;
718
 //echo "<h3 style=\"color: #2F5376; font-weight: bold; font-size: 14px; margin: 6px 0 0 0; \"><a href='javascript:;' onclick=\"toggle('" . $id . "'); toggleIcon('" . $id . "_icon')\";>";
719
720
 ?>
721
 <h3 class="smart_collapsable_title"><a href="javascript:Effect.Combo('<?php echo $id ?>');"><?php echo $title ?></a></h3>
722
 <?php
723
724
 echo "<img id='" . $id . "_icon' src=" . SMARTOBJECT_URL . "assets/images/close12.gif alt='' /></a>&nbsp;" . $title . "</h3>";
725
 echo "<div id='" . $id . "'>";
726
 if ($dsc != '') {
727
 echo "<span style=\"color: #567; margin: 3px 0 12px 0; font-size: small; display: block; \">" . $dsc . "</span>";
728
 }
729
 }
730
 */
731
function smart_openclose_collapsable($name)
732
{
733
    $urls        = smart_getCurrentUrls();
734
    $path        = $urls['phpself'];
735
    $cookie_name = $path . '_smart_collaps_' . $name;
736
    $cookie_name = str_replace('.', '_', $cookie_name);
737
    $cookie      = smart_getCookieVar($cookie_name, '');
738
    if ($cookie === 'none') {
739
        echo '
740
                <script type="text/javascript"><!--
741
                togglecollapse("' . $name . '"); toggleIcon("' . $name . '_icon");
742
                    //-->
743
                </script>
744
                ';
745
    }
746
    /*  if ($cookie == 'none') {
0 ignored issues
show
Unused Code Comprehensibility introduced by
54% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
747
     echo '
748
     <script type="text/javascript"><!--
749
     hideElement("' . $name . '");
750
     //-->
751
     </script>
752
     ';
753
     }
754
     */
755
}
756
757
/**
758
 * @param $name
759
 */
760
function smart_close_collapsable($name)
761
{
762
    echo '</div>';
763
    smart_openclose_collapsable($name);
764
    echo '<br>';
765
}
766
767
/**
768
 * @param     $name
769
 * @param     $value
770
 * @param int $time
771
 */
772
function smart_setCookieVar($name, $value, $time = 0)
773
{
774
    if ($time == 0) {
775
        $time = time() + 3600 * 24 * 365;
776
        //$time = '';
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
777
    }
778
    setcookie($name, $value, $time, '/');
779
}
780
781
/**
782
 * @param         $name
783
 * @param  string $default
784
 * @return string
785
 */
786
function smart_getCookieVar($name, $default = '')
787
{
788
    $name = str_replace('.', '_', $name);
789
    if (isset($_COOKIE[$name]) && ($_COOKIE[$name] > '')) {
790
        return $_COOKIE[$name];
791
    } else {
792
        return $default;
793
    }
794
}
795
796
/**
797
 * @return array
798
 */
799
function smart_getCurrentUrls()
800
{
801
    $urls        = array();
0 ignored issues
show
Unused Code introduced by
$urls is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
802
    $http        = (strpos(XOOPS_URL, 'https://') === false) ? 'http://' : 'https://';
803
    $phpself     = $_SERVER['PHP_SELF'];
804
    $httphost    = $_SERVER['HTTP_HOST'];
805
    $querystring = $_SERVER['QUERY_STRING'];
806
    if ($querystring !== '') {
807
        $querystring = '?' . $querystring;
808
    }
809
    $currenturl           = $http . $httphost . $phpself . $querystring;
810
    $urls                 = array();
811
    $urls['http']         = $http;
812
    $urls['httphost']     = $httphost;
813
    $urls['phpself']      = $phpself;
814
    $urls['querystring']  = $querystring;
815
    $urls['full_phpself'] = $http . $httphost . $phpself;
816
    $urls['full']         = $currenturl;
817
    $urls['isHomePage']   = (XOOPS_URL . '/index.php') == ($http . $httphost . $phpself);
818
819
    return $urls;
820
}
821
822
/**
823
 * @return mixed
824
 */
825
function smart_getCurrentPage()
826
{
827
    $urls = smart_getCurrentUrls();
828
829
    return $urls['full'];
830
}
831
832
/**
833
 * Create a title for the short_url field of an article
834
 *
835
 * @credit psylove
836
 *
837
 * @var    string $title   title of the article
838
 * @var    string $withExt do we add an html extension or not
839
 * @return string sort_url for the article
840
 */
841
/**
842
 * Moved in SmartMetaGenClass
843
 */
844
/*
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
845
 function smart_seo_title($title='', $withExt=true)
846
 {
847
 // Transformation de la chaine en minuscule
848
 // Codage de la chaine afin d'�viter les erreurs 500 en cas de caract�res impr�vus
849
 $title   = rawurlencode(strtolower($title));
850
851
 // Transformation des ponctuations
852
 //                 Tab     Space      !        "        #        %        &        '        (        )        ,        /       :        ;        <        =        >        ?        @        [        \        ]        ^        {        |        }        ~       .
853
 $pattern = array("/%09/", "/%20/", "/%21/", "/%22/", "/%23/", "/%25/", "/%26/", "/%27/", "/%28/", "/%29/", "/%2C/", "/%2F/", "/%3A/", "/%3B/", "/%3C/", "/%3D/", "/%3E/", "/%3F/", "/%40/", "/%5B/", "/%5C/", "/%5D/", "/%5E/", "/%7B/", "/%7C/", "/%7D/", "/%7E/", "/\./");
854
 $rep_pat = array(  "-"  ,   "-"  ,   ""   ,   ""   ,   ""   , "-100" ,   ""   ,   "-"  ,   ""   ,   ""   ,   ""   ,   "-"  ,   ""   ,   ""   ,   ""   ,   "-"  ,   ""   ,   ""   , "-at-" ,   ""   ,   "-"   ,  ""   ,   "-"  ,   ""   ,   "-"  ,   ""   ,   "-"  ,  ""  );
855
 $title   = preg_replace($pattern, $rep_pat, $title);
856
857
 // Transformation des caract�res accentu�s
858
    $pattern = array(
859
        '/%B0/', // °
860
        '/%E8/', // è
861
        '/%E9/', // é
862
        '/%EA/', // ê
863
        '/%EB/', // ë
864
        '/%E7/', // ç
865
        '/%E0/', // à
866
        '/%E2/', // â
867
        '/%E4/', // ä
868
        '/%EE/', // î
869
        '/%EF/', // ï
870
        '/%F9/', // ù
871
        '/%FC/', // ü
872
        '/%FB/', // û
873
        '/%F4/', // ô
874
        '/%F6/', // ö
875
    );
876
 $rep_pat = array(  "e"  ,   "e"  ,   "e"  ,   "e"  ,   "c"  ,   "a"  ,   "a"  ,   "a"  ,   "i"  ,   "i"  ,   "u"  ,   "u"  ,   "u"  ,   "o"  ,   "o"  );
877
 $title   = preg_replace($pattern, $rep_pat, $title);
878
879
 if (count($title) > 0) {
880
 if ($withExt) {
881
 $title .= '.html';
882
 }
883
884
 return $title;
885
 } else
886
887
 return '';
888
 }
889
 */
890
function smart_modFooter()
891
{
892
    global $xoopsConfig, $xoopsModule, $xoopsModuleConfig;
893
894
    include_once XOOPS_ROOT_PATH . '/class/template.php';
895
    $tpl = new XoopsTpl();
896
897
    $hModule      = xoops_getHandler('module');
898
    $versioninfo  =& $hModule->get($xoopsModule->getVar('mid'));
899
    $modfootertxt = 'Module ' . $versioninfo->getInfo('name') . ' - Version ' . $versioninfo->getInfo('version') . '';
900
    $modfooter    = "<a href='" .
901
                    $versioninfo->getInfo('support_site_url') .
902
                    "' target='_blank'><img src='" .
903
                    XOOPS_URL .
904
                    '/modules/' .
905
                    $xoopsModule->getVar('dirname') .
906
                    "/assets/images/cssbutton.gif' title='" .
907
                    $modfootertxt .
908
                    "' alt='" .
909
                    $modfootertxt .
910
                    "'/></a>";
911
    $tpl->assign('modfooter', $modfooter);
912
913
    if (!defined('_AM_SOBJECT_XOOPS_PRO')) {
914
        define('_AM_SOBJECT_XOOPS_PRO', 'Do you need help with this module ?<br>Do you need new features not yet available?');
915
    }
916
    $smartobjectConfig = smart_getModuleConfig('smartobject');
0 ignored issues
show
Documentation introduced by
'smartobject' is of type string, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
917
    $tpl->assign('smartobject_enable_admin_footer', $smartobjectConfig['enable_admin_footer']);
918
    $tpl->display(SMARTOBJECT_ROOT_PATH . 'templates/smartobject_admin_footer.html');
919
}
920
921
function smart_xoops_cp_footer()
922
{
923
    smart_modFooter();
924
    xoops_cp_footer();
925
}
926
927
/**
928
 * @param $text
929
 * @return mixed
930
 */
931
function smart_sanitizeForCommonTags($text)
932
{
933
    global $xoopsConfig;
934
    $text = str_replace('{X_SITENAME}', $xoopsConfig['sitename'], $text);
935
    $text = str_replace('{X_ADMINMAIL}', $xoopsConfig['adminmail'], $text);
936
937
    return $text;
938
}
939
940
/**
941
 * @param $src
942
 */
943
function smart_addScript($src)
944
{
945
    echo '<script src="' . $src . '" type="text/javascript"></script>';
946
}
947
948
/**
949
 * @param $src
950
 */
951
function smart_addStyle($src)
952
{
953
    if ($src === 'smartobject') {
954
        $src = SMARTOBJECT_URL . 'assets/css/module.css';
955
    }
956
    echo smart_get_css_link($src);
957
}
958
959
function smart_addAdminAjaxSupport()
960
{
961
    smart_addScript(SMARTOBJECT_URL . 'include/scriptaculous/lib/prototype.js');
962
    smart_addScript(SMARTOBJECT_URL . 'include/scriptaculous/src/scriptaculous.js');
963
    smart_addScript(SMARTOBJECT_URL . 'include/scriptaculous/src/smart.js');
964
}
965
966
/**
967
 * @param $text
968
 * @return mixed
969
 */
970
function smart_sanitizeForSmartpopupLink($text)
971
{
972
    $patterns[]     = "/\[smartpopup=(['\"]?)([^\"'<>]*)\\1](.*)\[\/smartpopup\]/sU";
0 ignored issues
show
Coding Style Comprehensibility introduced by
$patterns was never initialized. Although not strictly required by PHP, it is generally a good practice to add $patterns = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
973
    $replacements[] = "<a href=\"javascript:openWithSelfMain('\\2', 'smartpopup', 700, 519);\">\\3</a>";
0 ignored issues
show
Coding Style Comprehensibility introduced by
$replacements was never initialized. Although not strictly required by PHP, it is generally a good practice to add $replacements = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
974
    $ret            = preg_replace($patterns, $replacements, $text);
975
976
    return $ret;
977
}
978
979
/**
980
 * Finds the width and height of an image (can also be a flash file)
981
 *
982
 * @credit phppp
983
 *
984
 * @var    string $url    path of the image file
985
 * @var    string $width  reference to the width
986
 * @var    string $height reference to the height
987
 * @return bool   false if impossible to find dimension
988
 */
989
function smart_getImageSize($url, & $width, & $height)
990
{
991
    if (empty($width) || empty($height)) {
992
        if (!$dimension = @ getimagesize($url)) {
993
            return false;
994
        }
995
        if (!empty($width)) {
996
            $height = $dimension[1] * $width / $dimension[0];
997
        } elseif (!empty($height)) {
998
            $width = $dimension[0] * $height / $dimension[1];
999
        } else {
1000
            list($width, $height) = array(
1001
                $dimension[0],
1002
                $dimension[1]
1003
            );
1004
        }
1005
1006
        return true;
1007
    } else {
1008
        return true;
1009
    }
1010
}
1011
1012
/**
1013
 * Convert characters to decimal values
1014
 *
1015
 * @author eric.wallet at yahoo.fr
1016
 * @link   http://ca.php.net/manual/en/function.htmlentities.php#69913
1017
 * @param $str
1018
 * @return mixed
1019
 */
1020
function smart_htmlnumericentities($str)
1021
{
1022
    //    return preg_replace('/[^!-%\x27-;=?-~ ]/e', '"&#".ord("$0").chr(59)', $str);
0 ignored issues
show
Unused Code Comprehensibility introduced by
65% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1023
    return preg_replace_callback('/[^!-%\x27-;=?-~ ]/', function ($m) { return '&#' . ord($m[0]) . chr(59); }, $str);
1024
}
1025
1026
/**
1027
 * @param        $name
1028
 * @param  bool  $optional
1029
 * @return mixed
1030
 */
1031
function smart_getcorehandler($name, $optional = false)
1032
{
1033
    static $handlers;
1034
    $name = strtolower(trim($name));
1035
    if (!isset($handlers[$name])) {
1036
        if (file_exists($hnd_file = XOOPS_ROOT_PATH . '/kernel/' . $name . '.php')) {
1037
            require_once $hnd_file;
1038
        }
1039
        $class = 'Xoops' . ucfirst($name) . 'Handler';
1040
        if (class_exists($class)) {
1041
            $handlers[$name] = new $class ($GLOBALS['xoopsDB'], 'xoops');
1042
        }
1043
    }
1044
    if (!isset($handlers[$name]) && !$optional) {
1045
        trigger_error('Class <b>' . $class . '</b> does not exist<br>Handler Name: ' . $name, E_USER_ERROR);
0 ignored issues
show
Bug introduced by
The variable $class does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1046
    }
1047
    if (isset($handlers[$name])) {
1048
        return $handlers[$name];
1049
    }
1050
    $inst = false;
0 ignored issues
show
Unused Code introduced by
$inst is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1051
}
1052
1053
/**
1054
 * @param $matches
1055
 * @return string
1056
 */
1057
function smart_sanitizeAdsenses_callback($matches)
1058
{
1059
    global $smartobjectAdsenseHandler;
1060
    if (isset($smartobjectAdsenseHandler->objects[$matches[1]])) {
1061
        $adsenseObj = $smartobjectAdsenseHandler->objects[$matches[1]];
1062
        $ret        = $adsenseObj->render();
1063
1064
        return $ret;
1065
    } else {
1066
        return '';
1067
    }
1068
}
1069
1070
/**
1071
 * @param $text
1072
 * @return mixed
1073
 */
1074
function smart_sanitizeAdsenses($text)
1075
{
1076
    $patterns     = array();
1077
    $replacements = array();
0 ignored issues
show
Unused Code introduced by
$replacements is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1078
1079
    $patterns[] = "/\[adsense](.*)\[\/adsense\]/sU";
1080
    $text       = preg_replace_callback($patterns, 'smart_sanitizeAdsenses_callback', $text);
1081
1082
    return $text;
1083
}
1084
1085
/**
1086
 * @param $matches
1087
 * @return string
1088
 */
1089
function smart_sanitizeCustomtags_callback($matches)
1090
{
1091
    global $smartobjectCustomtagHandler;
1092
    if (isset($smartobjectCustomtagHandler->objects[$matches[1]])) {
1093
        $customObj = $smartobjectCustomtagHandler->objects[$matches[1]];
1094
        $ret       = $customObj->renderWithPhp();
1095
1096
        return $ret;
1097
    } else {
1098
        return '';
1099
    }
1100
}
1101
1102
/**
1103
 * @param $text
1104
 * @return mixed
1105
 */
1106
function smart_sanitizeCustomtags($text)
1107
{
1108
    $patterns     = array();
1109
    $replacements = array();
0 ignored issues
show
Unused Code introduced by
$replacements is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1110
1111
    $patterns[] = "/\[customtag](.*)\[\/customtag\]/sU";
1112
    $text       = preg_replace_callback($patterns, 'smart_sanitizeCustomtags_callback', $text);
1113
1114
    return $text;
1115
}
1116
1117
/**
1118
 * @param $module
1119
 * @param $file
1120
 */
1121
function smart_loadLanguageFile($module, $file)
1122
{
1123
    global $xoopsConfig;
1124
1125
    $filename = XOOPS_ROOT_PATH . '/modules/' . $module . '/language/' . $xoopsConfig['language'] . '/' . $file . '.php';
1126
    if (!file_exists($filename)) {
1127
        $filename = XOOPS_ROOT_PATH . '/modules/' . $module . '/language/english/' . $file . '.php';
1128
    }
1129
    if (file_exists($filename)) {
1130
        include_once($filename);
1131
    }
1132
}
1133
1134
function smart_loadCommonLanguageFile()
1135
{
1136
    smart_loadLanguageFile('smartobject', 'common');
1137
}
1138
1139
/**
1140
 * @param               $text
1141
 * @param  bool         $keyword
1142
 * @return mixed|string
1143
 */
1144
function smart_purifyText($text, $keyword = false)
1145
{
1146
    global $myts;
1147
    $text = str_replace('&nbsp;', ' ', $text);
1148
    $text = str_replace('<br>', ' ', $text);
1149
    $text = str_replace('<br>', ' ', $text);
1150
    $text = str_replace('<br', ' ', $text);
1151
    $text = strip_tags($text);
1152
    $text = html_entity_decode($text);
1153
    $text = $myts->undoHtmlSpecialChars($text);
1154
    $text = str_replace(')', ' ', $text);
1155
    $text = str_replace('(', ' ', $text);
1156
    $text = str_replace(':', ' ', $text);
1157
    $text = str_replace('&euro', ' euro ', $text);
1158
    $text = str_replace('&hellip', '...', $text);
1159
    $text = str_replace('&rsquo', ' ', $text);
1160
    $text = str_replace('!', ' ', $text);
1161
    $text = str_replace('?', ' ', $text);
1162
    $text = str_replace('"', ' ', $text);
1163
    $text = str_replace('-', ' ', $text);
1164
    $text = str_replace('\n', ' ', $text);
1165
    $text = str_replace('&#8213;', ' ', $text);
1166
1167
    if ($keyword) {
1168
        $text = str_replace('.', ' ', $text);
1169
        $text = str_replace(',', ' ', $text);
1170
        $text = str_replace('\'', ' ', $text);
1171
    }
1172
    $text = str_replace(';', ' ', $text);
1173
1174
    return $text;
1175
}
1176
1177
/**
1178
 * @param $document
1179
 * @return mixed
1180
 */
1181
function smart_html2text($document)
1182
{
1183
    // PHP Manual:: function preg_replace
1184
    // $document should contain an HTML document.
1185
    // This will remove HTML tags, javascript sections
1186
    // and white space. It will also convert some
1187
    // common HTML entities to their text equivalent.
1188
    // Credits: newbb2
1189
    $search = array(
1190
        "'<script[^>]*?>.*?</script>'si",  // Strip out javascript
1191
        "'<img.*?/>'si",       // Strip out img tags
1192
        "'<[\/\!]*?[^<>]*?>'si",          // Strip out HTML tags
1193
        "'([\r\n])[\s]+'",                // Strip out white space
1194
        "'&(quot|#34);'i",                // Replace HTML entities
1195
        "'&(amp|#38);'i",
1196
        "'&(lt|#60);'i",
1197
        "'&(gt|#62);'i",
1198
        "'&(nbsp|#160);'i",
1199
        "'&(iexcl|#161);'i",
1200
        "'&(cent|#162);'i",
1201
        "'&(pound|#163);'i",
1202
        "'&(copy|#169);'i",
1203
        "'&#(\d+);'e"
1204
    );                    // evaluate as php
1205
1206
    $replace = array(
1207
        '',
1208
        '',
1209
        '',
1210
        "\\1",
1211
        "\"",
1212
        '&',
1213
        '<',
1214
        '>',
1215
        ' ',
1216
        chr(161),
1217
        chr(162),
1218
        chr(163),
1219
        chr(169),
1220
        "chr(\\1)"
1221
    );
1222
1223
    $text = preg_replace($search, $replace, $document);
1224
1225
    return $text;
1226
}
1227
1228
/**
1229
 * @author pillepop2003 at yahoo dot de
1230
 *
1231
 * Use this snippet to extract any float out of a string. You can choose how a single dot is treated with the (bool) 'single_dot_as_decimal' directive.
1232
 * This function should be able to cover almost all floats that appear in an european environment.
1233
 * @param            $str
1234
 * @param  bool      $set
1235
 * @return float|int
1236
 */
1237
function smart_getfloat($str, $set = false)
1238
{
1239
    if (preg_match("/([0-9\.,-]+)/", $str, $match)) {
1240
        // Found number in $str, so set $str that number
1241
        $str = $match[0];
1242
        if (false !== strpos($str, ',')) {
1243
            // A comma exists, that makes it easy, cos we assume it separates the decimal part.
1244
            $str = str_replace('.', '', $str);    // Erase thousand seps
1245
            $str = str_replace(',', '.', $str);    // Convert , to . for floatval command
1246
1247
            return (float)$str;
1248
        } else {
1249
            // No comma exists, so we have to decide, how a single dot shall be treated
1250
            if (preg_match("/^[0-9\-]*[\.]{1}[0-9-]+$/", $str) == true && $set['single_dot_as_decimal'] == true) {
0 ignored issues
show
Bug Best Practice introduced by
It seems like you are loosely comparing preg_match('/^[0-9\\-]*[\\.]{1}[0-9-]+$/', $str) of type integer to the boolean true. If you are specifically checking for non-zero, consider using something more explicit like > 0 or !== 0 instead.
Loading history...
1251
                // Treat single dot as decimal separator
1252
                return (float)$str;
1253
            } else {
1254
                //echo "str: ".$str; echo "ret: ".str_replace('.', '', $str); echo "<br><br> ";
0 ignored issues
show
Unused Code Comprehensibility introduced by
63% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1255
                // Else, treat all dots as thousand seps
1256
                $str = str_replace('.', '', $str);    // Erase thousand seps
1257
1258
                return (float)$str;
1259
            }
1260
        }
1261
    } else {
1262
        // No number found, return zero
1263
        return 0;
1264
    }
1265
}
1266
1267
/**
1268
 * @param                         $var
1269
 * @param  bool                   $currencyObj
1270
 * @return float|int|mixed|string
1271
 */
1272
function smart_currency($var, $currencyObj = false)
1273
{
1274
    $ret = smart_getfloat($var, array('single_dot_as_decimal' => true));
0 ignored issues
show
Documentation introduced by
array('single_dot_as_decimal' => true) is of type array<string,boolean,{"s...as_decimal":"boolean"}>, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1275
    $ret = round($ret, 2);
1276
    // make sur we have at least .00 in the $var
1277
    $decimal_section_original = strstr($ret, '.');
1278
    $decimal_section          = $decimal_section_original;
1279 View Code Duplication
    if ($decimal_section) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1280
        if (strlen($decimal_section) == 1) {
1281
            $decimal_section = '.00';
1282
        } elseif (strlen($decimal_section) == 2) {
1283
            $decimal_section .= '0';
1284
        }
1285
        $ret = str_replace($decimal_section_original, $decimal_section, $ret);
1286
    } else {
1287
        $ret .= '.00';
1288
    }
1289
    if ($currencyObj) {
1290
        $ret = $ret . ' ' . $currencyObj->getCode();
0 ignored issues
show
Bug introduced by
The method getCode cannot be called on $currencyObj (of type boolean).

Methods can only be called on objects. This check looks for methods being called on variables that have been inferred to never be objects.

Loading history...
1291
    }
1292
1293
    return $ret;
1294
}
1295
1296
/**
1297
 * @param $var
1298
 * @return float|int|mixed|string
1299
 */
1300
function smart_float($var)
1301
{
1302
    return smart_currency($var);
1303
}
1304
1305
/**
1306
 * @param  bool   $moduleName
1307
 * @return string
1308
 */
1309
function smart_getModuleAdminLink($moduleName = false)
1310
{
1311
    global $xoopsModule;
1312
    if (!$moduleName && (isset($xoopsModule) && is_object($xoopsModule))) {
1313
        $moduleName = $xoopsModule->getVar('dirname');
1314
    }
1315
    $ret = '';
1316
    if ($moduleName) {
1317
        $ret = "<a href='" . XOOPS_URL . "/modules/$moduleName/admin/index.php'>" . _CO_SOBJECT_ADMIN_PAGE . '</a>';
1318
    }
1319
1320
    return $ret;
1321
}
1322
1323
/**
1324
 * @return array|bool
1325
 */
1326
function smart_getEditors()
1327
{
1328
    $filename = XOOPS_ROOT_PATH . '/class/xoopseditor/xoopseditor.php';
1329
    if (!file_exists($filename)) {
1330
        return false;
1331
    }
1332
    include_once $filename;
1333
    $xoopseditorHandler = XoopsEditorHandler::getInstance();
1334
    $aList              = $xoopseditorHandler->getList();
1335
    $ret                = array();
1336
    foreach ($aList as $k => $v) {
1337
        $ret[$v] = $k;
1338
    }
1339
1340
    return $ret;
1341
}
1342
1343
/**
1344
 * @param $moduleName
1345
 * @param $items
1346
 * @return array
1347
 */
1348
function smart_getTablesArray($moduleName, $items)
1349
{
1350
    $ret = array();
1351
    foreach ($items as $item) {
1352
        $ret[] = $moduleName . '_' . $item;
1353
    }
1354
    $ret[] = $moduleName . '_meta';
1355
1356
    return $ret;
1357
}
1358