Completed
Pull Request — master (#565)
by Michael
19:36
created

GenericHelper::getConfig()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 20
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 11
nc 6
nop 2
dl 0
loc 20
rs 8.8571
c 0
b 0
f 0
1
<?php
2
/*
3
 You may not change or alter any portion of this comment or credits
4
 of supporting developers from this source code or any supporting source code
5
 which is considered copyrighted (c) material of the original comment or credit authors.
6
7
 This program is distributed in the hope that it will be useful,
8
 but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
*/
11
12
namespace Xmf\Module\Helper;
13
14
use Xmf\Language;
15
16
/**
17
 * GenericHelper implements a Xoops 2.6 Xoops\Module\Helper\HelperAbstract.
18
 * We use it pre 2.6 systems so we can encapsulate many of the changes
19
 * needed to make modules more compatible with 2.6 in these methods.
20
 * The most common deprecated warnings can be avoided by using module
21
 * helper methods.
22
 *
23
 * @category  Xmf\Module\Helper\GenericHelper
24
 * @package   Xmf
25
 * @author    trabis <[email protected]>
26
 * @author    Richard Griffith <[email protected]>
27
 * @copyright 2011-2016 XOOPS Project (http://xoops.org)
28
 * @license   GNU GPL 2 or later (http://www.gnu.org/licenses/gpl-2.0.html)
29
 * @link      http://xoops.org
30
 */
31
abstract class GenericHelper
32
{
33
    /**
34
     * @var string module directory name
35
     */
36
    protected $dirname;
37
38
    /**
39
     * @var \XoopsModule
40
     */
41
    protected $object;
42
43
    /**
44
     * @var array of XoopsObjectHandler|XoopsPersistableObjectHandler
45
     */
46
    protected $handlers;
47
48
    /**
49
     * @var array config items
50
     */
51
    protected $configs;
52
53
    /**
54
     * @var bool true if debug is enabled
55
     */
56
    protected $debug;
57
58
    /**
59
     * class constructor
60
     *
61
     * @param string $dirname a module directory name
62
     */
63
    protected function __construct($dirname)
64
    {
65
        $this->dirname = $dirname;
66
    }
67
68
    /**
69
     * get the module object
70
     *
71
     * @return XoopsModule
0 ignored issues
show
Documentation introduced by
Should the return type not be \XoopsModule?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
72
     */
73
    public function getModule()
74
    {
75
        if ($this->object == null) {
76
            $this->initObject();
77
        }
78
        if (!is_object($this->object)) {
79
            $this->addLog("ERROR :: Module '{$this->dirname}' does not exist");
80
        }
81
82
        return $this->object;
83
    }
84
85
    /**
86
     * get a module config item
87
     *
88
     * @param string $name    name of config item, or blank for all items
89
     * @param mixed  $default default value to return if config $name is not set
90
     *
91
     * @return mixed string config item, array of config items,
92
     *                or null if config not found
93
     */
94
    public function getConfig($name = null, $default = null)
95
    {
96
        if ($this->configs == null) {
97
            $this->initConfig();
98
        }
99
        if (empty($name)) {
100
            $this->addLog("Getting all config");
101
102
            return $this->configs;
103
        }
104
105
        if (!isset($this->configs[$name])) {
106
            $this->addLog("ERROR :: Config '{$name}' does not exist");
107
            return $default;
108
        }
109
110
        $this->addLog("Getting config '{$name}' : " . !is_array($this->configs[$name]) ?: json_encode($this->configs[$name]));
111
112
        return $this->configs[$name];
113
    }
114
115
    /**
116
     * Get an Object Handler
117
     *
118
     * @param string $name name of handler to load
119
     *
120
     * @return bool|XoopsObjectHandler|XoopsPersistableObjectHandler
121
     */
122
    public function getHandler($name)
123
    {
124
        $ret = false;
125
        $name = strtolower($name);
126
        if (!isset($this->handlers[$name])) {
127
            $this->initHandler($name);
128
        }
129
130
        if (!isset($this->handlers[$name])) {
131
            $this->addLog("ERROR :: Handler '{$name}' does not exist");
132
        } else {
133
            $this->addLog("Getting handler '{$name}'");
134
            $ret = $this->handlers[$name];
135
        }
136
137
        return $ret;
138
    }
139
140
    /**
141
     * get a module object
142
     *
143
     * @return void
144
     */
145
    protected function initObject()
146
    {
147
        global $xoopsModule;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
148
        if (isset($xoopsModule) && is_object($xoopsModule)
149
            && $xoopsModule->getVar('dirname') == $this->dirname
150
        ) {
151
            $this->object = $xoopsModule;
152
        } else {
153
            /* @var $module_handler \XoopsModuleHandler */
154
            $module_handler = xoops_getHandler('module');
155
            $this->object = $module_handler->getByDirname($this->dirname);
0 ignored issues
show
Documentation Bug introduced by
It seems like $module_handler->getByDirname($this->dirname) can also be of type false. However, the property $object is declared as type object<XoopsModule>. 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...
156
        }
157
        $this->addLog('INIT MODULE OBJECT');
158
    }
159
160
    /**
161
     * get module configs
162
     *
163
     * @return void
164
     */
165
    protected function initConfig()
166
    {
167
        $this->addLog('INIT CONFIG');
168
        global $xoopsModule;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
169
        if (isset($xoopsModule) && is_object($xoopsModule)
170
            && $xoopsModule->getVar('dirname') == $this->dirname
171
        ) {
172
            global $xoopsModuleConfig;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
173
            $this->configs = $xoopsModuleConfig;
174
        } else {
175
            /* @var $config_handler \XoopsConfigHandler */
176
            $config_handler = xoops_getHandler('config');
177
            $this->configs = $config_handler->getConfigsByCat(0, $this->getModule()->getVar('mid'));
178
        }
179
    }
180
181
    /**
182
     * get a handler instance and store in $this->_handlers
183
     *
184
     * @param string $name name of handler to load
185
     *
186
     * @return void
187
     */
188
    protected function initHandler($name)
189
    {
190
        $this->addLog('INIT ' . $name . ' HANDLER');
191
192
        if (!isset($this->handlers[$name])) {
193
            $hnd_file = XOOPS_ROOT_PATH . "/modules/{$this->dirname}/class/{$name}.php";
194
            if (file_exists($hnd_file)) {
195
                include_once $hnd_file;
196
            }
197
            $class = ucfirst(strtolower($this->dirname))
198
                . ucfirst(strtolower($name)) . 'Handler';
199
            if (class_exists($class)) {
200
                $db = \XoopsDatabaseFactory::getDatabaseConnection();
201
                $this->handlers[$name] = new $class($db);
202
                $this->addLog("Loading class '{$class}'");
203
            } else {
204
                $this->addLog("ERROR :: Class '{$class}' could not be loaded");
205
            }
206
        }
207
    }
208
209
    /**
210
     * load a language file for this module
211
     *
212
     * @param string $name basename of language file (i.e. 'admin')
213
     *
214
     * @return bool
215
     */
216
    public function loadLanguage($name)
217
    {
218
        if ($ret = Language::load($name, $this->dirname)) {
219
            $this->addLog("Loading language '{$name}'");
220
        } else {
221
            $this->addLog("ERROR :: Language '{$name}' could not be loaded");
222
        }
223
224
        return $ret;
225
    }
226
227
    /**
228
     * Set debug option on or off
229
     *
230
     * @param bool $bool true to turn on debug logging, false for off
231
     *
232
     * @return void
233
     */
234
    public function setDebug($bool = true)
235
    {
236
        $this->debug = (bool) $bool;
237
    }
238
239
    /**
240
     * Add a message to the module log
241
     *
242
     * @param string $log log message
243
     *
244
     * @return void
245
     */
246
    public function addLog($log)
247
    {
248
        if ($this->debug) {
249
            if (is_object($GLOBALS['xoopsLogger'])) {
250
                if (!is_scalar($log)) {
251
                    $log = serialize($log);
252
                }
253
                $GLOBALS['xoopsLogger']->addExtra(
254
                    is_object($this->object) ? $this->object->name() : $this->dirname,
255
                    $log
256
                );
257
            }
258
        }
259
    }
260
261
    /**
262
     * Is this the currently active module?
263
     *
264
     * @return bool
265
     */
266
    public function isCurrentModule()
267
    {
268
        if ($GLOBALS['xoopsModule']->getVar('dirname') == $this->dirname) {
269
            return true;
270
        }
271
272
        return false;
273
    }
274
275
    /**
276
     * Does user have admin rights to this module?
277
     *
278
     * @return bool true is user has admin right, else false
279
     */
280
    public function isUserAdmin()
281
    {
282
        return (isset($GLOBALS['xoopsUser']) && $GLOBALS['xoopsUser'] instanceof \XoopsUser)
283
            ? $GLOBALS['xoopsUser']->isAdmin($this->getModule()->getVar('mid')) : false;
284
    }
285
286
    /**
287
     * Return absolute URL for a module relative URL
288
     *
289
     * @param string $url module relative URL
290
     *
291
     * @return string
292
     */
293
    public function url($url = '')
294
    {
295
        return XOOPS_URL . '/modules/' . $this->dirname . '/' . $url;
296
    }
297
298
    /**
299
     * Return absolute filesystem path for a module relative path
300
     *
301
     * @param string $path module relative file system path
302
     *
303
     * @return string
304
     */
305
    public function path($path = '')
306
    {
307
        return XOOPS_ROOT_PATH . '/modules/' . $this->dirname . '/' . $path;
308
    }
309
310
    /**
311
     * Redirect the user to a page within this module
312
     *
313
     * @param string $url     module relative url (i.e. index.php)
314
     * @param int    $time    time in seconds to show redirect message
315
     * @param string $message redirect message
316
     *
317
     * @return void
318
     */
319
    public function redirect($url, $time = 3, $message = '')
320
    {
321
        redirect_header($this->url($url), $time, $message);
322
    }
323
}
324