update_module_data() public method

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
示例#1
0
    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();
    }
示例#2
0
	/**
	* 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();
		}
	}
示例#3
0
    /**
     * 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}");
    }
示例#4
0
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();
}
示例#5
0
 /**
  * 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();
 }
示例#6
0
    /**
     * 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);
}
示例#8
0
 /**
  * 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__);
                     }
                 }
             }
         }
     }
 }
示例#9
0
    /**
     * 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();
        }
    }
示例#10
0
 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'];
 }