Completed
Push — master ( bf34f3...88111b )
by Michael
03:08
created

SmartPersistableObjectHandler::getList()   F

Complexity

Conditions 12
Paths 384

Size

Total Lines 42
Code Lines 25

Duplication

Lines 8
Ratio 19.05 %

Importance

Changes 0
Metric Value
cc 12
eloc 25
nc 384
nop 4
dl 8
loc 42
rs 3.7956
c 0
b 0
f 0

How to fix   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 namespace XoopsModules\Smartobject;
2
3
/**
4
 * Contains the basis classes for managing any objects derived from SmartObjects
5
 *
6
 * @license    GNU
7
 * @author     marcan <[email protected]>
8
 * @link       http://smartfactory.ca The SmartFactory
9
 * @package    SmartObject
10
 * @subpackage SmartObjectCore
11
 */
12
13
use CriteriaElement;
14
use XoopsModules\Smartobject;
15
16
// defined('XOOPS_ROOT_PATH') || die('Restricted access');
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...
17
18
/**
19
 * Persistable SmartObject Handler class.
20
 *
21
 * This class is responsible for providing data access mechanisms to the data source
22
 * of derived class objects as well as some basic operations inherant to objects manipulation
23
 *
24
 * @package SmartObject
25
 * @author  marcan <[email protected]>
26
 * @credit  Jan Keller Pedersen <[email protected]> - IDG Danmark A/S <www.idg.dk>
27
 * @link    http://smartfactory.ca The SmartFactory
28
 */
