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 <lusopoemas@gmail.com>
26: * @author Richard Griffith <richard@geekwright.com>
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;
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);
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;
169: if (isset($xoopsModule) && is_object($xoopsModule)
170: && $xoopsModule->getVar('dirname') == $this->dirname
171: ) {
172: global $xoopsModuleConfig;
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: