phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / acp / acp_modules.php

History | View | Annotate | Download (30.9 kB)

1 5303 acydburn
<?php
2 8147 acydburn
/**
3 5303 acydburn
*
4 5303 acydburn
* @package acp
5 5303 acydburn
* @version $Id$
6 8147 acydburn
* @copyright (c) 2005 phpBB Group
7 8147 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5303 acydburn
*
9 5303 acydburn
*/
10 5303 acydburn
11 5303 acydburn
/**
12 8147 acydburn
* @ignore
13 8147 acydburn
*/
14 8147 acydburn
if (!defined('IN_PHPBB'))
15 8147 acydburn
{
16 8147 acydburn
        exit;
17 8147 acydburn
}
18 8147 acydburn
19 8147 acydburn
/**
20 5303 acydburn
* - Able to check for new module versions (modes changed/adjusted/added/removed)
21 5303 acydburn
* Icons for:
22 5303 acydburn
* - module enabled and displayed (common)
23 5303 acydburn
* - module enabled and not displayed
24 5303 acydburn
* - module deactivated
25 5303 acydburn
* - category (enabled)
26 5303 acydburn
* - category disabled
27 5303 acydburn
*/
28 5303 acydburn
29 5303 acydburn
/**
30 5303 acydburn
* @package acp
31 5303 acydburn
*/
32 5303 acydburn
class acp_modules
33 5303 acydburn
{
34 5310 acydburn
        var $module_class = '';
35 6428 acydburn
        var $parent_id;
36 5558 acydburn
        var $u_action;
37 5303 acydburn
38 5303 acydburn
        function main($id, $mode)
39 5303 acydburn
        {
40 7938 acydburn
                global $db, $user, $auth, $template, $module;
41 6015 acydburn
                global $config, $phpbb_admin_path, $phpbb_root_path, $phpEx;
42 5303 acydburn
43 6073 acydburn
                // Set a global define for modules we might include (the author is able to prevent execution of code by checking this constant)
44 5303 acydburn
                define('MODULE_INCLUDE', true);
45 5303 acydburn
46 5303 acydburn
                $user->add_lang('acp/modules');
47 5303 acydburn
                $this->tpl_name = 'acp_modules';
48 5303 acydburn
49 5303 acydburn
                // module class
50 5303 acydburn
                $this->module_class = $mode;
51 5303 acydburn
52 5303 acydburn
                if ($this->module_class == 'ucp')
53 5303 acydburn
                {
54 5303 acydburn
                        $user->add_lang('ucp');
55 5303 acydburn
                }
56 5388 acydburn
                else if ($this->module_class == 'mcp')
57 5388 acydburn
                {
58 5388 acydburn
                        $user->add_lang('mcp');
59 5388 acydburn
                }
60 5303 acydburn
61 7938 acydburn
                if ($module->p_class != $this->module_class)
62 7938 acydburn
                {
63 7938 acydburn
                        $module->add_mod_info($this->module_class);
64 7938 acydburn
                }
65 7938 acydburn
66 5310 acydburn
                $this->page_title = strtoupper($this->module_class);
67 5310 acydburn
68 6428 acydburn
                $this->parent_id = request_var('parent_id', 0);
69 5303 acydburn
                $module_id = request_var('m', 0);
70 5303 acydburn
                $action = request_var('action', '');
71 5303 acydburn
                $errors = array();
72 5303 acydburn
73 5303 acydburn
                switch ($action)
74 5303 acydburn
                {
75 5303 acydburn
                        case 'delete':
76 5303 acydburn
                                if (!$module_id)
77 5303 acydburn
                                {
78 6428 acydburn
                                        trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
79 5303 acydburn
                                }
80 6561 acydburn
81 5303 acydburn
                                if (confirm_box(true))
82 5303 acydburn
                                {
83 6719 acydburn
                                        // Make sure we are not directly within a module
84 6719 acydburn
                                        if ($module_id == $this->parent_id)
85 6719 acydburn
                                        {
86 6719 acydburn
                                                $sql = 'SELECT parent_id
87 6719 acydburn
                                                        FROM ' . MODULES_TABLE . '
88 6719 acydburn
                                                        WHERE module_id = ' . $module_id;
89 6719 acydburn
                                                $result = $db->sql_query($sql);
90 6719 acydburn
                                                $this->parent_id = (int) $db->sql_fetchfield('parent_id');
91 6719 acydburn
                                                $db->sql_freeresult($result);
92 6719 acydburn
                                        }
93 6719 acydburn
94 5303 acydburn
                                        $errors = $this->delete_module($module_id);
95 5303 acydburn
96 5303 acydburn
                                        if (!sizeof($errors))
97 5303 acydburn
                                        {
98 5303 acydburn
                                                $this->remove_cache_file();
99 6428 acydburn
                                                trigger_error($user->lang['MODULE_DELETED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
100 5303 acydburn
                                        }
101 5303 acydburn
                                }
102 5303 acydburn
                                else
103 5303 acydburn
                                {
104 5303 acydburn
                                        confirm_box(false, 'DELETE_MODULE', build_hidden_fields(array(
105 5303 acydburn
                                                'i'                        => $id,
106 5303 acydburn
                                                'mode'                => $mode,
107 6428 acydburn
                                                'parent_id'        => $this->parent_id,
108 5303 acydburn
                                                'module_id'        => $module_id,
109 5303 acydburn
                                                'action'        => $action,
110 5303 acydburn
                                        )));
111 5303 acydburn
                                }
112 5303 acydburn
113 5303 acydburn
                        break;
114 5303 acydburn
115 5303 acydburn
                        case 'enable':
116 5303 acydburn
                        case 'disable':
117 5303 acydburn
                                if (!$module_id)
118 5303 acydburn
                                {
119 6428 acydburn
                                        trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
120 5303 acydburn
                                }
121 6561 acydburn
122 7485 acydburn
                                $sql = 'SELECT *
123 7485 acydburn
                                        FROM ' . MODULES_TABLE . "
124 7485 acydburn
                                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
125 7485 acydburn
                                                AND module_id = $module_id";
126 7485 acydburn
                                $result = $db->sql_query($sql);
127 7485 acydburn
                                $row = $db->sql_fetchrow($result);
128 7485 acydburn
                                $db->sql_freeresult($result);
129 7485 acydburn
130 7485 acydburn
                                if (!$row)
131 7485 acydburn
                                {
132 7485 acydburn
                                        trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
133 7485 acydburn
                                }
134 7485 acydburn
135 8147 acydburn
                                $sql = 'UPDATE ' . MODULES_TABLE . '
136 5303 acydburn
                                        SET module_enabled = ' . (($action == 'enable') ? 1 : 0) . "
137 7485 acydburn
                                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
138 7485 acydburn
                                                AND module_id = $module_id";
139 5303 acydburn
                                $db->sql_query($sql);
140 5303 acydburn
141 7485 acydburn
                                add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']));
142 5303 acydburn
                                $this->remove_cache_file();
143 5303 acydburn
144 5303 acydburn
                        break;
145 5303 acydburn
146 5303 acydburn
                        case 'move_up':
147 5303 acydburn
                        case 'move_down':
148 5303 acydburn
                                if (!$module_id)
149 5303 acydburn
                                {
150 6428 acydburn
                                        trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
151 5303 acydburn
                                }
152 5303 acydburn
153 6071 acydburn
                                $sql = 'SELECT *
154 5303 acydburn
                                        FROM ' . MODULES_TABLE . "
155 5303 acydburn
                                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
156 5303 acydburn
                                                AND module_id = $module_id";
157 5303 acydburn
                                $result = $db->sql_query($sql);
158 6071 acydburn
                                $row = $db->sql_fetchrow($result);
159 6071 acydburn
                                $db->sql_freeresult($result);
160 5303 acydburn
161 6071 acydburn
                                if (!$row)
162 5303 acydburn
                                {
163 6428 acydburn
                                        trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
164 5303 acydburn
                                }
165 5303 acydburn
166 6061 acydburn
                                $move_module_name = $this->move_module_by($row, $action, 1);
167 5303 acydburn
168 6061 acydburn
                                if ($move_module_name !== false)
169 5303 acydburn
                                {
170 7497 acydburn
                                        add_log('admin', 'LOG_MODULE_' . strtoupper($action), $this->lang_name($row['module_langname']), $move_module_name);
171 6061 acydburn
                                        $this->remove_cache_file();
172 5303 acydburn
                                }
173 5303 acydburn
174 5303 acydburn
                        break;
175 5303 acydburn
176 5303 acydburn
                        case 'quickadd':
177 5303 acydburn
                                $quick_install = request_var('quick_install', '');
178 5303 acydburn
179 5303 acydburn
                                if (confirm_box(true))
180 5303 acydburn
                                {
181 5303 acydburn
                                        if (!$quick_install || strpos($quick_install, '::') === false)
182 5303 acydburn
                                        {
183 5303 acydburn
                                                break;
184 5303 acydburn
                                        }
185 5303 acydburn
186 6177 acydburn
                                        list($module_basename, $module_mode) = explode('::', $quick_install);
187 5303 acydburn
188 5303 acydburn
                                        // Check if module name and mode exist...
189 6177 acydburn
                                        $fileinfo = $this->get_module_infos($module_basename);
190 6177 acydburn
                                        $fileinfo = $fileinfo[$module_basename];
191 5303 acydburn
192 5303 acydburn
                                        if (isset($fileinfo['modes'][$module_mode]))
193 5303 acydburn
                                        {
194 5303 acydburn
                                                $module_data = array(
195 6177 acydburn
                                                        'module_basename'        => $module_basename,
196 5303 acydburn
                                                        'module_enabled'        => 0,
197 5303 acydburn
                                                        'module_display'        => (isset($fileinfo['modes'][$module_mode]['display'])) ? $fileinfo['modes'][$module_mode]['display'] : 1,
198 6428 acydburn
                                                        'parent_id'                        => $this->parent_id,
199 5303 acydburn
                                                        'module_class'                => $this->module_class,
200 5303 acydburn
                                                        'module_langname'        => $fileinfo['modes'][$module_mode]['title'],
201 5303 acydburn
                                                        'module_mode'                => $module_mode,
202 5303 acydburn
                                                        'module_auth'                => $fileinfo['modes'][$module_mode]['auth'],
203 5303 acydburn
                                                );
204 5303 acydburn
205 5303 acydburn
                                                $errors = $this->update_module_data($module_data);
206 5303 acydburn
207 5303 acydburn
                                                if (!sizeof($errors))
208 5303 acydburn
                                                {
209 5303 acydburn
                                                        $this->remove_cache_file();
210 5303 acydburn
211 6428 acydburn
                                                        trigger_error($user->lang['MODULE_ADDED'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
212 5303 acydburn
                                                }
213 5303 acydburn
                                        }
214 5303 acydburn
                                }
215 5303 acydburn
                                else
216 5303 acydburn
                                {
217 5303 acydburn
                                        confirm_box(false, 'ADD_MODULE', build_hidden_fields(array(
218 5303 acydburn
                                                'i'                        => $id,
219 5303 acydburn
                                                'mode'                => $mode,
220 6428 acydburn
                                                'parent_id'        => $this->parent_id,
221 5303 acydburn
                                                'action'        => 'quickadd',
222 5303 acydburn
                                                'quick_install'        => $quick_install,
223 5303 acydburn
                                        )));
224 5303 acydburn
                                }
225 5303 acydburn
226 5303 acydburn
                        break;
227 5303 acydburn
228 5303 acydburn
                        case 'edit':
229 5303 acydburn
230 5303 acydburn
                                if (!$module_id)
231 5303 acydburn
                                {
232 6428 acydburn
                                        trigger_error($user->lang['NO_MODULE_ID'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
233 5303 acydburn
                                }
234 5303 acydburn
235 5303 acydburn
                                $module_row = $this->get_module_row($module_id);
236 5303 acydburn
237 5303 acydburn
                        // no break
238 5303 acydburn
239 5303 acydburn
                        case 'add':
240 5303 acydburn
241 5303 acydburn
                                if ($action == 'add')
242 5303 acydburn
                                {
243 5303 acydburn
                                        $module_row = array(
244 6177 acydburn
                                                'module_basename'        => '',
245 5303 acydburn
                                                'module_enabled'        => 0,
246 5303 acydburn
                                                'module_display'        => 1,
247 5303 acydburn
                                                'parent_id'                        => 0,
248 7920 acydburn
                                                'module_langname'        => utf8_normalize_nfc(request_var('module_langname', '', true)),
249 5303 acydburn
                                                'module_mode'                => '',
250 5303 acydburn
                                                'module_auth'                => '',
251 5303 acydburn
                                        );
252 5303 acydburn
                                }
253 5303 acydburn
254 5303 acydburn
                                $module_data = array();
255 5303 acydburn
256 6177 acydburn
                                $module_data['module_basename'] = request_var('module_basename', (string) $module_row['module_basename']);
257 5303 acydburn
                                $module_data['module_enabled'] = request_var('module_enabled', (int) $module_row['module_enabled']);
258 5303 acydburn
                                $module_data['module_display'] = request_var('module_display', (int) $module_row['module_display']);
259 5416 acydburn
                                $module_data['parent_id'] = request_var('module_parent_id', (int) $module_row['parent_id']);
260 5303 acydburn
                                $module_data['module_class'] = $this->module_class;
261 7920 acydburn
                                $module_data['module_langname'] = utf8_normalize_nfc(request_var('module_langname', (string) $module_row['module_langname'], true));
262 5303 acydburn
                                $module_data['module_mode'] = request_var('module_mode', (string) $module_row['module_mode']);
263 5303 acydburn
264 5303 acydburn
                                $submit = (isset($_POST['submit'])) ? true : false;
265 5303 acydburn
266 5303 acydburn
                                if ($submit)
267 5303 acydburn
                                {
268 5303 acydburn
                                        if (!$module_data['module_langname'])
269 5303 acydburn
                                        {
270 6428 acydburn
                                                trigger_error($user->lang['NO_MODULE_LANGNAME'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
271 5303 acydburn
                                        }
272 5303 acydburn
273 5303 acydburn
                                        $module_type = request_var('module_type', 'category');
274 5303 acydburn
275 5303 acydburn
                                        if ($module_type == 'category')
276 5303 acydburn
                                        {
277 6177 acydburn
                                                $module_data['module_basename'] = $module_data['module_mode'] = $module_data['module_auth'] = '';
278 5303 acydburn
                                                $module_data['module_display'] = 1;
279 5303 acydburn
                                        }
280 5303 acydburn
281 5303 acydburn
                                        if ($action == 'edit')
282 5303 acydburn
                                        {
283 5303 acydburn
                                                $module_data['module_id'] = $module_id;
284 5303 acydburn
                                        }
285 5303 acydburn
286 5303 acydburn
                                        // Adjust auth row
287 6177 acydburn
                                        if ($module_data['module_basename'] && $module_data['module_mode'])
288 5303 acydburn
                                        {
289 6177 acydburn
                                                $fileinfo = $this->get_module_infos($module_data['module_basename']);
290 6177 acydburn
                                                $module_data['module_auth'] = $fileinfo[$module_data['module_basename']]['modes'][$module_data['module_mode']]['auth'];
291 5303 acydburn
                                        }
292 5303 acydburn
293 5303 acydburn
                                        $errors = $this->update_module_data($module_data);
294 5303 acydburn
295 5303 acydburn
                                        if (!sizeof($errors))
296 5303 acydburn
                                        {
297 5303 acydburn
                                                $this->remove_cache_file();
298 5303 acydburn
299 6428 acydburn
                                                trigger_error((($action == 'add') ? $user->lang['MODULE_ADDED'] : $user->lang['MODULE_EDITED']) . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id));
300 5303 acydburn
                                        }
301 5303 acydburn
                                }
302 5303 acydburn
303 5303 acydburn
                                // Category/not category?
304 6177 acydburn
                                $is_cat = (!$module_data['module_basename']) ? true : false;
305 5303 acydburn
306 6650 acydburn
                                // Get module information
307 5303 acydburn
                                $module_infos = $this->get_module_infos();
308 5303 acydburn
309 5303 acydburn
                                // Build name options
310 5303 acydburn
                                $s_name_options = $s_mode_options = '';
311 5303 acydburn
                                foreach ($module_infos as $option => $values)
312 5303 acydburn
                                {
313 6177 acydburn
                                        if (!$module_data['module_basename'])
314 5303 acydburn
                                        {
315 6177 acydburn
                                                $module_data['module_basename'] = $option;
316 5303 acydburn
                                        }
317 5303 acydburn
318 5303 acydburn
                                        // Name options
319 6177 acydburn
                                        $s_name_options .= '<option value="' . $option . '"' . (($option == $module_data['module_basename']) ? ' selected="selected"' : '') . '>' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']</option>';
320 5303 acydburn
321 8099 acydburn
                                        $template->assign_block_vars('m_names', array('NAME' => $option, 'A_NAME' => addslashes($option)));
322 5303 acydburn
323 5303 acydburn
                                        // Build module modes
324 5303 acydburn
                                        foreach ($values['modes'] as $m_mode => $m_values)
325 5303 acydburn
                                        {
326 6177 acydburn
                                                if ($option == $module_data['module_basename'])
327 5303 acydburn
                                                {
328 5303 acydburn
                                                        $s_mode_options .= '<option value="' . $m_mode . '"' . (($m_mode == $module_data['module_mode']) ? ' selected="selected"' : '') . '>' . $this->lang_name($m_values['title']) . '</option>';
329 5303 acydburn
                                                }
330 5303 acydburn
331 5303 acydburn
                                                $template->assign_block_vars('m_names.modes', array(
332 5888 naderman
                                                        'OPTION'                => $m_mode,
333 5888 naderman
                                                        'VALUE'                        => $this->lang_name($m_values['title']),
334 5888 naderman
                                                        'A_OPTION'                => addslashes($m_mode),
335 5888 naderman
                                                        'A_VALUE'                => addslashes($this->lang_name($m_values['title'])))
336 5303 acydburn
                                                );
337 5303 acydburn
                                        }
338 5303 acydburn
                                }
339 5303 acydburn
340 5303 acydburn
                                $s_cat_option = '<option value="0"' . (($module_data['parent_id'] == 0) ? ' selected="selected"' : '') . '>' . $user->lang['NO_PARENT'] . '</option>';
341 5303 acydburn
342 5303 acydburn
                                $template->assign_vars(array_merge(array(
343 5303 acydburn
                                        'S_EDIT_MODULE'                => true,
344 5303 acydburn
                                        'S_IS_CAT'                        => $is_cat,
345 5416 acydburn
                                        'S_CAT_OPTIONS'                => $s_cat_option . $this->make_module_select($module_data['parent_id'], ($action == 'edit') ? $module_row['module_id'] : false, false, false, false, true),
346 5303 acydburn
                                        'S_MODULE_NAMES'        => $s_name_options,
347 5303 acydburn
                                        'S_MODULE_MODES'        => $s_mode_options,
348 6428 acydburn
                                        'U_BACK'                        => $this->u_action . '&amp;parent_id=' . $this->parent_id,
349 6428 acydburn
                                        'U_EDIT_ACTION'                => $this->u_action . '&amp;parent_id=' . $this->parent_id,
350 5303 acydburn
351 5303 acydburn
                                        'L_TITLE'                        => $user->lang[strtoupper($action) . '_MODULE'],
352 5303 acydburn
353 5303 acydburn
                                        'MODULENAME'                => $this->lang_name($module_data['module_langname']),
354 5303 acydburn
                                        'ACTION'                        => $action,
355 5303 acydburn
                                        'MODULE_ID'                        => $module_id,
356 5303 acydburn
357 8147 acydburn
                                ),
358 5303 acydburn
                                        array_change_key_case($module_data, CASE_UPPER))
359 5303 acydburn
                                );
360 5303 acydburn
361 5303 acydburn
                                if (sizeof($errors))
362 5303 acydburn
                                {
363 5303 acydburn
                                        $template->assign_vars(array(
364 5303 acydburn
                                                'S_ERROR'        => true,
365 5303 acydburn
                                                'ERROR_MSG'        => implode('<br />', $errors))
366 5303 acydburn
                                        );
367 5303 acydburn
                                }
368 5303 acydburn
369 5303 acydburn
                                return;
370 5303 acydburn
371 5303 acydburn
                        break;
372 5303 acydburn
                }
373 5303 acydburn
374 5303 acydburn
                // Default management page
375 5303 acydburn
                if (sizeof($errors))
376 5303 acydburn
                {
377 5303 acydburn
                        $template->assign_vars(array(
378 5303 acydburn
                                'S_ERROR'        => true,
379 5303 acydburn
                                'ERROR_MSG'        => implode('<br />', $errors))
380 5303 acydburn
                        );
381 5303 acydburn
                }
382 5303 acydburn
383 6428 acydburn
                if (!$this->parent_id)
384 5303 acydburn
                {
385 5303 acydburn
                        $navigation = strtoupper($this->module_class);
386 5303 acydburn
                }
387 5303 acydburn
                else
388 5303 acydburn
                {
389 5558 acydburn
                        $navigation = '<a href="' . $this->u_action . '">' . strtoupper($this->module_class) . '</a>';
390 5303 acydburn
391 6428 acydburn
                        $modules_nav = $this->get_module_branch($this->parent_id, 'parents', 'descending');
392 6561 acydburn
393 5303 acydburn
                        foreach ($modules_nav as $row)
394 5303 acydburn
                        {
395 5303 acydburn
                                $langname = $this->lang_name($row['module_langname']);
396 5303 acydburn
397 6428 acydburn
                                if ($row['module_id'] == $this->parent_id)
398 5303 acydburn
                                {
399 5303 acydburn
                                        $navigation .= ' -&gt; ' . $langname;
400 5303 acydburn
                                }
401 5303 acydburn
                                else
402 5303 acydburn
                                {
403 5558 acydburn
                                        $navigation .= ' -&gt; <a href="' . $this->u_action . '&amp;parent_id=' . $row['module_id'] . '">' . $langname . '</a>';
404 5303 acydburn
                                }
405 5303 acydburn
                        }
406 5303 acydburn
                }
407 5303 acydburn
408 5303 acydburn
                // Jumpbox
409 6428 acydburn
                $module_box = $this->make_module_select($this->parent_id, false, false, false, false);
410 5303 acydburn
411 5303 acydburn
                $sql = 'SELECT *
412 5303 acydburn
                        FROM ' . MODULES_TABLE . "
413 6428 acydburn
                        WHERE parent_id = {$this->parent_id}
414 5303 acydburn
                                AND module_class = '" . $db->sql_escape($this->module_class) . "'
415 5303 acydburn
                        ORDER BY left_id";
416 5303 acydburn
                $result = $db->sql_query($sql);
417 5303 acydburn
418 5303 acydburn
                if ($row = $db->sql_fetchrow($result))
419 5303 acydburn
                {
420 5303 acydburn
                        do
421 5303 acydburn
                        {
422 5303 acydburn
                                $langname = $this->lang_name($row['module_langname']);
423 5303 acydburn
424 5303 acydburn
                                if (!$row['module_enabled'])
425 5303 acydburn
                                {
426 7137 dhn2
                                        $module_image = '<img src="images/icon_folder_lock.gif" alt="' . $user->lang['DEACTIVATED_MODULE'] .'" />';
427 5303 acydburn
                                }
428 5303 acydburn
                                else
429 5303 acydburn
                                {
430 7137 dhn2
                                        $module_image = (!$row['module_basename'] || $row['left_id'] + 1 != $row['right_id']) ? '<img src="images/icon_subfolder.gif" alt="' . $user->lang['CATEGORY'] . '" />' : '<img src="images/icon_folder.gif" alt="' . $user->lang['MODULE'] . '" />';
431 5303 acydburn
                                }
432 5303 acydburn
433 6428 acydburn
                                $url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;m=' . $row['module_id'];
434 6561 acydburn
435 5303 acydburn
                                $template->assign_block_vars('modules', array(
436 5303 acydburn
                                        'MODULE_IMAGE'                => $module_image,
437 5303 acydburn
                                        'MODULE_TITLE'                => $langname,
438 5303 acydburn
                                        'MODULE_ENABLED'        => ($row['module_enabled']) ? true : false,
439 5357 acydburn
                                        'MODULE_DISPLAYED'        => ($row['module_display']) ? true : false,
440 5303 acydburn
441 6561 acydburn
                                        'S_ACP_CAT_SYSTEM'                        => ($this->module_class == 'acp' && $row['module_langname'] == 'ACP_CAT_SYSTEM') ? true : false,
442 6561 acydburn
                                        'S_ACP_MODULE_MANAGEMENT'        => ($this->module_class == 'acp' && ($row['module_basename'] == 'modules' || $row['module_langname'] == 'ACP_MODULE_MANAGEMENT')) ? true : false,
443 6561 acydburn
444 5558 acydburn
                                        'U_MODULE'                        => $this->u_action . '&amp;parent_id=' . $row['module_id'],
445 5303 acydburn
                                        'U_MOVE_UP'                        => $url . '&amp;action=move_up',
446 5303 acydburn
                                        'U_MOVE_DOWN'                => $url . '&amp;action=move_down',
447 5303 acydburn
                                        'U_EDIT'                        => $url . '&amp;action=edit',
448 5303 acydburn
                                        'U_DELETE'                        => $url . '&amp;action=delete',
449 5303 acydburn
                                        'U_ENABLE'                        => $url . '&amp;action=enable',
450 5303 acydburn
                                        'U_DISABLE'                        => $url . '&amp;action=disable')
451 5303 acydburn
                                );
452 5303 acydburn
                        }
453 5303 acydburn
                        while ($row = $db->sql_fetchrow($result));
454 5303 acydburn
                }
455 6428 acydburn
                else if ($this->parent_id)
456 5303 acydburn
                {
457 6428 acydburn
                        $row = $this->get_module_row($this->parent_id);
458 5303 acydburn
459 6428 acydburn
                        $url = $this->u_action . '&amp;parent_id=' . $this->parent_id . '&amp;m=' . $row['module_id'];
460 5303 acydburn
461 5303 acydburn
                        $template->assign_vars(array(
462 5303 acydburn
                                'S_NO_MODULES'                => true,
463 5995 acydburn
                                'MODULE_TITLE'                => $langname,
464 5995 acydburn
                                'MODULE_ENABLED'        => ($row['module_enabled']) ? true : false,
465 5995 acydburn
                                'MODULE_DISPLAYED'        => ($row['module_display']) ? true : false,
466 5303 acydburn
467 5303 acydburn
                                'U_EDIT'                        => $url . '&amp;action=edit',
468 5303 acydburn
                                'U_DELETE'                        => $url . '&amp;action=delete',
469 5303 acydburn
                                'U_ENABLE'                        => $url . '&amp;action=enable',
470 5303 acydburn
                                'U_DISABLE'                        => $url . '&amp;action=disable')
471 5303 acydburn
                        );
472 5303 acydburn
                }
473 5303 acydburn
                $db->sql_freeresult($result);
474 5303 acydburn
475 5303 acydburn
                // Quick adding module
476 5303 acydburn
                $module_infos = $this->get_module_infos();
477 5303 acydburn
478 5303 acydburn
                // Build quick options
479 5303 acydburn
                $s_install_options = '';
480 5303 acydburn
                foreach ($module_infos as $option => $values)
481 5303 acydburn
                {
482 5303 acydburn
                        // Name options
483 5303 acydburn
                        $s_install_options .= '<optgroup label="' . $this->lang_name($values['title']) . ' [' . $this->module_class . '_' . $option . ']">';
484 5303 acydburn
485 5303 acydburn
                        // Build module modes
486 5303 acydburn
                        foreach ($values['modes'] as $m_mode => $m_values)
487 5303 acydburn
                        {
488 5303 acydburn
                                $s_install_options .= '<option value="' . $option . '::' . $m_mode . '">&nbsp; &nbsp;' . $this->lang_name($m_values['title']) . '</option>';
489 5303 acydburn
                        }
490 5303 acydburn
491 5303 acydburn
                        $s_install_options .= '</optgroup>';
492 5303 acydburn
                }
493 5303 acydburn
494 5303 acydburn
                $template->assign_vars(array(
495 6428 acydburn
                        'U_SEL_ACTION'                => $this->u_action,
496 6428 acydburn
                        'U_ACTION'                        => $this->u_action . '&amp;parent_id=' . $this->parent_id,
497 6428 acydburn
                        'NAVIGATION'                => $navigation,
498 6428 acydburn
                        'MODULE_BOX'                => $module_box,
499 6428 acydburn
                        'PARENT_ID'                        => $this->parent_id,
500 5303 acydburn
                        'S_INSTALL_OPTIONS'        => $s_install_options,
501 5303 acydburn
                        )
502 5303 acydburn
                );
503 5303 acydburn
        }
504 5303 acydburn
505 5303 acydburn
        /**
506 5303 acydburn
        * Get row for specified module
507 5303 acydburn
        */
508 5303 acydburn
        function get_module_row($module_id)
509 5303 acydburn
        {
510 5303 acydburn
                global $db, $user;
511 5303 acydburn
512 5303 acydburn
                $sql = 'SELECT *
513 5303 acydburn
                        FROM ' . MODULES_TABLE . "
514 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
515 5303 acydburn
                                AND module_id = $module_id";
516 5303 acydburn
                $result = $db->sql_query($sql);
517 5303 acydburn
                $row = $db->sql_fetchrow($result);
518 5303 acydburn
                $db->sql_freeresult($result);
519 5303 acydburn
520 5303 acydburn
                if (!$row)
521 5303 acydburn
                {
522 6428 acydburn
                        trigger_error($user->lang['NO_MODULE'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
523 5303 acydburn
                }
524 5303 acydburn
525 5303 acydburn
                return $row;
526 5303 acydburn
        }
527 5303 acydburn
528 5303 acydburn
        /**
529 6650 acydburn
        * Get available module information from module files
530 5303 acydburn
        */
531 5848 acydburn
        function get_module_infos($module = '', $module_class = false)
532 5303 acydburn
        {
533 5303 acydburn
                global $phpbb_root_path, $phpEx;
534 5303 acydburn
535 5848 acydburn
                $module_class = ($module_class === false) ? $this->module_class : $module_class;
536 5848 acydburn
537 5848 acydburn
                $directory = $phpbb_root_path . 'includes/' . $module_class . '/info/';
538 5303 acydburn
                $fileinfo = array();
539 5303 acydburn
540 5303 acydburn
                if (!$module)
541 5303 acydburn
                {
542 6912 acydburn
                        $dh = @opendir($directory);
543 6912 acydburn
544 6912 acydburn
                        if (!$dh)
545 6912 acydburn
                        {
546 6912 acydburn
                                return $fileinfo;
547 6912 acydburn
                        }
548 6912 acydburn
549 5743 davidmj
                        while (($file = readdir($dh)) !== false)
550 5303 acydburn
                        {
551 5303 acydburn
                                // Is module?
552 5848 acydburn
                                if (preg_match('/^' . $module_class . '_.+\.' . $phpEx . '$/', $file))
553 5303 acydburn
                                {
554 5303 acydburn
                                        $class = str_replace(".$phpEx", '', $file) . '_info';
555 5303 acydburn
556 5303 acydburn
                                        if (!class_exists($class))
557 5303 acydburn
                                        {
558 5303 acydburn
                                                include($directory . $file);
559 5303 acydburn
                                        }
560 5303 acydburn
561 5303 acydburn
                                        // Get module title tag
562 5303 acydburn
                                        if (class_exists($class))
563 5303 acydburn
                                        {
564 5303 acydburn
                                                $c_class = new $class();
565 5303 acydburn
                                                $module_info = $c_class->module();
566 5848 acydburn
                                                $fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info;
567 5303 acydburn
                                        }
568 5303 acydburn
                                }
569 5303 acydburn
                        }
570 5303 acydburn
                        closedir($dh);
571 5310 acydburn
572 5310 acydburn
                        ksort($fileinfo);
573 5303 acydburn
                }
574 5303 acydburn
                else
575 5303 acydburn
                {
576 5848 acydburn
                        $filename = $module_class . '_' . basename($module);
577 5848 acydburn
                        $class = $module_class . '_' . basename($module) . '_info';
578 5303 acydburn
579 5303 acydburn
                        if (!class_exists($class))
580 5303 acydburn
                        {
581 5303 acydburn
                                include($directory . $filename . '.' . $phpEx);
582 5303 acydburn
                        }
583 5303 acydburn
584 5303 acydburn
                        // Get module title tag
585 5303 acydburn
                        if (class_exists($class))
586 5303 acydburn
                        {
587 5303 acydburn
                                $c_class = new $class();
588 5303 acydburn
                                $module_info = $c_class->module();
589 5848 acydburn
                                $fileinfo[str_replace($module_class . '_', '', $module_info['filename'])] = $module_info;
590 5303 acydburn
                        }
591 5303 acydburn
                }
592 5303 acydburn
593 5303 acydburn
                return $fileinfo;
594 5303 acydburn
        }
595 5303 acydburn
596 5303 acydburn
        /**
597 5303 acydburn
        * Simple version of jumpbox, just lists modules
598 5303 acydburn
        */
599 5303 acydburn
        function make_module_select($select_id = false, $ignore_id = false, $ignore_acl = false, $ignore_nonpost = false, $ignore_emptycat = true, $ignore_noncat = false)
600 5303 acydburn
        {
601 5303 acydburn
                global $db, $user, $auth, $config;
602 5303 acydburn
603 6177 acydburn
                $sql = 'SELECT module_id, module_enabled, module_basename, parent_id, module_langname, left_id, right_id, module_auth
604 6177 acydburn
                        FROM ' . MODULES_TABLE . "
605 6177 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
606 6177 acydburn
                        ORDER BY left_id ASC";
607 5303 acydburn
                $result = $db->sql_query($sql);
608 5303 acydburn
609 5303 acydburn
                $right = $iteration = 0;
610 5303 acydburn
                $padding_store = array('0' => '');
611 5303 acydburn
                $module_list = $padding = '';
612 5303 acydburn
613 5303 acydburn
                while ($row = $db->sql_fetchrow($result))
614 5303 acydburn
                {
615 5303 acydburn
                        if ($row['left_id'] < $right)
616 5303 acydburn
                        {
617 5303 acydburn
                                $padding .= '&nbsp; &nbsp;';
618 5303 acydburn
                                $padding_store[$row['parent_id']] = $padding;
619 5303 acydburn
                        }
620 5303 acydburn
                        else if ($row['left_id'] > $right + 1)
621 5303 acydburn
                        {
622 5303 acydburn
                                $padding = (isset($padding_store[$row['parent_id']])) ? $padding_store[$row['parent_id']] : '';
623 5303 acydburn
                        }
624 5303 acydburn
625 5303 acydburn
                        $right = $row['right_id'];
626 5303 acydburn
627 5303 acydburn
                        if (!$ignore_acl && $row['module_auth'])
628 5303 acydburn
                        {
629 6628 acydburn
                                // We use zero as the forum id to check - global setting.
630 6628 acydburn
                                if (!p_master::module_auth($row['module_auth'], 0))
631 5303 acydburn
                                {
632 5303 acydburn
                                        continue;
633 5303 acydburn
                                }
634 5303 acydburn
                        }
635 5303 acydburn
636 5303 acydburn
                        // ignore this module?
637 5303 acydburn
                        if ((is_array($ignore_id) && in_array($row['module_id'], $ignore_id)) || $row['module_id'] == $ignore_id)
638 5303 acydburn
                        {
639 5303 acydburn
                                continue;
640 5303 acydburn
                        }
641 5303 acydburn
642 5303 acydburn
                        // empty category
643 6177 acydburn
                        if (!$row['module_basename'] && ($row['left_id'] + 1 == $row['right_id']) && $ignore_emptycat)
644 5303 acydburn
                        {
645 5303 acydburn
                                continue;
646 5303 acydburn
                        }
647 5303 acydburn
648 5303 acydburn
                        // ignore non-category?
649 6177 acydburn
                        if ($row['module_basename'] && $ignore_noncat)
650 5303 acydburn
                        {
651 5303 acydburn
                                continue;
652 5303 acydburn
                        }
653 5303 acydburn
654 5303 acydburn
                        $selected = (is_array($select_id)) ? ((in_array($row['module_id'], $select_id)) ? ' selected="selected"' : '') : (($row['module_id'] == $select_id) ? ' selected="selected"' : '');
655 5303 acydburn
656 5303 acydburn
                        $langname = $this->lang_name($row['module_langname']);
657 5303 acydburn
                        $module_list .= '<option value="' . $row['module_id'] . '"' . $selected . ((!$row['module_enabled']) ? ' class="disabled"' : '') . '>' . $padding . $langname . '</option>';
658 5303 acydburn
659 5303 acydburn
                        $iteration++;
660 5303 acydburn
                }
661 9179 toonarmy
                $db->sql_freeresult($result);
662 9179 toonarmy
663 5303 acydburn
                unset($padding_store);
664 5303 acydburn
665 5303 acydburn
                return $module_list;
666 5303 acydburn
        }
667 5303 acydburn
668 5303 acydburn
        /**
669 5303 acydburn
        * Get module branch
670 5303 acydburn
        */
671 5303 acydburn
        function get_module_branch($module_id, $type = 'all', $order = 'descending', $include_module = true)
672 5303 acydburn
        {
673 5303 acydburn
                global $db;
674 5303 acydburn
675 5303 acydburn
                switch ($type)
676 5303 acydburn
                {
677 5303 acydburn
                        case 'parents':
678 5303 acydburn
                                $condition = 'm1.left_id BETWEEN m2.left_id AND m2.right_id';
679 5303 acydburn
                        break;
680 5303 acydburn
681 5303 acydburn
                        case 'children':
682 5303 acydburn
                                $condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id';
683 5303 acydburn
                        break;
684 5303 acydburn
685 5303 acydburn
                        default:
686 5303 acydburn
                                $condition = 'm2.left_id BETWEEN m1.left_id AND m1.right_id OR m1.left_id BETWEEN m2.left_id AND m2.right_id';
687 6073 acydburn
                        break;
688 5303 acydburn
                }
689 5303 acydburn
690 5303 acydburn
                $rows = array();
691 5303 acydburn
692 5303 acydburn
                $sql = 'SELECT m2.*
693 5313 acydburn
                        FROM ' . MODULES_TABLE . ' m1
694 5313 acydburn
                        LEFT JOIN ' . MODULES_TABLE . " m2 ON ($condition)
695 5303 acydburn
                        WHERE m1.module_class = '" . $db->sql_escape($this->module_class) . "'
696 5303 acydburn
                                AND m2.module_class = '" . $db->sql_escape($this->module_class) . "'
697 5303 acydburn
                                AND m1.module_id = $module_id
698 5303 acydburn
                        ORDER BY m2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC');
699 5303 acydburn
                $result = $db->sql_query($sql);
700 5303 acydburn
701 5303 acydburn
                while ($row = $db->sql_fetchrow($result))
702 5303 acydburn
                {
703 5303 acydburn
                        if (!$include_module && $row['module_id'] == $module_id)
704 5303 acydburn
                        {
705 5303 acydburn
                                continue;
706 5303 acydburn
                        }
707 5303 acydburn
708 5303 acydburn
                        $rows[] = $row;
709 5303 acydburn
                }
710 5303 acydburn
                $db->sql_freeresult($result);
711 5303 acydburn
712 5303 acydburn
                return $rows;
713 5303 acydburn
        }
714 5303 acydburn
715 5303 acydburn
        /**
716 5303 acydburn
        * Remove modules cache file
717 5303 acydburn
        */
718 5303 acydburn
        function remove_cache_file()
719 5303 acydburn
        {
720 5612 acydburn
                global $cache;
721 5303 acydburn
722 5303 acydburn
                // Sanitise for future path use, it's escaped as appropriate for queries
723 5303 acydburn
                $p_class = str_replace(array('.', '/', '\\'), '', basename($this->module_class));
724 5303 acydburn
725 5612 acydburn
                $cache->destroy('_modules_' . $p_class);
726 5633 acydburn
727 5633 acydburn
                // Additionally remove sql cache
728 5633 acydburn
                $cache->destroy('sql', MODULES_TABLE);
729 5303 acydburn
        }
730 5303 acydburn
731 5303 acydburn
        /**
732 5303 acydburn
        * Return correct language name
733 5303 acydburn
        */
734 5303 acydburn
        function lang_name($module_langname)
735 5303 acydburn
        {
736 5303 acydburn
                global $user;
737 5303 acydburn
738 5303 acydburn
                return (!empty($user->lang[$module_langname])) ? $user->lang[$module_langname] : $module_langname;
739 5303 acydburn
        }
740 5303 acydburn
741 5303 acydburn
        /**
742 5303 acydburn
        * Update/Add module
743 8147 acydburn
        *
744 6061 acydburn
        * @param bool $run_inline if set to true errors will be returned and no logs being written
745 5303 acydburn
        */
746 6061 acydburn
        function update_module_data(&$module_data, $run_inline = false)
747 5303 acydburn
        {
748 5303 acydburn
                global $db, $user;
749 5303 acydburn
750 5303 acydburn
                if (!isset($module_data['module_id']))
751 5303 acydburn
                {
752 5303 acydburn
                        // no module_id means we're creating a new category/module
753 5303 acydburn
                        if ($module_data['parent_id'])
754 5303 acydburn
                        {
755 5303 acydburn
                                $sql = 'SELECT left_id, right_id
756 5303 acydburn
                                        FROM ' . MODULES_TABLE . "
757 7007 acydburn
                                        WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
758 7866 acydburn
                                                AND module_id = " . (int) $module_data['parent_id'];
759 5303 acydburn
                                $result = $db->sql_query($sql);
760 6237 acydburn
                                $row = $db->sql_fetchrow($result);
761 6237 acydburn
                                $db->sql_freeresult($result);
762 5303 acydburn
763 6237 acydburn
                                if (!$row)
764 5303 acydburn
                                {
765 6061 acydburn
                                        if ($run_inline)
766 6061 acydburn
                                        {
767 6061 acydburn
                                                return 'PARENT_NO_EXIST';
768 6061 acydburn
                                        }
769 6061 acydburn
770 6428 acydburn
                                        trigger_error($user->lang['PARENT_NO_EXIST'] . adm_back_link($this->u_action . '&amp;parent_id=' . $this->parent_id), E_USER_WARNING);
771 5303 acydburn
                                }
772 5303 acydburn
773 7330 acydburn
                                // Workaround
774 7330 acydburn
                                $row['left_id'] = (int) $row['left_id'];
775 7330 acydburn
                                $row['right_id'] = (int) $row['right_id'];
776 7330 acydburn
777 5303 acydburn
                                $sql = 'UPDATE ' . MODULES_TABLE . "
778 5303 acydburn
                                        SET left_id = left_id + 2, right_id = right_id + 2
779 7007 acydburn
                                        WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
780 5303 acydburn
                                                AND left_id > {$row['right_id']}";
781 5303 acydburn
                                $db->sql_query($sql);
782 5303 acydburn
783 5303 acydburn
                                $sql = 'UPDATE ' . MODULES_TABLE . "
784 5303 acydburn
                                        SET right_id = right_id + 2
785 7007 acydburn
                                        WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
786 5303 acydburn
                                                AND {$row['left_id']} BETWEEN left_id AND right_id";
787 5303 acydburn
                                $db->sql_query($sql);
788 5303 acydburn
789 7302 acydburn
                                $module_data['left_id'] = (int) $row['right_id'];
790 7302 acydburn
                                $module_data['right_id'] = (int) $row['right_id'] + 1;
791 5303 acydburn
                        }
792 5303 acydburn
                        else
793 5303 acydburn
                        {
794 5303 acydburn
                                $sql = 'SELECT MAX(right_id) AS right_id
795 5303 acydburn
                                        FROM ' . MODULES_TABLE . "
796 7007 acydburn
                                        WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'";
797 5303 acydburn
                                $result = $db->sql_query($sql);
798 5303 acydburn
                                $row = $db->sql_fetchrow($result);
799 5303 acydburn
                                $db->sql_freeresult($result);
800 5303 acydburn
801 7302 acydburn
                                $module_data['left_id'] = (int) $row['right_id'] + 1;
802 7302 acydburn
                                $module_data['right_id'] = (int) $row['right_id'] + 2;
803 5303 acydburn
                        }
804 5303 acydburn
805 5303 acydburn
                        $sql = 'INSERT INTO ' . MODULES_TABLE . ' ' . $db->sql_build_array('INSERT', $module_data);
806 5303 acydburn
                        $db->sql_query($sql);
807 5303 acydburn
808 5303 acydburn
                        $module_data['module_id'] = $db->sql_nextid();
809 6061 acydburn
810 6061 acydburn
                        if (!$run_inline)
811 6061 acydburn
                        {
812 6061 acydburn
                                add_log('admin', 'LOG_MODULE_ADD', $this->lang_name($module_data['module_langname']));
813 6061 acydburn
                        }
814 5303 acydburn
                }
815 5303 acydburn
                else
816 5303 acydburn
                {
817 5303 acydburn
                        $row = $this->get_module_row($module_data['module_id']);
818 5303 acydburn
819 6177 acydburn
                        if ($module_data['module_basename'] && !$row['module_basename'])
820 5303 acydburn
                        {
821 5303 acydburn
                                // we're turning a category into a module
822 5303 acydburn
                                $branch = $this->get_module_branch($module_data['module_id'], 'children', 'descending', false);
823 5303 acydburn
824 5303 acydburn
                                if (sizeof($branch))
825 5303 acydburn
                                {
826 5303 acydburn
                                        return array($user->lang['NO_CATEGORY_TO_MODULE']);
827 5303 acydburn
                                }
828 5303 acydburn
                        }
829 5303 acydburn
830 5303 acydburn
                        if ($row['parent_id'] != $module_data['parent_id'])
831 5303 acydburn
                        {
832 5303 acydburn
                                $this->move_module($module_data['module_id'], $module_data['parent_id']);
833 5303 acydburn
                        }
834 6161 acydburn
835 6161 acydburn
                        $update_ary = $module_data;
836 6161 acydburn
                        unset($update_ary['module_id']);
837 6161 acydburn
838 5303 acydburn
                        $sql = 'UPDATE ' . MODULES_TABLE . '
839 6161 acydburn
                                SET ' . $db->sql_build_array('UPDATE', $update_ary) . "
840 7007 acydburn
                                WHERE module_class = '" . $db->sql_escape($module_data['module_class']) . "'
841 7866 acydburn
                                        AND module_id = " . (int) $module_data['module_id'];
842 5303 acydburn
                        $db->sql_query($sql);
843 5303 acydburn
844 6061 acydburn
                        if (!$run_inline)
845 6061 acydburn
                        {
846 6061 acydburn
                                add_log('admin', 'LOG_MODULE_EDIT', $this->lang_name($module_data['module_langname']));
847 6061 acydburn
                        }
848 5303 acydburn
                }
849 5303 acydburn
850 5303 acydburn
                return array();
851 5303 acydburn
        }
852 5303 acydburn
853 5330 acydburn
        /**
854 5330 acydburn
        * Move module around the tree
855 5330 acydburn
        */
856 5303 acydburn
        function move_module($from_module_id, $to_parent_id)
857 5303 acydburn
        {
858 5303 acydburn
                global $db;
859 5303 acydburn
860 5303 acydburn
                $moved_modules = $this->get_module_branch($from_module_id, 'children', 'descending');
861 5303 acydburn
                $from_data = $moved_modules[0];
862 5303 acydburn
                $diff = sizeof($moved_modules) * 2;
863 5303 acydburn
864 5303 acydburn
                $moved_ids = array();
865 5303 acydburn
                for ($i = 0; $i < sizeof($moved_modules); ++$i)
866 5303 acydburn
                {
867 5303 acydburn
                        $moved_ids[] = $moved_modules[$i]['module_id'];
868 5303 acydburn
                }
869 5303 acydburn
870 5303 acydburn
                // Resync parents
871 5303 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
872 5303 acydburn
                        SET right_id = right_id - $diff
873 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
874 7866 acydburn
                                AND left_id < " . (int) $from_data['right_id'] . '
875 7866 acydburn
                                AND right_id > ' . (int) $from_data['right_id'];
876 5303 acydburn
                $db->sql_query($sql);
877 5303 acydburn
878 5303 acydburn
                // Resync righthand side of tree
879 5303 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
880 5303 acydburn
                        SET left_id = left_id - $diff, right_id = right_id - $diff
881 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
882 7866 acydburn
                                AND left_id > " . (int) $from_data['right_id'];
883 5303 acydburn
                $db->sql_query($sql);
884 5303 acydburn
885 5303 acydburn
                if ($to_parent_id > 0)
886 5303 acydburn
                {
887 5303 acydburn
                        $to_data = $this->get_module_row($to_parent_id);
888 5303 acydburn
889 5303 acydburn
                        // Resync new parents
890 5303 acydburn
                        $sql = 'UPDATE ' . MODULES_TABLE . "
891 5303 acydburn
                                SET right_id = right_id + $diff
892 5303 acydburn
                                WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
893 7866 acydburn
                                        AND " . (int) $to_data['right_id'] . ' BETWEEN left_id AND right_id
894 6271 acydburn
                                        AND ' . $db->sql_in_set('module_id', $moved_ids, true);
895 5303 acydburn
                        $db->sql_query($sql);
896 5303 acydburn
897 5303 acydburn
                        // Resync the righthand side of the tree
898 5303 acydburn
                        $sql = 'UPDATE ' . MODULES_TABLE . "
899 5303 acydburn
                                SET left_id = left_id + $diff, right_id = right_id + $diff
900 5303 acydburn
                                WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
901 7866 acydburn
                                        AND left_id > " . (int) $to_data['right_id'] . '
902 6271 acydburn
                                        AND ' . $db->sql_in_set('module_id', $moved_ids, true);
903 5303 acydburn
                        $db->sql_query($sql);
904 5303 acydburn
905 5303 acydburn
                        // Resync moved branch
906 5303 acydburn
                        $to_data['right_id'] += $diff;
907 5303 acydburn
                        if ($to_data['right_id'] > $from_data['right_id'])
908 5303 acydburn
                        {
909 5303 acydburn
                                $diff = '+ ' . ($to_data['right_id'] - $from_data['right_id'] - 1);
910 5303 acydburn
                        }
911 5303 acydburn
                        else
912 5303 acydburn
                        {
913 5303 acydburn
                                $diff = '- ' . abs($to_data['right_id'] - $from_data['right_id'] - 1);
914 5303 acydburn
                        }
915 5303 acydburn
                }
916 5303 acydburn
                else
917 5303 acydburn
                {
918 5303 acydburn
                        $sql = 'SELECT MAX(right_id) AS right_id
919 5303 acydburn
                                FROM ' . MODULES_TABLE . "
920 5303 acydburn
                                WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
921 6271 acydburn
                                        AND " . $db->sql_in_set('module_id', $moved_ids, true);
922 5303 acydburn
                        $result = $db->sql_query($sql);
923 5303 acydburn
                        $row = $db->sql_fetchrow($result);
924 5303 acydburn
                        $db->sql_freeresult($result);
925 5303 acydburn
926 7866 acydburn
                        $diff = '+ ' . (int) ($row['right_id'] - $from_data['left_id'] + 1);
927 5303 acydburn
                }
928 5303 acydburn
929 5303 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
930 5303 acydburn
                        SET left_id = left_id $diff, right_id = right_id $diff
931 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
932 6271 acydburn
                                AND " . $db->sql_in_set('module_id', $moved_ids);
933 5303 acydburn
                $db->sql_query($sql);
934 5303 acydburn
        }
935 5303 acydburn
936 5330 acydburn
        /**
937 5330 acydburn
        * Remove module from tree
938 5330 acydburn
        */
939 5303 acydburn
        function delete_module($module_id)
940 5303 acydburn
        {
941 5303 acydburn
                global $db, $user;
942 5303 acydburn
943 5303 acydburn
                $row = $this->get_module_row($module_id);
944 5303 acydburn
945 5303 acydburn
                $branch = $this->get_module_branch($module_id, 'children', 'descending', false);
946 5303 acydburn
947 5303 acydburn
                if (sizeof($branch))
948 5303 acydburn
                {
949 5303 acydburn
                        return array($user->lang['CANNOT_REMOVE_MODULE']);
950 5303 acydburn
                }
951 5303 acydburn
952 5303 acydburn
                // If not move
953 5303 acydburn
                $diff = 2;
954 5303 acydburn
                $sql = 'DELETE FROM ' . MODULES_TABLE . "
955 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
956 5303 acydburn
                                AND module_id = $module_id";
957 5303 acydburn
                $db->sql_query($sql);
958 5303 acydburn
959 7866 acydburn
                $row['right_id'] = (int) $row['right_id'];
960 7866 acydburn
                $row['left_id'] = (int) $row['left_id'];
961 7866 acydburn
962 5303 acydburn
                // Resync tree
963 5303 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
964 5303 acydburn
                        SET right_id = right_id - $diff
965 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
966 5303 acydburn
                                AND left_id < {$row['right_id']} AND right_id > {$row['right_id']}";
967 5303 acydburn
                $db->sql_query($sql);
968 5303 acydburn
969 5303 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
970 5303 acydburn
                        SET left_id = left_id - $diff, right_id = right_id - $diff
971 5303 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
972 5303 acydburn
                                AND left_id > {$row['right_id']}";
973 5303 acydburn
                $db->sql_query($sql);
974 5303 acydburn
975 5303 acydburn
                add_log('admin', 'LOG_MODULE_REMOVED', $this->lang_name($row['module_langname']));
976 5303 acydburn
977 5303 acydburn
                return array();
978 5303 acydburn
979 5303 acydburn
        }
980 6061 acydburn
981 6061 acydburn
        /**
982 6071 acydburn
        * Move module position by $steps up/down
983 6061 acydburn
        */
984 6071 acydburn
        function move_module_by($module_row, $action = 'move_up', $steps = 1)
985 6061 acydburn
        {
986 6061 acydburn
                global $db;
987 6061 acydburn
988 6072 acydburn
                /**
989 6072 acydburn
                * Fetch all the siblings between the module's current spot
990 6072 acydburn
                * and where we want to move it to. If there are less than $steps
991 6072 acydburn
                * siblings between the current spot and the target then the
992 6072 acydburn
                * module will move as far as possible
993 6072 acydburn
                */
994 6061 acydburn
                $sql = 'SELECT module_id, left_id, right_id, module_langname
995 6061 acydburn
                        FROM ' . MODULES_TABLE . "
996 6061 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
997 7866 acydburn
                                AND parent_id = " . (int) $module_row['parent_id'] . '
998 7866 acydburn
                                AND ' . (($action == 'move_up') ? 'right_id < ' . (int) $module_row['right_id'] . ' ORDER BY right_id DESC' : 'left_id > ' . (int) $module_row['left_id'] . ' ORDER BY left_id ASC');
999 6072 acydburn
                $result = $db->sql_query_limit($sql, $steps);
1000 6072 acydburn
1001 6073 acydburn
                $target = array();
1002 6072 acydburn
                while ($row = $db->sql_fetchrow($result))
1003 6072 acydburn
                {
1004 6073 acydburn
                        $target = $row;
1005 6072 acydburn
                }
1006 6061 acydburn
                $db->sql_freeresult($result);
1007 6061 acydburn
1008 6073 acydburn
                if (!sizeof($target))
1009 6061 acydburn
                {
1010 6072 acydburn
                        // The module is already on top or bottom
1011 6061 acydburn
                        return false;
1012 6061 acydburn
                }
1013 6061 acydburn
1014 6072 acydburn
                /**
1015 6072 acydburn
                * $left_id and $right_id define the scope of the nodes that are affected by the move.
1016 6072 acydburn
                * $diff_up and $diff_down are the values to substract or add to each node's left_id
1017 6072 acydburn
                * and right_id in order to move them up or down.
1018 6072 acydburn
                * $move_up_left and $move_up_right define the scope of the nodes that are moving
1019 6072 acydburn
                * up. Other nodes in the scope of ($left_id, $right_id) are considered to move down.
1020 6072 acydburn
                */
1021 6061 acydburn
                if ($action == 'move_up')
1022 6061 acydburn
                {
1023 7866 acydburn
                        $left_id = (int) $target['left_id'];
1024 7866 acydburn
                        $right_id = (int) $module_row['right_id'];
1025 6072 acydburn
1026 7866 acydburn
                        $diff_up = (int) ($module_row['left_id'] - $target['left_id']);
1027 7866 acydburn
                        $diff_down = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
1028 6072 acydburn
1029 7866 acydburn
                        $move_up_left = (int) $module_row['left_id'];
1030 7866 acydburn
                        $move_up_right = (int) $module_row['right_id'];
1031 6061 acydburn
                }
1032 6061 acydburn
                else
1033 6061 acydburn
                {
1034 7866 acydburn
                        $left_id = (int) $module_row['left_id'];
1035 7866 acydburn
                        $right_id = (int) $target['right_id'];
1036 6061 acydburn
1037 7866 acydburn
                        $diff_up = (int) ($module_row['right_id'] + 1 - $module_row['left_id']);
1038 7866 acydburn
                        $diff_down = (int) ($target['right_id'] - $module_row['right_id']);
1039 6061 acydburn
1040 7866 acydburn
                        $move_up_left = (int) ($module_row['right_id'] + 1);
1041 7866 acydburn
                        $move_up_right = (int) $target['right_id'];
1042 6061 acydburn
                }
1043 6061 acydburn
1044 6072 acydburn
                // Now do the dirty job
1045 6072 acydburn
                $sql = 'UPDATE ' . MODULES_TABLE . "
1046 6072 acydburn
                        SET left_id = left_id + CASE
1047 6072 acydburn
                                WHEN left_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
1048 6072 acydburn
                                ELSE {$diff_down}
1049 6072 acydburn
                        END,
1050 6072 acydburn
                        right_id = right_id + CASE
1051 6072 acydburn
                                WHEN right_id BETWEEN {$move_up_left} AND {$move_up_right} THEN -{$diff_up}
1052 6072 acydburn
                                ELSE {$diff_down}
1053 6072 acydburn
                        END
1054 6061 acydburn
                        WHERE module_class = '" . $db->sql_escape($this->module_class) . "'
1055 6072 acydburn
                                AND left_id BETWEEN {$left_id} AND {$right_id}
1056 6072 acydburn
                                AND right_id BETWEEN {$left_id} AND {$right_id}";
1057 6061 acydburn
                $db->sql_query($sql);
1058 6061 acydburn
1059 6072 acydburn
                $this->remove_cache_file();
1060 6061 acydburn
1061 6073 acydburn
                return $this->lang_name($target['module_langname']);
1062 6061 acydburn
        }
1063 5303 acydburn
}
1064 5303 acydburn
1065 5303 acydburn
?>