29
30
class SmartPersistableObjectHandler extends \XoopsObjectHandler
31
{
32
    public $_itemname;
33
34
    /**
35
     * Name of the table use to store this {@link SmartObject}
36
     *
37
     * Note that the name of the table needs to be free of the database prefix.
38
     * For example "smartsection_categories"
39
     * @var string
40
     */
41
    public $table;
42
43
    /**
44
     * Name of the table key that uniquely identify each {@link SmartObject}
45
     *
46
     * For example: "categoryid"
47
     * @var string
48
     */
49
    public $keyName;
50
51
    /**
52
     * Name of the class derived from {@link SmartObject} and which this handler is handling
53
     *
54
     * Note that this string needs to be lowercase
55
     *
56
     * For example: "smartsectioncategory"
57
     * @var string
58
     */
59
    public $className;
60
61
    /**
62
     * Name of the field which properly identify the {@link SmartObject}
63
     *
64
     * For example: "name" (this will be the category's name)
65
     * @var string
66
     */
67
    public $identifierName;
68
69
    /**
70
     * Name of the field which will be use as a summary for the object
71
     *
72
     * For example: "summary"
73
     * @var string
74
     */
75
    public $summaryName;
76
77
    /**
78
     * Page name use to basically manage and display the {@link SmartObject}
79
     *
80
     * This page needs to be the same in user side and admin side
81
     *
82
     * For example category.php - we will deduct smartsection/category.php as well as smartsection/admin/category.php
83
     * @todo this could probably be automatically deducted from the class name - for example, the class SmartsectionCategory will have "category.php" as it's managing page
84
     * @var string
85
     */
86
    public $_page;
87
88
    /**
89
     * Full path of the module using this {@link SmartObject}
90
     *
91
     * <code>XOOPS_URL . "/modules/smartsection/"</code>
92
     * @todo this could probably be automatically deducted from the class name as it is always prefixed with the module name
93
     * @var string
94
     */
95
    public $_modulePath;
96
97
    public $_moduleUrl;
98
99
    public $_moduleName;
100
101
    public $_uploadUrl;
102
103
    public $_uploadPath;
104
105
    public $_allowedMimeTypes = 0;
106
107
    public $_maxFileSize = 1000000;
108
109
    public $_maxWidth = 500;
110
111
    public $_maxHeight = 500;
112
113
    public $highlightFields = [];
114
115
    /**
116
     * Array containing the events name and functions
117
     *
118
     * @var array
119
     */
120
    public $eventArray = [];
121
122
    /**
123
     * Array containing the permissions that this handler will manage on the objects
124
     *
125
     * @var array
126
     */
127
    public $permissionsArray = false;
128
129
    public $generalSQL = false;
130
131
    public $_eventHooks     = [];
132
    public $_disabledEvents = [];
133
134
    /**
135
     * Constructor - called from child classes
136
     *
137
     * @param \XoopsDatabase $db           {@link XoopsDatabase}
138
     * @param string         $itemname     Name of the class derived from <a href='psi_element://SmartObject'>SmartObject</a> and which this handler is handling and which this handler is handling
139
     * @param string         $keyname      Name of the table key that uniquely identify each {@link SmartObject}
140
     * @param string         $idenfierName Name of the field which properly identify the {@link SmartObject}
141
     * @param string         $summaryName
142
     * @param string         $modulename
143
     * @internal param string $tablename Name of the table use to store this <a href='psi_element://SmartObject'>SmartObject</a>
144
     * @internal param string $page Page name use to basically manage and display the <a href='psi_element://SmartObject'>SmartObject</a>
145
     * @internal param string $moduleName name of the module
146
     */
147
    public function __construct(\XoopsDatabase $db, $itemname, $keyname, $idenfierName, $summaryName, $modulename)
148
    {
149
        parent::__construct($db);
150
151
        $this->_itemname      = $itemname;
152
        $this->_moduleName    = $modulename;
153
        $this->table          = $db->prefix($modulename . '_' . $itemname);
154
        $this->keyName        = $keyname;
155
        $this->className      = ucfirst($modulename) . ucfirst($itemname);
156
        $this->identifierName = $idenfierName;
157
        $this->summaryName    = $summaryName;
158
        $this->_page          = $itemname . '.php';
159
        $this->_modulePath    = XOOPS_ROOT_PATH . '/modules/' . $this->_moduleName . '/';
160
        $this->_moduleUrl     = XOOPS_URL . '/modules/' . $this->_moduleName . '/';
161
        $this->_uploadPath    = XOOPS_UPLOAD_PATH . '/' . $this->_moduleName . '/';
162
        $this->_uploadUrl     = XOOPS_UPLOAD_URL . '/' . $this->_moduleName . '/';
163
    }
164
165
    /**
166
     * @param $event
167
     * @param $method
168
     */
169
    public function addEventHook($event, $method)
170
    {
171
        $this->_eventHooks[$event] = $method;
172
    }
173
174
    /**
175
     * Add a permission that this handler will manage for its objects
176
     *
177
     * Example: $this->addPermission('view', _AM_SSHOP_CAT_PERM_READ, _AM_SSHOP_CAT_PERM_READ_DSC);
178
     *
179
     * @param string      $perm_name   name of the permission
180
     * @param string      $caption     caption of the control that will be displayed in the form
181
     * @param bool|string $description description of the control that will be displayed in the form
182
     */
183
    public function addPermission($perm_name, $caption, $description = false)
184
    {
185
        require_once SMARTOBJECT_ROOT_PATH . 'class/smartobjectpermission.php';
186
187
        $this->permissionsArray[] = [
188
            'perm_name'   => $perm_name,
189
            'caption'     => $caption,
190
            'description' => $description
191
        ];
192
    }
193
194
    /**
195
     * @param $criteria
196
     * @param $perm_name
197
     * @return bool
198
     */
199
    public function setGrantedObjectsCriteria($criteria, $perm_name)
200
    {
201
        $smartPermissionsHandler = new SmartobjectPermissionHandler($this);
202
        $grantedItems            = $smartPermissionsHandler->getGrantedItems($perm_name);
203
        if (count($grantedItems) > 0) {
204
            $criteria->add(new \Criteria($this->keyName, '(' . implode(', ', $grantedItems) . ')', 'IN'));
205
206
            return true;
207
        } else {
208
            return false;
209
        }
210
    }
211
212
    /**
213
     * @param bool $_uploadPath
214
     * @param bool $_allowedMimeTypes
215
     * @param bool $_maxFileSize
216
     * @param bool $_maxWidth
217
     * @param bool $_maxHeight
218
     */
219
    public function setUploaderConfig(
220
        $_uploadPath = false,
221
        $_allowedMimeTypes = false,
222
        $_maxFileSize = false,
223
        $_maxWidth = false,
224
        $_maxHeight = false
225
    ) {
226
        $this->_uploadPath       = $_uploadPath ?: $this->_uploadPath;
227
        $this->_allowedMimeTypes = $_allowedMimeTypes ?: $this->_allowedMimeTypes;
0 ignored issues
show
Documentation Bug introduced by
It seems like $_allowedMimeTypes ?: $this->_allowedMimeTypes can also be of type boolean. However, the property $_allowedMimeTypes is declared as type integer. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
228
        $this->_maxFileSize      = $_maxFileSize ?: $this->_maxFileSize;
0 ignored issues
show
Documentation Bug introduced by
It seems like $_maxFileSize ?: $this->_maxFileSize can also be of type boolean. However, the property $_maxFileSize is declared as type integer. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
229
        $this->_maxWidth         = $_maxWidth ?: $this->_maxWidth;
0 ignored issues
show
Documentation Bug introduced by
It seems like $_maxWidth ?: $this->_maxWidth can also be of type boolean. However, the property $_maxWidth is declared as type integer. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
230
        $this->_maxHeight        = $_maxHeight ?: $this->_maxHeight;
0 ignored issues
show
Documentation Bug introduced by
It seems like $_maxHeight ?: $this->_maxHeight can also be of type boolean. However, the property $_maxHeight is declared as type integer. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
231
    }
232
233
    /**
234
     * create a new {@link SmartObject}
235
     *
236
     * @param bool $isNew Flag the new objects as "new"?
237
     *
238
     * @return Smartobject\SmartObject {@link SmartObject}
239
     */
240
    public function create($isNew = true)
241
    {
242
        $obj = new $this->className($this);
243
        $obj->setImageDir($this->getImageUrl(), $this->getImagePath());
244
        if (!$obj->handler) {
245
            $obj->Handler = $this;
246
        }
247
248
        if (true === $isNew) {
249
            $obj->setNew();
250
        }
251
252
        return $obj;
253
    }
254
255
    /**
256
     * @return string
257
     */
258
    public function getImageUrl()
259
    {
260
        return $this->_uploadUrl . $this->_itemname . '/';
261
    }
262
263
    /**
264
     * @return string
265
     */
266
    public function getImagePath()
267
    {
268
        $dir = $this->_uploadPath . $this->_itemname;
269
        if (!file_exists($dir)) {
270
            smart_admin_mkdir($dir);
271
        }
272
273
        return $dir . '/';
274
    }
275
276
    /**
277
     * retrieve a {@link SmartObject}
278
     *
279
     * @param  mixed $id        ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
280
     * @param  bool  $as_object whether to return an object or an array
281
     * @param  bool  $debug
282
     * @param  bool  $criteria
283
     * @return mixed reference to the <a href='psi_element://SmartObject'>SmartObject</a>, FALSE if failed
284
     *                          FALSE if failed
285
     */
286
    public function get($id, $as_object = true, $debug = false, $criteria = false)
287
    {
288
        if (!$criteria) {
289
            $criteria = new \CriteriaCompo();
290
        }
291
        if (is_array($this->keyName)) {
292
            for ($i = 0, $iMax = count($this->keyName); $i < $iMax; ++$i) {
293
                /**
294
                 * In some situations, the $id is not an INTEGER. SmartObjectTag is an example.
295
                 * Is the fact that we removed the (int)() represents a security risk ?
296
                 */
297
                //$criteria->add(new \Criteria($this->keyName[$i], ($id[$i]), '=', $this->_itemname));
0 ignored issues
show
Unused Code Comprehensibility introduced by
76% 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...
298
                $criteria->add(new \Criteria($this->keyName[$i], $id[$i], '=', $this->_itemname));
299
            }
300
        } else {
301
            //$criteria = new \Criteria($this->keyName, (int)($id), '=', $this->_itemname);
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...
302
            /**
303
             * In some situations, the $id is not an INTEGER. SmartObjectTag is an example.
304
             * Is the fact that we removed the (int)() represents a security risk ?
305
             */
306
            $criteria->add(new \Criteria($this->keyName, $id, '=', $this->_itemname));
307
        }
308
        $criteria->setLimit(1);
309
        if ($debug) {
310
            $obj_array = $this->getObjectsD($criteria, false, $as_object);
311
        } else {
312
            $obj_array =& $this->getObjects($criteria, false, $as_object);
313
            //patch: weird bug of indexing by id even if id_as_key = false;
314
            if (!isset($obj_array[0]) && is_object($obj_array[$id])) {
315
                $obj_array[0] = $obj_array[$id];
316
                unset($obj_array[$id]);
317
                $obj_array[0]->unsetNew();
0 ignored issues
show
Bug introduced by
The method unsetNew cannot be called on $obj_array[0] (of type null).

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...
318
            }
319
        }
320
321
        if (1 != count($obj_array)) {
322
            $obj = $this->create();
323
324
            return $obj;
325
        }
326
327
        return $obj_array[0];
328
    }
329
330
    /**
331
     * retrieve a {@link SmartObject}
332
     *
333
     * @param  mixed $id        ID of the object - or array of ids for joint keys. Joint keys MUST be given in the same order as in the constructor
334
     * @param  bool  $as_object whether to return an object or an array
335
     * @return mixed reference to the {@link SmartObject}, FALSE if failed
336
     */
337
    public function &getD($id, $as_object = true)
338
    {
339
        return $this->get($id, $as_object, true);
340
    }
341
342
    /**
343
     * retrieve objects from the database
344
     *
345
     * @param null|\CriteriaElement $criteria  {@link CriteriaElement} conditions to be met
346
     * @param bool            $id_as_key use the ID as key for the array?
347
     * @param bool            $as_object return an array of objects?
348
     *
349
     * @param  bool           $sql
350
     * @param  bool           $debug
351
     * @return array
352
     */
353
    public function getObjects(
354
        \CriteriaElement $criteria = null,
355
        $id_as_key = false,
356
        $as_object = true,
357
        $sql = false,
358
        $debug = false
359
    ) {
360
        $ret   = [];
361
        $limit = $start = 0;
362
363
        if ($this->generalSQL) {
364
            $sql = $this->generalSQL;
365
        } elseif (!$sql) {
366
            $sql = 'SELECT * FROM ' . $this->table . ' AS ' . $this->_itemname;
367
        }
368
369 View Code Duplication
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
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...
370
            $sql .= ' ' . $criteria->renderWhere();
371
            if ('' !== $criteria->getSort()) {
372
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
373
            }
374
            $limit = $criteria->getLimit();
375
            $start = $criteria->getStart();
376
        }
377
        if ($debug) {
378
            xoops_debug($sql);
379
        }
380
381
        $result = $this->db->query($sql, $limit, $start);
382
        if (!$result) {
383
            return $ret;
384
        }
385
386
        return $this->convertResultSet($result, $id_as_key, $as_object);
387
    }
