Update/Add module
public update_module_data ( &$module_data, boolean $run_inline = false ) | ||
$run_inline | boolean | if set to true errors will be returned and no logs being written |
public function setUp() { global $db; parent::setUp(); $this->phpbb_extension_manager = $this->get_extension_manager(); $this->phpbb_extension_manager->enable('foo/bar'); $modules = new acp_modules(); $db = $this->get_db(); $sql = 'SELECT module_id FROM ' . MODULES_TABLE . "\n\t\t\tWHERE module_langname = 'acp'\n\t\t\t\tAND module_class = 'ACP_CAT_DOT_MODS'"; $result = $db->sql_query($sql); $module_id = (int) $db->sql_fetchfield('module_id'); $db->sql_freeresult($result); $parent_data = array('module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => $module_id, 'module_class' => 'acp', 'module_langname' => 'ACP_FOOBAR_TITLE', 'module_mode' => '', 'module_auth' => ''); $modules->update_module_data($parent_data, true); $module_data = array('module_basename' => 'foo\\bar\\acp\\main_module', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => $parent_data['module_id'], 'module_class' => 'acp', 'module_langname' => 'ACP_FOOBAR_TITLE', 'module_mode' => 'mode', 'module_auth' => ''); $modules->update_module_data($module_data, true); $parent_data = array('module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => 0, 'module_class' => 'ucp', 'module_langname' => 'UCP_FOOBAR_TITLE', 'module_mode' => '', 'module_auth' => ''); $modules->update_module_data($parent_data, true); $module_data = array('module_basename' => 'foo\\bar\\ucp\\main_module', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => $parent_data['module_id'], 'module_class' => 'ucp', 'module_langname' => 'UCP_FOOBAR_TITLE', 'module_mode' => 'mode', 'module_auth' => ''); $modules->update_module_data($module_data, true); $this->purge_cache(); }
/** * Populate the module tables */ function add_modules($mode, $sub) { global $db, $lang, $phpbb_root_path, $phpEx; include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx); $_module = new acp_modules(); $module_classes = array('acp', 'mcp', 'ucp'); // Add categories foreach ($module_classes as $module_class) { $categories = array(); // Set the module class $_module->module_class = $module_class; foreach ($this->module_categories[$module_class] as $cat_name => $subs) { $module_data = array( 'module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => 0, 'module_class' => $module_class, 'module_langname' => $cat_name, 'module_mode' => '', 'module_auth' => '', ); // Add category $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } $categories[$cat_name]['id'] = (int) $module_data['module_id']; $categories[$cat_name]['parent_id'] = 0; // Create sub-categories... if (is_array($subs)) { foreach ($subs as $level2_name) { $module_data = array( 'module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $level2_name, 'module_mode' => '', 'module_auth' => '', ); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } $categories[$level2_name]['id'] = (int) $module_data['module_id']; $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id']; } } } // Get the modules we want to add... returned sorted by name $module_info = $_module->get_module_infos('', $module_class); foreach ($module_info as $module_basename => $fileinfo) { foreach ($fileinfo['modes'] as $module_mode => $row) { foreach ($row['cat'] as $cat_name) { if (!isset($categories[$cat_name])) { continue; } $module_data = array( 'module_basename' => $module_basename, 'module_enabled' => 1, 'module_display' => (isset($row['display'])) ? (int) $row['display'] : 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $row['title'], 'module_mode' => $module_mode, 'module_auth' => $row['auth'], ); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } } } } // Move some of the modules around since the code above will put them in the wrong place if ($module_class == 'acp') { // Move main module 4 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_basename = 'main' AND module_class = 'acp' AND module_mode = 'main'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 4); // Move permissions intro screen module 4 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_basename = 'permissions' AND module_class = 'acp' AND module_mode = 'intro'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 4); // Move manage users screen module 5 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_basename = 'users' AND module_class = 'acp' AND module_mode = 'overview'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 5); } if ($module_class == 'ucp') { // Move attachment module 4 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_basename = 'attachments' AND module_class = 'ucp' AND module_mode = 'attachments'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 4); } // And now for the special ones // (these are modules which appear in multiple categories and thus get added manually to some for more control) if (isset($this->module_extras[$module_class])) { foreach ($this->module_extras[$module_class] as $cat_name => $mods) { $sql = 'SELECT module_id, left_id, right_id FROM ' . MODULES_TABLE . " WHERE module_langname = '" . $db->sql_escape($cat_name) . "' AND module_class = '" . $db->sql_escape($module_class) . "'"; $result = $db->sql_query_limit($sql, 1); $row2 = $db->sql_fetchrow($result); $db->sql_freeresult($result); foreach ($mods as $mod_name) { $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_langname = '" . $db->sql_escape($mod_name) . "' AND module_class = '" . $db->sql_escape($module_class) . "' AND module_basename <> ''"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $module_data = array( 'module_basename' => $row['module_basename'], 'module_enabled' => (int) $row['module_enabled'], 'module_display' => (int) $row['module_display'], 'parent_id' => (int) $row2['module_id'], 'module_class' => $row['module_class'], 'module_langname' => $row['module_langname'], 'module_mode' => $row['module_mode'], 'module_auth' => $row['module_auth'], ); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } } } } $_module->remove_cache_file(); } }
/** * Module Add * * Add a new module * * @param string $class The module class(acp|mcp|ucp) * @param int|string $parent The parent module_id|module_langname (0 for no parent) * @param array $data an array of the data on the new \module. * This can be setup in two different ways. * 1. The "manual" way. For inserting a category or one at a time. * It will be merged with the base array shown a bit below, * but at the least requires 'module_langname' to be sent, and, * if you want to create a module (instead of just a category) you must * send module_basename and module_mode. * array( * 'module_enabled' => 1, * 'module_display' => 1, * 'module_basename' => '', * 'module_class' => $class, * 'parent_id' => (int) $parent, * 'module_langname' => '', * 'module_mode' => '', * 'module_auth' => '', * ) * 2. The "automatic" way. For inserting multiple at a time based on the * specs in the info file for the module(s). For this to work the * modules must be correctly setup in the info file. * An example follows (this would insert the settings, log, and flag * modes from the includes/acp/info/acp_asacp.php file): * array( * 'module_basename' => 'asacp', * 'modes' => array('settings', 'log', 'flag'), * ) * Optionally you may not send 'modes' and it will insert all of the * modules in that info file. * path, specify that here * @return null * @throws \src\db\migration\exception */ public function add($class, $parent = 0, $data = array()) { // Allows '' to be sent as 0 $parent = $parent ?: 0; // allow sending the name as a string in $data to create a category if (!is_array($data)) { $data = array('module_langname' => $data); } if (!isset($data['module_langname'])) { // The "automatic" way $basename = isset($data['module_basename']) ? $data['module_basename'] : ''; $module = $this->get_module_info($class, $basename); $result = ''; foreach ($module['modes'] as $mode => $module_info) { if (!isset($data['modes']) || in_array($mode, $data['modes'])) { $new_module = array('module_basename' => $basename, 'module_langname' => $module_info['title'], 'module_mode' => $mode, 'module_auth' => $module_info['auth'], 'module_display' => isset($module_info['display']) ? $module_info['display'] : true, 'before' => isset($module_info['before']) ? $module_info['before'] : false, 'after' => isset($module_info['after']) ? $module_info['after'] : false); // Run the "manual" way with the data we've collected. $this->add($class, $parent, $new_module); } } return; } // The "manual" way if (!is_numeric($parent)) { $sql = 'SELECT module_id FROM ' . $this->modules_table . "\n\t\t\t\tWHERE module_langname = '" . $this->db->sql_escape($parent) . "'\n\t\t\t\t\tAND module_class = '" . $this->db->sql_escape($class) . "'"; $result = $this->db->sql_query($sql); $module_id = $this->db->sql_fetchfield('module_id'); $this->db->sql_freeresult($result); if (!$module_id) { throw new \src\db\migration\exception('MODULE_NOT_EXIST', $parent); } $parent = $data['parent_id'] = $module_id; } else { if (!$this->exists($class, false, $parent)) { throw new \src\db\migration\exception('MODULE_NOT_EXIST', $parent); } } if ($this->exists($class, $parent, $data['module_langname'])) { return; } if (!class_exists('acp_modules')) { include $this->src_root_path . 'includes/acp/acp_modules.' . $this->php_ext; $this->user->add_lang('acp/modules'); } $acp_modules = new \acp_modules(); $module_data = array('module_enabled' => isset($data['module_enabled']) ? $data['module_enabled'] : 1, 'module_display' => isset($data['module_display']) ? $data['module_display'] : 1, 'module_basename' => isset($data['module_basename']) ? $data['module_basename'] : '', 'module_class' => $class, 'parent_id' => (int) $parent, 'module_langname' => isset($data['module_langname']) ? $data['module_langname'] : '', 'module_mode' => isset($data['module_mode']) ? $data['module_mode'] : '', 'module_auth' => isset($data['module_auth']) ? $data['module_auth'] : ''); $result = $acp_modules->update_module_data($module_data, true); // update_module_data can either return a string or an empty array... if (is_string($result)) { // Error throw new \src\db\migration\exception('MODULE_ERROR', $result); } else { // Success $module_log_name = isset($this->user->lang[$data['module_langname']]) ? $this->user->lang[$data['module_langname']] : $data['module_langname']; add_log('admin', 'LOG_MODULE_ADD', $module_log_name); // Move the module if requested above/below an existing one if (isset($data['before']) && $data['before']) { $sql = 'SELECT left_id FROM ' . $this->modules_table . "\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND parent_id = " . (int) $parent . "\n\t\t\t\t\t\tAND module_langname = '" . $this->db->sql_escape($data['before']) . "'"; $this->db->sql_query($sql); $to_left = (int) $this->db->sql_fetchfield('left_id'); $sql = 'UPDATE ' . $this->modules_table . "\n\t\t\t\t\tSET left_id = left_id + 2, right_id = right_id + 2\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND left_id >= {$to_left}\n\t\t\t\t\t\tAND left_id < {$module_data['left_id']}"; $this->db->sql_query($sql); $sql = 'UPDATE ' . $this->modules_table . "\n\t\t\t\t\tSET left_id = {$to_left}, right_id = " . ($to_left + 1) . "\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND module_id = {$module_data['module_id']}"; $this->db->sql_query($sql); } else { if (isset($data['after']) && $data['after']) { $sql = 'SELECT right_id FROM ' . $this->modules_table . "\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND parent_id = " . (int) $parent . "\n\t\t\t\t\t\tAND module_langname = '" . $this->db->sql_escape($data['after']) . "'"; $this->db->sql_query($sql); $to_right = (int) $this->db->sql_fetchfield('right_id'); $sql = 'UPDATE ' . $this->modules_table . "\n\t\t\t\t\tSET left_id = left_id + 2, right_id = right_id + 2\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND left_id >= {$to_right}\n\t\t\t\t\t\tAND left_id < {$module_data['left_id']}"; $this->db->sql_query($sql); $sql = 'UPDATE ' . $this->modules_table . ' SET left_id = ' . ($to_right + 1) . ', right_id = ' . ($to_right + 2) . "\n\t\t\t\t\tWHERE module_class = '" . $this->db->sql_escape($class) . "'\n\t\t\t\t\t\tAND module_id = {$module_data['module_id']}"; $this->db->sql_query($sql); } } } // Clear the Modules Cache $this->cache->destroy("_modules_{$class}"); }
function _add_modules($modules_to_install) { global $phpbb_root_path, $phpEx, $db; include_once($phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx); $_module = new acp_modules(); foreach ($modules_to_install as $module_mode => $module_data) { $_module->module_class = $module_data['class']; // Determine parent id first $sql = 'SELECT module_id FROM ' . MODULES_TABLE . " WHERE module_class = '" . $db->sql_escape($module_data['class']) . "' AND module_langname = '" . $db->sql_escape($module_data['cat']) . "' AND module_mode = '' AND module_basename = ''"; $result = $db->sql_query($sql); // There may be more than one categories with the same name $categories = array(); while ($row = $db->sql_fetchrow($result)) { $categories[] = (int) $row['module_id']; } $db->sql_freeresult($result); if (!sizeof($categories)) { continue; } // Add the module to all categories found foreach ($categories as $parent_id) { // Check if the module already exists $sql = 'SELECT * FROM ' . MODULES_TABLE . " WHERE module_basename = '" . $db->sql_escape($module_data['base']) . "' AND module_class = '" . $db->sql_escape($module_data['class']) . "' AND module_langname = '" . $db->sql_escape($module_data['title']) . "' AND module_mode = '" . $db->sql_escape($module_mode) . "' AND module_auth = '" . $db->sql_escape($module_data['auth']) . "' AND parent_id = {$parent_id}"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); // If it exists, we simply continue with the next category if ($row) { continue; } // Build the module sql row $module_row = array( 'module_basename' => $module_data['base'], 'module_enabled' => (isset($module_data['enabled'])) ? (int) $module_data['enabled'] : 1, 'module_display' => (isset($module_data['display'])) ? (int) $module_data['display'] : 1, 'parent_id' => $parent_id, 'module_class' => $module_data['class'], 'module_langname' => $module_data['title'], 'module_mode' => $module_mode, 'module_auth' => $module_data['auth'], ); $_module->update_module_data($module_row, true); // Ok, do we need to re-order the module, move it up or down? if (!isset($module_data['after'])) { continue; } $after_mode = $module_data['after'][0]; $after_langname = $module_data['after'][1]; // First of all, get the module id for the module this one has to be placed after $sql = 'SELECT left_id FROM ' . MODULES_TABLE . " WHERE module_class = '" . $db->sql_escape($module_data['class']) . "' AND module_basename = '" . $db->sql_escape($module_data['base']) . "' AND module_langname = '" . $db->sql_escape($after_langname) . "' AND module_mode = '" . $db->sql_escape($after_mode) . "' AND parent_id = '{$parent_id}'"; $result = $db->sql_query($sql); $first_left_id = (int) $db->sql_fetchfield('left_id'); $db->sql_freeresult($result); if (!$first_left_id) { continue; } // Ok, count the number of modules between $after_mode and the added module $sql = 'SELECT COUNT(module_id) as num_modules FROM ' . MODULES_TABLE . " WHERE module_class = '" . $db->sql_escape($module_data['class']) . "' AND parent_id = {$parent_id} AND left_id BETWEEN {$first_left_id} AND {$module_row['left_id']} GROUP BY left_id ORDER BY left_id"; $result = $db->sql_query($sql); $steps = (int) $db->sql_fetchfield('num_modules'); $db->sql_freeresult($result); // We need to substract 2 $steps -= 2; if ($steps <= 0) { continue; } // Ok, move module up $num_modules times. ;) $_module->move_module_by($module_row, 'move_up', $steps); } } $_module->remove_cache_file(); }
/** * Module Add * * Add a new module * * @param string $class The module class(acp|mcp|ucp) * @param int|string $parent The parent module_id|module_langname (0 for no parent) * @param array $data an array of the data on the new module. This can be setup in two different ways. * 1. The "manual" way. For inserting a category or one at a time. It will be merged with the base array shown a bit below, * but at the least requires 'module_langname' to be sent, and, if you want to create a module (instead of just a category) you must send module_basename and module_mode. * array( * 'module_enabled' => 1, * 'module_display' => 1, * 'module_basename' => '', * 'module_class' => $class, * 'parent_id' => (int) $parent, * 'module_langname' => '', * 'module_mode' => '', * 'module_auth' => '', * ) * 2. The "automatic" way. For inserting multiple at a time based on the specs in the info file for the module(s). For this to work the modules must be correctly setup in the info file. * An example follows (this would insert the settings, log, and flag modes from the includes/acp/info/acp_asacp.php file): * array( * 'module_basename' => 'asacp', * 'modes' => array('settings', 'log', 'flag'), * ) * Optionally you may not send 'modes' and it will insert all of the modules in that info file. * @param string|bool $include_path If you would like to use a custom include path, specify that here */ function module_add($class, $parent = 0, $data = array(), $include_path = false) { global $cache, $user, $phpbb_root_path, $phpEx; // Multicall if (is_array($class)) { foreach ($class as $params) { call_user_func_array(array($this, 'module_add'), $params); } return; } // Prevent stupid things like trying to add a module with no name or any data on it if (empty($data)) { $this->umil_start('MODULE_ADD', $class, 'UNKNOWN'); return $this->umil_end('FAIL'); } // Allows '' to be sent $parent = !$parent ? 0 : $parent; // allow sending the name as a string in $data to create a category if (!is_array($data)) { $data = array('module_langname' => $data); } if (!isset($data['module_langname'])) { // The "automatic" way $basename = isset($data['module_basename']) ? $data['module_basename'] : ''; $basename = str_replace(array('/', '\\'), '', $basename); $class = str_replace(array('/', '\\'), '', $class); $info_file = "{$class}/info/{$class}_{$basename}.{$phpEx}"; // The manual and automatic ways both failed... if (!file_exists(($include_path === false ? $phpbb_root_path . 'includes/' : $include_path) . $info_file)) { $this->umil_start('MODULE_ADD', $class, $info_file); return $this->umil_end('FAIL'); } $classname = "{$class}_{$basename}_info"; if (!class_exists($classname)) { include ($include_path === false ? $phpbb_root_path . 'includes/' : $include_path) . $info_file; } $info = new $classname(); $module = $info->module(); unset($info); $result = ''; foreach ($module['modes'] as $mode => $module_info) { if (!isset($data['modes']) || in_array($mode, $data['modes'])) { $new_module = array('module_basename' => $basename, 'module_langname' => $module_info['title'], 'module_mode' => $mode, 'module_auth' => $module_info['auth'], 'module_display' => isset($module_info['display']) ? $module_info['display'] : true); // Run the "manual" way with the data we've collected. $result .= (isset($data['spacer']) ? $data['spacer'] : '<br />') . $this->module_add($class, $parent, $new_module); } } return $result; } // The "manual" way $this->umil_start('MODULE_ADD', $class, isset($user->lang[$data['module_langname']]) ? $user->lang[$data['module_langname']] : $data['module_langname']); add_log('admin', 'LOG_MODULE_ADD', isset($user->lang[$data['module_langname']]) ? $user->lang[$data['module_langname']] : $data['module_langname']); $class = $this->db->sql_escape($class); if (!is_numeric($parent)) { $sql = 'SELECT module_id FROM ' . MODULES_TABLE . "\n\t\t\t\tWHERE module_langname = '" . $this->db->sql_escape($parent) . "'\n\t\t\t\tAND module_class = '{$class}'"; $result = $this->db->sql_query($sql); $row = $this->db->sql_fetchrow($result); $this->db->sql_freeresult($result); if (!$row) { return $this->umil_end('PARENT_NOT_EXIST'); } $parent = $data['parent_id'] = $row['module_id']; } else { if ($parent && !$this->module_exists($class, false, $parent)) { return $this->umil_end('PARENT_NOT_EXIST'); } } if ($this->module_exists($class, $parent, $data['module_langname'])) { return $this->umil_end('MODULE_ALREADY_EXIST'); } if (!class_exists('acp_modules')) { include $phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx; $user->add_lang('acp/modules'); } $acp_modules = new acp_modules(); $data = array_merge(array('module_enabled' => 1, 'module_display' => 1, 'module_basename' => '', 'module_class' => $class, 'parent_id' => (int) $parent, 'module_langname' => '', 'module_mode' => '', 'module_auth' => ''), $data); $result = $acp_modules->update_module_data($data, true); // update_module_data can either return a string, an empty array, or an array with a language string in... if (is_array($result) && !empty($result)) { $this->result = implode('<br />', $result); } else { if (!is_array($result) && $result !== '') { $this->result($result); } } // Clear the Modules Cache $cache->destroy("_modules_{$class}"); return $this->umil_end(); }
/** * Module Add * * Add a new module * * @param string $class The module class(acp|mcp|ucp) * @param int|string $parent The parent module_id|module_langname (0 for no parent) * @param array $data an array of the data on the new module. This can be setup in two different ways. * 1. The "manual" way. For inserting a category or one at a time. It will be merged with the base array shown a bit below, * but at the least requires 'module_langname' to be sent, and, if you want to create a module (instead of just a category) you must send module_basename and module_mode. * array( * 'module_enabled' => 1, * 'module_display' => 1, * 'module_basename' => '', * 'module_class' => $class, * 'parent_id' => (int) $parent, * 'module_langname' => '', * 'module_mode' => '', * 'module_auth' => '', * ) * 2. The "automatic" way. For inserting multiple at a time based on the specs in the info file for the module(s). For this to work the modules must be correctly setup in the info file. * An example follows (this would insert the settings, log, and flag modes from the includes/acp/info/acp_asacp.php file): * array( * 'module_basename' => 'asacp', * 'modes' => array('settings', 'log', 'flag'), * ) * Optionally you may not send 'modes' and it will insert all of the modules in that info file. * @param string|bool $include_path If you would like to use a custom include path, specify that here */ function module_add($class, $parent = 0, $data = array(), $include_path = false) { global $cache, $user, $phpbb_root_path, $phpEx; // Multicall if ($this->multicall(__FUNCTION__, $class)) { return; } // Prevent stupid things like trying to add a module with no name or any data on it if (empty($data)) { $this->umil_start('MODULE_ADD', $class, 'UNKNOWN'); return $this->umil_end('FAIL'); } // Allows '' to be sent as 0 $parent = !$parent ? 0 : $parent; // allow sending the name as a string in $data to create a category if (!is_array($data)) { $data = array('module_langname' => $data); } if (!isset($data['module_langname'])) { // The "automatic" way $basename = isset($data['module_basename']) ? $data['module_basename'] : ''; $basename = str_replace(array('/', '\\'), '', $basename); $class = str_replace(array('/', '\\'), '', $class); $info_file = "{$class}/info/{$class}_{$basename}.{$phpEx}"; // The manual and automatic ways both failed... if (!file_exists(($include_path === false ? $phpbb_root_path . 'includes/' : $include_path) . $info_file)) { $this->umil_start('MODULE_ADD', $class, $info_file); return $this->umil_end('FAIL'); } $classname = "{$class}_{$basename}_info"; if (!class_exists($classname)) { include ($include_path === false ? $phpbb_root_path . 'includes/' : $include_path) . $info_file; } $info = new $classname(); $module = $info->module(); unset($info); $result = ''; foreach ($module['modes'] as $mode => $module_info) { if (!isset($data['modes']) || in_array($mode, $data['modes'])) { $new_module = array('module_basename' => $basename, 'module_langname' => $module_info['title'], 'module_mode' => $mode, 'module_auth' => $module_info['auth'], 'module_display' => isset($module_info['display']) ? $module_info['display'] : true, 'before' => isset($module_info['before']) ? $module_info['before'] : false, 'after' => isset($module_info['after']) ? $module_info['after'] : false); // Run the "manual" way with the data we've collected. $result .= (isset($data['spacer']) ? $data['spacer'] : '<br />') . $this->module_add($class, $parent, $new_module); } } return $result; } // The "manual" way $this->umil_start('MODULE_ADD', $class, isset($user->lang[$data['module_langname']]) ? $user->lang[$data['module_langname']] : $data['module_langname']); add_log('admin', 'LOG_MODULE_ADD', isset($user->lang[$data['module_langname']]) ? $user->lang[$data['module_langname']] : $data['module_langname']); $class = $this->db->sql_escape($class); if (!is_numeric($parent)) { $sql = 'SELECT module_id FROM ' . MODULES_TABLE . "\n\t\t\t\tWHERE module_langname = '" . $this->db->sql_escape($parent) . "'\n\t\t\t\tAND module_class = '{$class}'"; $result = $this->db->sql_query($sql); $row = $this->db->sql_fetchrow($result); $this->db->sql_freeresult($result); if (!$row) { return $this->umil_end('PARENT_NOT_EXIST'); } $parent = $data['parent_id'] = $row['module_id']; } else { if (!$this->module_exists($class, false, $parent)) { return $this->umil_end('PARENT_NOT_EXIST'); } } if ($this->module_exists($class, $parent, $data['module_langname'])) { return $this->umil_end('MODULE_ALREADY_EXIST'); } if (!class_exists('acp_modules')) { include $phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx; $user->add_lang('acp/modules'); } $acp_modules = new acp_modules(); $module_data = array('module_enabled' => isset($data['module_enabled']) ? $data['module_enabled'] : 1, 'module_display' => isset($data['module_display']) ? $data['module_display'] : 1, 'module_basename' => isset($data['module_basename']) ? $data['module_basename'] : '', 'module_class' => $class, 'parent_id' => (int) $parent, 'module_langname' => isset($data['module_langname']) ? $data['module_langname'] : '', 'module_mode' => isset($data['module_mode']) ? $data['module_mode'] : '', 'module_auth' => isset($data['module_auth']) ? $data['module_auth'] : ''); $result = $acp_modules->update_module_data($module_data, true); // update_module_data can either return a string or an empty array... if (is_string($result)) { // Error $this->result = $this->get_output_text($result); } else { // Success // Move the module if requested above/below an existing one if (isset($data['before']) && $data['before']) { $sql = 'SELECT left_id FROM ' . MODULES_TABLE . ' WHERE module_class = \'' . $class . '\' AND parent_id = ' . (int) $parent . ' AND module_langname = \'' . $this->db->sql_escape($data['before']) . '\''; $this->db->sql_query($sql); $to_left = $this->db->sql_fetchfield('left_id'); $sql = 'UPDATE ' . MODULES_TABLE . " SET left_id = left_id + 2, right_id = right_id + 2\n\t\t\t\t\tWHERE module_class = '{$class}'\n\t\t\t\t\tAND left_id >= {$to_left}\n\t\t\t\t\tAND left_id < {$module_data['left_id']}"; $this->db->sql_query($sql); $sql = 'UPDATE ' . MODULES_TABLE . " SET left_id = {$to_left}, right_id = " . ($to_left + 1) . "\n\t\t\t\t\tWHERE module_class = '{$class}'\n\t\t\t\t\tAND module_id = {$module_data['module_id']}"; $this->db->sql_query($sql); } else { if (isset($data['after']) && $data['after']) { $sql = 'SELECT right_id FROM ' . MODULES_TABLE . ' WHERE module_class = \'' . $class . '\' AND parent_id = ' . (int) $parent . ' AND module_langname = \'' . $this->db->sql_escape($data['after']) . '\''; $this->db->sql_query($sql); $to_right = $this->db->sql_fetchfield('right_id'); $sql = 'UPDATE ' . MODULES_TABLE . " SET left_id = left_id + 2, right_id = right_id + 2\n\t\t\t\t\tWHERE module_class = '{$class}'\n\t\t\t\t\tAND left_id >= {$to_right}\n\t\t\t\t\tAND left_id < {$module_data['left_id']}"; $this->db->sql_query($sql); $sql = 'UPDATE ' . MODULES_TABLE . ' SET left_id = ' . ($to_right + 1) . ', right_id = ' . ($to_right + 2) . "\n\t\t\t\t\tWHERE module_class = '{$class}'\n\t\t\t\t\tAND module_id = {$module_data['module_id']}"; $this->db->sql_query($sql); } } } // Clear the Modules Cache $cache->destroy("_modules_{$class}"); return $this->umil_end(); }
function add_module($array) { global $user; $modules = new acp_modules(); $failed = $modules->update_module_data($array, true); }
/** * Populate the module tables */ function add_modules($mode, $sub) { global $db, $user, $phpbb_root_path, $phpEx; if (!class_exists('acp_modules')) { require $phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx; } $_module = new acp_modules(); if ($this->get_module_id('ACP_GYM_SITEMAPS') > 0) { $url_mod = !empty($sub) ? '?mode=' . $mode : ''; $this->p_master->error(sprintf($user->lang['SEO_ERROR_INSTALLED'], $user->lang['ACP_CAT_PHPBB_SEO']) . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->p_master->module_url . $url_mod . '">', '</a>'), '', '', false, $user->lang['SEO_ERROR_INFO']); } $module_classes = array('acp'); // Add categories foreach ($module_classes as $module_class) { $categories = array(); // Set the module class $_module->module_class = $module_class; foreach ($this->module_categories[$module_class] as $cat_name => $subs) { $module_data = array('module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => 0, 'module_class' => $module_class, 'module_langname' => $cat_name, 'module_mode' => '', 'module_auth' => ''); if ($this->get_module_id('ACP_CAT_PHPBB_SEO') < 1) { // Add category $_module->update_module_data($module_data, true); } else { $module_data['module_id'] = $this->check_module_id('ACP_CAT_PHPBB_SEO'); } // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } $categories[$cat_name]['id'] = (int) $module_data['module_id']; $categories[$cat_name]['parent_id'] = 0; // Create sub-categories... if (is_array($subs)) { foreach ($subs as $level2_name) { $module_data = array('module_basename' => '', 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $level2_name, 'module_mode' => '', 'module_auth' => ''); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } $categories[$level2_name]['id'] = (int) $module_data['module_id']; $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id']; } } } // Get the modules we want to add... returned sorted by name $module_info = $_module->get_module_infos('gym_sitemaps', $module_class); foreach ($module_info as $module_basename => $fileinfo) { foreach ($fileinfo['modes'] as $module_mode => $row) { foreach ($row['cat'] as $cat_name) { if (!isset($categories[$cat_name])) { continue; } $module_data = array('module_basename' => $module_basename, 'module_enabled' => 1, 'module_display' => isset($row['display']) ? (int) $row['display'] : 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $row['title'], 'module_mode' => $module_mode, 'module_auth' => $row['auth']); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->sql_error_triggered) { $error = $db->sql_error($db->sql_error_sql); $this->p_master->db_error($error['message'], $db->sql_error_sql, __LINE__, __FILE__); } } } } } }
/** * Populate the module tables */ function add_modules($mode, $sub) { global $db, $lang, $phpbb_root_path, $phpEx, $phpbb_extension_manager, $config, $phpbb_container; // modules require an extension manager if (empty($phpbb_extension_manager)) { $phpbb_extension_manager = $phpbb_container->get('ext.manager'); } include_once $phpbb_root_path . 'includes/acp/acp_modules.' . $phpEx; $_module = new acp_modules(); $module_classes = array('acp', 'mcp', 'ucp'); // Add categories foreach ($module_classes as $module_class) { $categories = array(); // Set the module class $_module->module_class = $module_class; foreach ($this->module_categories[$module_class] as $cat_name => $subs) { $basename = ''; // Check if this sub-category has a basename. If it has, use it. if (isset($this->module_categories_basenames[$cat_name])) { $basename = $this->module_categories_basenames[$cat_name]; } $module_data = array('module_basename' => $basename, 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => 0, 'module_class' => $module_class, 'module_langname' => $cat_name, 'module_mode' => '', 'module_auth' => ''); // Add category $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->get_sql_error_triggered()) { $error = $db->sql_error($db->get_sql_error_sql()); $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); } $categories[$cat_name]['id'] = (int) $module_data['module_id']; $categories[$cat_name]['parent_id'] = 0; // Create sub-categories... if (is_array($subs)) { foreach ($subs as $level2_name) { $basename = ''; // Check if this sub-category has a basename. If it has, use it. if (isset($this->module_categories_basenames[$level2_name])) { $basename = $this->module_categories_basenames[$level2_name]; } $module_data = array('module_basename' => $basename, 'module_enabled' => 1, 'module_display' => 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $level2_name, 'module_mode' => '', 'module_auth' => ''); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->get_sql_error_triggered()) { $error = $db->sql_error($db->get_sql_error_sql()); $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); } $categories[$level2_name]['id'] = (int) $module_data['module_id']; $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id']; } } } // Get the modules we want to add... returned sorted by name $module_info = $_module->get_module_infos('', $module_class); foreach ($module_info as $module_basename => $fileinfo) { foreach ($fileinfo['modes'] as $module_mode => $row) { foreach ($row['cat'] as $cat_name) { if (!isset($categories[$cat_name])) { continue; } $module_data = array('module_basename' => $module_basename, 'module_enabled' => 1, 'module_display' => isset($row['display']) ? (int) $row['display'] : 1, 'parent_id' => (int) $categories[$cat_name]['id'], 'module_class' => $module_class, 'module_langname' => $row['title'], 'module_mode' => $module_mode, 'module_auth' => $row['auth']); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->get_sql_error_triggered()) { $error = $db->sql_error($db->get_sql_error_sql()); $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); } } } } // Move some of the modules around since the code above will put them in the wrong place if ($module_class == 'acp') { // Move main module 4 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'acp_main'\n\t\t\t\t\t\tAND module_class = 'acp'\n\t\t\t\t\t\tAND module_mode = 'main'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 4); // Move permissions intro screen module 4 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'acp_permissions'\n\t\t\t\t\t\tAND module_class = 'acp'\n\t\t\t\t\t\tAND module_mode = 'intro'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 4); // Move manage users screen module 5 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'acp_users'\n\t\t\t\t\t\tAND module_class = 'acp'\n\t\t\t\t\t\tAND module_mode = 'overview'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 5); // Move extension management module 1 up... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_langname = 'ACP_EXTENSION_MANAGEMENT'\n\t\t\t\t\t\tAND module_class = 'acp'\n\t\t\t\t\t\tAND module_mode = ''\n\t\t\t\t\t\tAND module_basename = ''"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_up', 1); } if ($module_class == 'mcp') { // Move pm report details module 3 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'mcp_pm_reports'\n\t\t\t\t\t\tAND module_class = 'mcp'\n\t\t\t\t\t\tAND module_mode = 'pm_report_details'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 3); // Move closed pm reports module 3 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'mcp_pm_reports'\n\t\t\t\t\t\tAND module_class = 'mcp'\n\t\t\t\t\t\tAND module_mode = 'pm_reports_closed'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 3); // Move open pm reports module 3 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'mcp_pm_reports'\n\t\t\t\t\t\tAND module_class = 'mcp'\n\t\t\t\t\t\tAND module_mode = 'pm_reports'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 3); } if ($module_class == 'ucp') { // Move attachment module 4 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'ucp_attachments'\n\t\t\t\t\t\tAND module_class = 'ucp'\n\t\t\t\t\t\tAND module_mode = 'attachments'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 4); // Move notification options module 4 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'ucp_notifications'\n\t\t\t\t\t\tAND module_class = 'ucp'\n\t\t\t\t\t\tAND module_mode = 'notification_options'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 4); // Move OAuth module 5 down... $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\tWHERE module_basename = 'ucp_auth_link'\n\t\t\t\t\t\tAND module_class = 'ucp'\n\t\t\t\t\t\tAND module_mode = 'auth_link'"; $result = $db->sql_query($sql); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $_module->move_module_by($row, 'move_down', 5); } // And now for the special ones // (these are modules which appear in multiple categories and thus get added manually to some for more control) if (isset($this->module_extras[$module_class])) { foreach ($this->module_extras[$module_class] as $cat_name => $mods) { $sql = 'SELECT module_id, left_id, right_id FROM ' . MODULES_TABLE . "\n\t\t\t\t\t\tWHERE module_langname = '" . $db->sql_escape($cat_name) . "'\n\t\t\t\t\t\t\tAND module_class = '" . $db->sql_escape($module_class) . "'"; $result = $db->sql_query_limit($sql, 1); $row2 = $db->sql_fetchrow($result); $db->sql_freeresult($result); foreach ($mods as $mod_name) { $sql = 'SELECT * FROM ' . MODULES_TABLE . "\n\t\t\t\t\t\t\tWHERE module_langname = '" . $db->sql_escape($mod_name) . "'\n\t\t\t\t\t\t\t\tAND module_class = '" . $db->sql_escape($module_class) . "'\n\t\t\t\t\t\t\t\tAND module_basename <> ''"; $result = $db->sql_query_limit($sql, 1); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $module_data = array('module_basename' => $row['module_basename'], 'module_enabled' => (int) $row['module_enabled'], 'module_display' => (int) $row['module_display'], 'parent_id' => (int) $row2['module_id'], 'module_class' => $row['module_class'], 'module_langname' => $row['module_langname'], 'module_mode' => $row['module_mode'], 'module_auth' => $row['module_auth']); $_module->update_module_data($module_data, true); // Check for last sql error happened if ($db->get_sql_error_triggered()) { $error = $db->sql_error($db->get_sql_error_sql()); $this->p_master->db_error($error['message'], $db->get_sql_error_sql(), __LINE__, __FILE__); } } } } $_module->remove_cache_file(); } }
function add_acp_module(&$module_data) { global $cache; $acp_modules = new acp_modules(); $acp_modules->module_class = $module_data['module_class']; $mod_id = $this->module_exists($module_data['module_langname'], $module_data['parent_id']); if (!empty($mod_id)) { $module_data['module_id'] = $mod_id; } // Adjust auth row if not category if ($module_data['module_basename'] && $module_data['module_mode']) { $fileinfo = $acp_modules->get_module_infos($module_data['module_basename']); $module_data['module_auth'] = $fileinfo[$module_data['module_basename']]['modes'][$module_data['module_mode']]['auth']; } $errors = $acp_modules->update_module_data($module_data, TRUE); if (!sizeof($errors)) { $acp_modules->remove_cache_file(); } else { trigger_error('Could not add module!<br />' . implode('<br />', $errors)); } $cache->destroy('_modules_'); $cache->destroy('_sql_', MODULES_TABLE); return $module_data['module_id']; }