Completed
Pull Request — master (#503)
by Richard
10:19
created

GenericHelper   B

Complexity

Total Complexity 39

Size/Duplication

Total Lines 293
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 3.23%

Importance

Changes 3
Bugs 1 Features 0
Metric Value
c 3
b 1
f 0
dl 0
loc 293
ccs 3
cts 93
cp 0.0323
rs 8.2857
wmc 39
lcom 1
cbo 3

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getModule() 0 11 3
A getConfig() 0 20 4
A getHandler() 0 17 3
A initObject() 0 14 4
A initConfig() 0 15 4
A initHandler() 0 20 4
A loadLanguage() 0 10 2
A setDebug() 0 4 1
B addLog() 0 14 5
A isCurrentModule() 0 8 2
A isUserAdmin() 0 5 3
A url() 0 4 1
A path() 0 4 1
A redirect() 0 4 1
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
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}' : " . $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');
0 ignored issues
show
Deprecated Code introduced by
The function xoops_getHandler() has been deprecated.

This function has been deprecated.

Loading history...
155
            $this->object = $module_handler->getByDirname($this->dirname);
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');
0 ignored issues
show
Deprecated Code introduced by
The function xoops_getHandler() has been deprecated.

This function has been deprecated.

Loading history...
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)
0 ignored issues
show
Coding Style introduced by
addLog uses the super-global variable $GLOBALS which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

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

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
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()
0 ignored issues
show
Coding Style introduced by
isCurrentModule uses the super-global variable $GLOBALS which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

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

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
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 1
    public function isUserAdmin()
0 ignored issues
show
Coding Style introduced by
isUserAdmin uses the super-global variable $GLOBALS which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

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

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
281
    {
282 1
        return (isset($GLOBALS['xoopsUser']) && $GLOBALS['xoopsUser'] instanceof \XoopsUser)
283 1
            ? $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);
0 ignored issues
show
Deprecated Code introduced by
The function redirect_header() has been deprecated.

This function has been deprecated.

Loading history...
322
    }
323
}
324