388
389
    /**
390
     * @param        $sql
391
     * @param        $criteria
392
     * @param  bool  $force
393
     * @param  bool  $debug
394
     * @return array
395
     */
396
    public function query($sql, $criteria, $force = false, $debug = false)
397
    {
398
        $ret = [];
399
400 View Code Duplication
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
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...
401
            $sql .= ' ' . $criteria->renderWhere();
402
            if ($criteria->groupby) {
403
                $sql .= $criteria->getGroupby();
404
            }
405
            if ('' !== $criteria->getSort()) {
406
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
407
            }
408
        }
409
        if ($debug) {
410
            xoops_debug($sql);
411
        }
412
413
        if ($force) {
414
            $result = $this->db->queryF($sql);
415
        } else {
416
            $result = $this->db->query($sql);
417
        }
418
419
        if (!$result) {
420
            return $ret;
421
        }
422
423
        while (false !== ($myrow = $this->db->fetchArray($result))) {
424
            $ret[] = $myrow;
425
        }
426
427
        return $ret;
428
    }
429
430
    /**
431
     * retrieve objects with debug mode - so will show the query
432
     *
433
     * @param CriteriaElement $criteria  {@link CriteriaElement} conditions to be met
434
     * @param bool            $id_as_key use the ID as key for the array?
435
     * @param bool            $as_object return an array of objects?
436
     *
437
     * @param  bool           $sql
438
     * @return array
439
     */
440
    public function getObjectsD(CriteriaElement $criteria = null, $id_as_key = false, $as_object = true, $sql = false)
441
    {
442
        return $this->getObjects($criteria, $id_as_key, $as_object, $sql, true);
443
    }
444
445
    /**
446
     * @param $arrayObjects
447
     * @return array|bool
448
     */
449
    public function getObjectsAsArray($arrayObjects)
450
    {
451
        $ret = [];
452
        foreach ($arrayObjects as $key => $object) {
453
            $ret[$key] = $object->toArray();
454
        }
455
        if (count($ret > 0)) {
456
            return $ret;
457
        } else {
458
            return false;
459
        }
460
    }
461
462
    /**
463
     * Convert a database resultset to a returnable array
464
     *
465
     * @param object $result    database resultset
466
     * @param bool   $id_as_key - should NOT be used with joint keys
467
     * @param bool   $as_object
468
     *
469
     * @return array
470
     */
471
    public function convertResultSet($result, $id_as_key = false, $as_object = true)
472
    {
473
        $ret = [];
474
        while (false !== ($myrow = $this->db->fetchArray($result))) {
475
            $obj = $this->create(false);
476
            $obj->assignVars($myrow);
477
            if (!$id_as_key) {
478
                if ($as_object) {
479
                    $ret[] =& $obj;
480
                } else {
481
                    $ret[] = $obj->toArray();
482
                }
483
            } else {
484
                if ($as_object) {
485
                    $value =& $obj;
486
                } else {
487
                    $value = $obj->toArray();
488
                }
489
                if ('parentid' === $id_as_key) {
490
                    $ret[$obj->getVar('parentid', 'e')][$obj->getVar($this->keyName)] =& $value;
491
                } else {
492
                    $ret[$obj->getVar($this->keyName)] = $value;
493
                }
494
            }
495
            unset($obj);
496
        }
497
498
        return $ret;
499
    }
500
501
    /**
502
     * @param  null $criteria
503
     * @param  int  $limit
504
     * @param  int  $start
505
     * @return array
506
     */
507
    public function getListD($criteria = null, $limit = 0, $start = 0)
508
    {
509
        return $this->getList($criteria, $limit, $start, true);
510
    }
511
512
    /**
513
     * Retrieve a list of objects as arrays - DON'T USE WITH JOINT KEYS
514
     *
515
     * @param CriteriaElement $criteria {@link CriteriaElement} conditions to be met
516
     * @param int             $limit    Max number of objects to fetch
517
     * @param int             $start    Which record to start at
518
     *
519
     * @param  bool           $debug
520
     * @return array
521
     */
522
    public function getList(CriteriaElement $criteria = null, $limit = 0, $start = 0, $debug = false)
523
    {
524
        $ret = [];
525
        if (null === $criteria) {
526
            $criteria = new \CriteriaCompo();
527
        }
528
529
        if ('' === $criteria->getSort()) {
530
            $criteria->setSort($this->getIdentifierName());
531
        }
532
533
        $sql = 'SELECT ' . (is_array($this->keyName) ? implode(', ', $this->keyName) : $this->keyName);
534
        if (!empty($this->identifierName)) {
535
            $sql .= ', ' . $this->getIdentifierName();
536
        }
537
        $sql .= ' FROM ' . $this->table . ' AS ' . $this->_itemname;
538 View Code Duplication
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
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...
539
            $sql .= ' ' . $criteria->renderWhere();
540
            if ('' !== $criteria->getSort()) {
541
                $sql .= ' ORDER BY ' . $criteria->getSort() . ' ' . $criteria->getOrder();
542
            }
543
            $limit = $criteria->getLimit();
544
            $start = $criteria->getStart();
545
        }
546
547
        if ($debug) {
548
            xoops_debug($sql);
549
        }
550
551
        $result = $this->db->query($sql, $limit, $start);
552
        if (!$result) {
553
            return $ret;
554
        }
555
556
        $myts = \MyTextSanitizer::getInstance();
557
        while (false !== ($myrow = $this->db->fetchArray($result))) {
558
            //identifiers should be textboxes, so sanitize them like that
559
            $ret[$myrow[$this->keyName]] = empty($this->identifierName) ? 1 : $myts->displayTarea($myrow[$this->identifierName]);
560
        }
561
562
        return $ret;
563
    }
564
565
    /**
566
     * count objects matching a condition
567
     *
568
     * @param  CriteriaElement $criteria {@link CriteriaElement} to match
569
     * @return int             count of objects
570
     */
571
    public function getCount(CriteriaElement $criteria = null)
572
    {
573
        $field   = '';
574
        $groupby = false;
575
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
576
            if ('' !== $criteria->groupby) {
577
                $groupby = true;
578
                $field   = $criteria->groupby . ', '; //Not entirely secure unless you KNOW that no criteria's groupby clause is going to be mis-used
579
            }
580
        }
581
        /**
582
         * if we have a generalSQL, lets used this one.
583
         * This needs to be improved...
584
         */
585
        if ($this->generalSQL) {
586
            $sql = $this->generalSQL;
587
            $sql = str_replace('SELECT *', 'SELECT COUNT(*)', $sql);
588
        } else {
589
            $sql = 'SELECT ' . $field . 'COUNT(*) FROM ' . $this->table . ' AS ' . $this->_itemname;
590
        }
591
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
592
            $sql .= ' ' . $criteria->renderWhere();
593
            if ('' !== $criteria->groupby) {
594
                $sql .= $criteria->getGroupby();
595
            }
596
        }
597
598
        $result = $this->db->query($sql);
599
        if (!$result) {
600
            return 0;
601
        }
602
        if (false === $groupby) {
603
            list($count) = $this->db->fetchRow($result);
604
605
            return $count;
606
        } else {
607
            $ret = [];
608
            while (false !== (list($id, $count) = $this->db->fetchRow($result))) {
609
                $ret[$id] = $count;
610
            }
611
612
            return $ret;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $ret; (array) is incompatible with the return type documented by XoopsModules\Smartobject...ObjectHandler::getCount of type integer.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
613
        }
614
    }
615
616
    /**
617
     * delete an object from the database
618
     *
619
     * @param \XoopsObject $obj reference to the object to delete
620
     * @param  bool        $force
621
     * @return bool        FALSE if failed.
622
     */
623
    public function delete(\XoopsObject $obj, $force = false)
624
    {
625
        $eventResult = $this->executeEvent('beforeDelete', $obj);
626
        if (!$eventResult) {
627
            $obj->setErrors('An error occured during the BeforeDelete event');
628
629
            return false;
630
        }
631
632
        if (is_array($this->keyName)) {
633
            $clause = [];
634
            for ($i = 0, $iMax = count($this->keyName); $i < $iMax; ++$i) {
635
                $clause[] = $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
636
            }
637
            $whereclause = implode(' AND ', $clause);
638
        } else {
639
            $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
640
        }
641
        $sql = 'DELETE FROM ' . $this->table . ' WHERE ' . $whereclause;
642 View Code Duplication
        if (false !== $force) {
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...
643
            $result = $this->db->queryF($sql);
644
        } else {
645
            $result = $this->db->query($sql);
646
        }
647
        if (!$result) {
648
            return false;
649
        }
650
651
        $eventResult = $this->executeEvent('afterDelete', $obj);
652
        if (!$eventResult) {
653
            $obj->setErrors('An error occured during the AfterDelete event');
654
655
            return false;
656
        }
657
658
        return true;
659
    }
660
661
    /**
662
     * @param $event
663
     */
664
    public function disableEvent($event)
665
    {
666
        if (is_array($event)) {
667
            foreach ($event as $v) {
668
                $this->_disabledEvents[] = $v;
669
            }
670
        } else {
671
            $this->_disabledEvents[] = $event;
672
        }
673
    }
674
675
    /**
676
     * @return array
677
     */
678
    public function getPermissions()
679
    {
680
        return $this->permissionsArray;
681
    }
682
683
    /**
684
     * insert a new object in the database
685
     *
686
     * @param \XoopsObject $obj         reference to the object
687
     * @param  bool        $force       whether to force the query execution despite security settings
688
     * @param  bool        $checkObject check if the object is dirty and clean the attributes
689
     * @param  bool        $debug
690
     * @return bool        FALSE if failed, TRUE if already present and unchanged or successful
691
     */
692
    public function insert(\XoopsObject $obj, $force = false, $checkObject = true, $debug = false)
693
    {
694
        if (false !== $checkObject) {
695
            if (!is_object($obj)) {
696
                return false;
697
            }
698
            /**
699
             * @TODO: Change to if (!(class_exists($this->className) && $obj instanceof $this->className)) when going fully PHP5
700
             */
701
            if (!is_a($obj, $this->className)) {
702
                $obj->setError(get_class($obj) . ' Differs from ' . $this->className);
703
704
                return false;
705
            }
706
            if (!$obj->isDirty()) {
707
                $obj->setErrors('Not dirty'); //will usually not be outputted as errors are not displayed when the method returns true, but it can be helpful when troubleshooting code - Mith
708
709
                return true;
710
            }
711
        }
712
713
        if ($obj->seoEnabled) {
714
            // Auto create meta tags if empty
715
            $smartobjectMetagen = new SmartMetagen($obj->title(), $obj->getVar('meta_keywords'), $obj->summary());
716
717
            if (!$obj->getVar('meta_keywords') || !$obj->getVar('meta_description')) {
718
                if (!$obj->meta_keywords()) {
719
                    $obj->setVar('meta_keywords', $smartobjectMetagen->_keywords);
720
                }
721
722
                if (!$obj->meta_description()) {
723
                    $obj->setVar('meta_description', $smartobjectMetagen->_meta_description);
724
                }
725
            }
726
727
            // Auto create short_url if empty
728
            if (!$obj->short_url()) {
729
                $obj->setVar('short_url', $smartobjectMetagen->generateSeoTitle($obj->title('n'), false));
730
            }
731
        }
732
733
        $eventResult = $this->executeEvent('beforeSave', $obj);
734
        if (!$eventResult) {
735
            $obj->setErrors('An error occured during the BeforeSave event');
736
737
            return false;
738
        }
739
740 View Code Duplication
        if ($obj->isNew()) {
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...
741
            $eventResult = $this->executeEvent('beforeInsert', $obj);
742
            if (!$eventResult) {
743
                $obj->setErrors('An error occured during the BeforeInsert event');
744
745
                return false;
746
            }
747
        } else {
748
            $eventResult = $this->executeEvent('beforeUpdate', $obj);
749
            if (!$eventResult) {
750
                $obj->setErrors('An error occured during the BeforeUpdate event');
751
752
                return false;
753
            }
754
        }
755
        if (!$obj->cleanVars()) {
756
            $obj->setErrors('Variables were not cleaned properly.');
757
758
            return false;
759
        }
760
        $fieldsToStoreInDB = [];
761
        foreach ($obj->cleanVars as $k => $v) {
762
            if (XOBJ_DTYPE_INT == $obj->vars[$k]['data_type']) {
763
                $cleanvars[$k] = (int)$v;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$cleanvars was never initialized. Although not strictly required by PHP, it is generally a good practice to add $cleanvars = 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...
764
            } elseif (is_array($v)) {
765
                $cleanvars[$k] = $this->db->quoteString(implode(',', $v));
0 ignored issues
show
Coding Style Comprehensibility introduced by
$cleanvars was never initialized. Although not strictly required by PHP, it is generally a good practice to add $cleanvars = 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...
766
            } else {
767
                $cleanvars[$k] = $this->db->quoteString($v);
0 ignored issues
show
Coding Style Comprehensibility introduced by
$cleanvars was never initialized. Although not strictly required by PHP, it is generally a good practice to add $cleanvars = 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...
768
            }
769
            if ($obj->vars[$k]['persistent']) {
770
                $fieldsToStoreInDB[$k] = $cleanvars[$k];
0 ignored issues
show
Bug introduced by
The variable $cleanvars 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...
771
            }
772
        }
773
        if ($obj->isNew()) {
774
            if (!is_array($this->keyName)) {
775
                if ($cleanvars[$this->keyName] < 1) {
776
                    $cleanvars[$this->keyName] = $this->db->genId($this->table . '_' . $this->keyName . '_seq');
777
                }
778
            }
779
780
            $sql = 'INSERT INTO ' . $this->table . ' (' . implode(',', array_keys($fieldsToStoreInDB)) . ') VALUES (' . implode(',', array_values($fieldsToStoreInDB)) . ')';
781
        } else {
782
            $sql = 'UPDATE ' . $this->table . ' SET';
783
            foreach ($fieldsToStoreInDB as $key => $value) {
784
                if ((!is_array($this->keyName) && $key == $this->keyName)
785
                    || (is_array($this->keyName)
786
                        && in_array($key, $this->keyName))) {
787
                    continue;
788
                }
789
                if (isset($notfirst)) {
790
                    $sql .= ',';
791
                }
792
                $sql      .= ' ' . $key . ' = ' . $value;
793
                $notfirst = true;
794
            }
795
            if (is_array($this->keyName)) {
796
                $whereclause = '';
797
                for ($i = 0, $iMax = count($this->keyName); $i < $iMax; ++$i) {
798
                    if ($i > 0) {
799
                        $whereclause .= ' AND ';
800
                    }
801
                    $whereclause .= $this->keyName[$i] . ' = ' . $obj->getVar($this->keyName[$i]);
802
                }
803
            } else {
804
                $whereclause = $this->keyName . ' = ' . $obj->getVar($this->keyName);
805
            }
806
            $sql .= ' WHERE ' . $whereclause;
807
        }
808
809
        if ($debug) {
810
            xoops_debug($sql);
811
        }
812
813 View Code Duplication
        if (false != $force) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison !== instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
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...
814
            $result = $this->db->queryF($sql);
815
        } else {
816
            $result = $this->db->query($sql);
817
        }
818
819
        if (!$result) {
820
            $obj->setErrors($this->db->error());
821
822
            return false;
823
        }
824
825
        if ($obj->isNew() && !is_array($this->keyName)) {
826
            $obj->assignVar($this->keyName, $this->db->getInsertId());
827
        }
828
        $eventResult = $this->executeEvent('afterSave', $obj);
829
        if (!$eventResult) {
830
            $obj->setErrors('An error occured during the AfterSave event');
831
832
            return false;
833
        }
834
835 View Code Duplication
        if ($obj->isNew()) {
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...
836
            $obj->unsetNew();
837
            $eventResult = $this->executeEvent('afterInsert', $obj);
838
            if (!$eventResult) {
839
                $obj->setErrors('An error occured during the AfterInsert event');
840
841
                return false;
842
            }
843
        } else {
844
            $eventResult = $this->executeEvent('afterUpdate', $obj);
845
            if (!$eventResult) {
846
                $obj->setErrors('An error occured during the AfterUpdate event');
847
848
                return false;
849
            }
850
        }
851
852
        return true;
853
    }
854
855
    /**
856
     * @param       $obj
857
     * @param  bool $force
858
     * @param  bool $checkObject
859
     * @param  bool $debug
860
     * @return bool
861
     */
862
    public function insertD($obj, $force = false, $checkObject = true, $debug = false)
863
    {
864
        return $this->insert($obj, $force, $checkObject, true);
865
    }
866
867
    /**
868
     * Change a value for objects with a certain criteria
869
     *
870
     * @param string          $fieldname  Name of the field
871
     * @param string          $fieldvalue Value to write
872
     * @param CriteriaElement $criteria   {@link CriteriaElement}
873
     *
874
     * @param  bool           $force
875
     * @return bool
876
     */
877
    public function updateAll($fieldname, $fieldvalue, CriteriaElement $criteria = null, $force = false)
878
    {
879
        $set_clause = $fieldname . ' = ';
880
        if (is_numeric($fieldvalue)) {
881
            $set_clause .= $fieldvalue;
882
        } elseif (is_array($fieldvalue)) {
883
            $set_clause .= $this->db->quoteString(implode(',', $fieldvalue));
884
        } else {
885
            $set_clause .= $this->db->quoteString($fieldvalue);
886
        }
887
        $sql = 'UPDATE ' . $this->table . ' SET ' . $set_clause;
888
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
889
            $sql .= ' ' . $criteria->renderWhere();
890
        }
891 View Code Duplication
        if (false != $force) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison !== instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
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...
892
            $result = $this->db->queryF($sql);
893
        } else {
894
            $result = $this->db->query($sql);
895
        }
896
        if (!$result) {
897
            return false;
898
        }
899
900
        return true;
901
    }
902
903
    /**
904
     * delete all objects meeting the conditions
905
     *
906
     * @param  CriteriaElement $criteria {@link CriteriaElement} with conditions to meet
907
     * @return bool
908
     */
909
910
    public function deleteAll(CriteriaElement $criteria = null)
911
    {
912
        if (isset($criteria) && is_subclass_of($criteria, 'CriteriaElement')) {
0 ignored issues
show
Bug introduced by
Due to PHP Bug #53727, is_subclass_of returns inconsistent results on some PHP versions for interfaces; you could instead use ReflectionClass::implementsInterface.
Loading history...
913
            $sql = 'DELETE FROM ' . $this->table;
914
            $sql .= ' ' . $criteria->renderWhere();
915
            if (!$this->db->query($sql)) {
916
                return false;
917
            }
918
            $rows = $this->db->getAffectedRows();
919
920
            return $rows > 0 ? $rows : true;
921
        }
922
923
        return false;
924
    }
925
926
    /**
927
     * @return mixed
928
     */
929
    public function getModuleInfo()
930
    {
931
        return smart_getModuleInfo($this->_moduleName);
0 ignored issues
show
Documentation introduced by
$this->_moduleName 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...
932
    }
933
934
    /**
935
     * @return bool
936
     */
937
    public function getModuleConfig()
938
    {
939
        return smart_getModuleConfig($this->_moduleName);
0 ignored issues
show
Documentation introduced by
$this->_moduleName 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...
940
    }
941
942
    /**
943
     * @return string
944
     */
945
    public function getModuleItemString()
946
    {
947
        $ret = $this->_moduleName . '_' . $this->_itemname;
948
949
        return $ret;
950
    }
951
952
    /**
953
     * @param $object
954
     */
955
    public function updateCounter($object)
956
    {
957
        if (isset($object->vars['counter'])) {
958
            $new_counter = $object->getVar('counter') + 1;
959
            $sql         = 'UPDATE ' . $this->table . ' SET counter=' . $new_counter . ' WHERE ' . $this->keyName . '=' . $object->id();
960
            $this->query($sql, null, true);
961
        }
962
    }
963
964
    /**
965
     * Execute the function associated with an event
966
     * This method will check if the function is available
967
     *
968
     * @param  string $event name of the event
969
     * @param         $executeEventObj
970
     * @return mixed  result of the execution of the function or FALSE if the function was not executed
971
     * @internal param object $obj $object on which is performed the event
972
     */
973
    public function executeEvent($event, &$executeEventObj)
974
    {
975
        if (!in_array($event, $this->_disabledEvents)) {
976
            if (method_exists($this, $event)) {
977
                $ret = $this->$event($executeEventObj);
978
            } else {
979
                // check to see if there is a hook for this event
980
                if (isset($this->_eventHooks[$event])) {
981
                    $method = $this->_eventHooks[$event];
982
                    // check to see if the method specified by this hook exists
983
                    if (method_exists($this, $method)) {
984
                        $ret = $this->$method($executeEventObj);
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...
985
                    }
986
                }
987
                $ret = true;
988
            }
989
990
            return $ret;
991
        }
992
993
        return true;
994
    }
995
996
    /**
997
     * @param  bool $withprefix
998
     * @return string
999
     */
1000
    public function getIdentifierName($withprefix = true)
1001
    {
1002
        if ($withprefix) {
1003
            return $this->_itemname . '.' . $this->identifierName;
1004
        } else {
1005
            return $this->identifierName;
1006
        }
1007
    }
1008
}
1009