diff options
Diffstat (limited to 'phpBB/includes/functions_module.php')
| -rw-r--r-- | phpBB/includes/functions_module.php | 170 | 
1 files changed, 132 insertions, 38 deletions
| diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php index 53055752f6..7a1991d69a 100644 --- a/phpBB/includes/functions_module.php +++ b/phpBB/includes/functions_module.php @@ -1,9 +1,13 @@  <?php  /**  * -* @package phpBB3 -* @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file.  *  */ @@ -17,7 +21,6 @@ if (!defined('IN_PHPBB'))  /**  * Class handling all types of 'plugins' (a future term) -* @package phpBB3  */  class p_master  { @@ -79,8 +82,8 @@ class p_master  	*/  	function list_modules($p_class)  	{ -		global $auth, $db, $user, $cache; -		global $config, $phpbb_root_path, $phpEx; +		global $db, $user, $cache; +		global $phpbb_dispatcher;  		// Sanitise for future path use, it's escaped as appropriate for queries  		$this->p_class = str_replace(array('.', '/', '\\'), '', basename($p_class)); @@ -125,8 +128,17 @@ class p_master  		// Clean up module cache array to only let survive modules the user can access  		$right_id = false; + +		$hide_categories = array();  		foreach ($this->module_cache['modules'] as $key => $row)  		{ +			// When the module has no mode (category) we check whether it has visible children +			// before listing it as well. +			if (!$row['module_mode']) +			{ +				$hide_categories[(int) $row['module_id']] = $key; +			} +  			// Not allowed to view module?  			if (!$this->module_auth_self($row['module_auth']))  			{ @@ -161,6 +173,22 @@ class p_master  				$right_id = $row['right_id'];  				continue;  			} + +			if ($row['module_mode']) +			{ +				// The parent category has a visible child +				// So remove it and all its parents from the hide array +				unset($hide_categories[(int) $row['parent_id']]); +				foreach ($this->module_cache['parents'][$row['module_id']] as $module_id => $row_id) +				{ +					unset($hide_categories[$module_id]); +				} +			} +		} + +		foreach ($hide_categories as $module_id => $row_id) +		{ +			unset($this->module_cache['modules'][$row_id]);  		}  		// Re-index (this is needed, else we are not able to array_slice later) @@ -222,13 +250,25 @@ class p_master  			// Function for building 'url_extra'  			$short_name = $this->get_short_name($row['module_basename']); -			$url_func = '_module_' . $short_name . '_url'; +			$url_func = 'phpbb_module_' . $short_name . '_url'; +			if (!function_exists($url_func)) +			{ +				$url_func = '_module_' . $short_name . '_url'; +			}  			// Function for building the language name -			$lang_func = '_module_' . $short_name . '_lang'; +			$lang_func = 'phpbb_module_' . $short_name . '_lang'; +			if (!function_exists($lang_func)) +			{ +				$lang_func = '_module_' . $short_name . '_lang'; +			}  			// Custom function for calling parameters on module init (for example assigning template variables) -			$custom_func = '_module_' . $short_name; +			$custom_func = 'phpbb_module_' . $short_name; +			if (!function_exists($custom_func)) +			{ +				$custom_func = '_module_' . $short_name; +			}  			$names[$row['module_basename'] . '_' . $row['module_mode']][] = true; @@ -259,6 +299,20 @@ class p_master  				$custom_func($row['module_mode'], $module_row);  			} +			/** +			* This event allows to modify parameters for building modules list +			* +			* @event core.modify_module_row +			* @var	string		url_func		Function for building 'url_extra' +			* @var	string		lang_func		Function for building the language name +			* @var	string		custom_func		Custom function for calling parameters on module init +			* @var	array		row				Array holding the basic module data +			* @var	array		module_row		Array holding the module display parameters +			* @since 3.1.0-b3 +			*/ +			$vars = array('url_func', 'lang_func', 'custom_func', 'row', 'module_row'); +			extract($phpbb_dispatcher->trigger_event('core.modify_module_row', compact($vars))); +  			$this->module_ary[] = $module_row;  		} @@ -359,6 +413,7 @@ class p_master  			'cfg_([a-z0-9_]+)'				=> '(int) $config[\'\\1\']',  			'request_([a-zA-Z0-9_]+)'		=> '$request->variable(\'\\1\', false)',  			'ext_([a-zA-Z0-9_/]+)'			=> 'array_key_exists(\'\\1\', $phpbb_extension_manager->all_enabled())', +			'authmethod_([a-z0-9_\\\\]+)'		=> '($config[\'auth_method\'] === \'\\1\')',  		);  		/** @@ -370,7 +425,7 @@ class p_master  		* @var	string	module_auth			The module_auth of the current  		* 									module  		* @var	int		forum_id			The current forum_id -		* @since 3.1-A3 +		* @since 3.1.0-a3  		*/  		$vars = array('valid_tokens', 'module_auth', 'forum_id');  		extract($phpbb_dispatcher->trigger_event('core.module_auth', compact($vars))); @@ -413,7 +468,9 @@ class p_master  		);  		$is_auth = false; +		// @codingStandardsIgnoreStart  		eval('$is_auth = (int) (' .	$module_auth . ');'); +		// @codingStandardsIgnoreEnd  		return $is_auth;  	} @@ -423,13 +480,21 @@ class p_master  	*/  	function set_active($id = false, $mode = false)  	{ +		global $request; +  		$icat = false;  		$this->active_module = false; -		if (request_var('icat', '')) +		if ($request->variable('icat', ''))  		{  			$icat = $id; -			$id = request_var('icat', ''); +			$id = $request->variable('icat', ''); +		} + +		// Restore the backslashes in class names +		if (strpos($id, '-') !== false) +		{ +			$id = str_replace('-', '\\', $id);  		}  		if ($id && !is_numeric($id) && !$this->is_full_class($id)) @@ -484,18 +549,20 @@ class p_master  	*  	* This method loads a given module, passing it the relevant id and mode.  	* -	* @param string $mode mode, as passed through to the module +	* @param string|false $mode mode, as passed through to the module +	* @param string|false $module_url If supplied, we use this module url +	* @param bool $execute_module If true, at the end we execute the main method for the new instance  	*/  	function load_active($mode = false, $module_url = false, $execute_module = true)  	{ -		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template; +		global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template, $request;  		$module_path = $this->include_path . $this->p_class; -		$icat = request_var('icat', ''); +		$icat = $request->variable('icat', '');  		if ($this->active_module === false)  		{ -			trigger_error('Module not accessible', E_USER_ERROR); +			trigger_error('MODULE_NOT_ACCESS', E_USER_ERROR);  		}  		// new modules use the full class names, old ones are always called <type>_<name>, e.g. acp_board @@ -503,14 +570,14 @@ class p_master  		{  			if (!file_exists("$module_path/{$this->p_name}.$phpEx"))  			{ -				trigger_error("Cannot find module $module_path/{$this->p_name}.$phpEx", E_USER_ERROR); +				trigger_error($user->lang('MODULE_NOT_FIND', "$module_path/{$this->p_name}.$phpEx"), E_USER_ERROR);  			}  			include("$module_path/{$this->p_name}.$phpEx");  			if (!class_exists($this->p_name))  			{ -				trigger_error("Module file $module_path/{$this->p_name}.$phpEx does not contain correct class [{$this->p_name}]", E_USER_ERROR); +				trigger_error($user->lang('MODULE_FILE_INCORRECT_CLASS', "$module_path/{$this->p_name}.$phpEx", $this->p_name), E_USER_ERROR);  			}  		} @@ -541,7 +608,12 @@ class p_master  				if (is_dir($module_style_dir))  				{ -					$template->set_custom_style('adm', array($module_style_dir, $phpbb_admin_path . 'style')); +					$template->set_custom_style(array( +						array( +							'name' 		=> 'adm', +							'ext_path' 	=> 'adm/style/', +						), +					), array($module_style_dir, $phpbb_admin_path . 'style'));  				}  			} @@ -552,7 +624,7 @@ class p_master  			}  			// Not being able to overwrite ;) -			$this->module->u_action = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=' . $this->get_module_identifier($this->p_name, $this->p_id)) . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}"; +			$this->module->u_action = append_sid("{$phpbb_admin_path}index.$phpEx", 'i=' . $this->get_module_identifier($this->p_name)) . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}";  		}  		else  		{ @@ -584,7 +656,7 @@ class p_master  				$this->module->u_action = $phpbb_root_path . (($user->page['page_dir']) ? $user->page['page_dir'] . '/' : '') . $user->page['page_name'];  			} -			$this->module->u_action = append_sid($this->module->u_action, 'i=' . $this->get_module_identifier($this->p_name, $this->p_id)) . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}"; +			$this->module->u_action = append_sid($this->module->u_action, 'i=' . $this->get_module_identifier($this->p_name)) . (($icat) ? '&icat=' . $icat : '') . "&mode={$this->p_mode}";  		}  		// Add url_extra parameter to u_action url @@ -657,8 +729,6 @@ class p_master  	*/  	function get_parents($parent_id, $left_id, $right_id, &$all_parents)  	{ -		global $db; -  		$parents = array();  		if ($parent_id > 0) @@ -750,7 +820,7 @@ class p_master  		// Make sure the module_url has a question mark set, effectively determining the delimiter to use  		$delim = (strpos($module_url, '?') === false) ? '?' : '&'; -		$current_padding = $current_depth = 0; +		$current_depth = 0;  		$linear_offset 	= 'l_block1';  		$tabular_offset = 't_block2'; @@ -837,7 +907,7 @@ class p_master  			else  			{  				// if the category has a name, then use it. -				$u_title .= $this->get_module_identifier($item_ary['name'], $item_ary['id']); +				$u_title .= $this->get_module_identifier($item_ary['name']);  			}  			// If the item is not a category append the mode  			if (!$item_ary['cat']) @@ -906,7 +976,7 @@ class p_master  	*  	* @param string $class module class (acp/mcp/ucp)  	* @param string $name module name (class name of the module, or its basename -    *                     phpbb_ext_foo_acp_bar_module, ucp_zebra or zebra) +	*                     phpbb_ext_foo_acp_bar_module, ucp_zebra or zebra)  	* @param string $mode mode, as passed through to the module  	*  	*/ @@ -931,7 +1001,7 @@ class p_master  	/**  	* Display module  	*/ -	function display($page_title, $display_online_list = true) +	function display($page_title, $display_online_list = false)  	{  		global $template, $user; @@ -978,19 +1048,45 @@ class p_master  	*/  	function add_mod_info($module_class)  	{ -		global $user, $phpEx; - -		global $phpbb_extension_manager; +		global $config, $user, $phpEx, $phpbb_extension_manager;  		$finder = $phpbb_extension_manager->get_finder(); -		$lang_files = $finder +		// We grab the language files from the default, English and user's language. +		// So we can fall back to the other files like we do when using add_lang() +		$default_lang_files = $english_lang_files = $user_lang_files = array(); + +		// Search for board default language if it's not the user language +		if ($config['default_lang'] != $user->lang_name) +		{ +			$default_lang_files = $finder +				->prefix('info_' . strtolower($module_class) . '_') +				->suffix(".$phpEx") +				->extension_directory('/language/' . basename($config['default_lang'])) +				->core_path('language/' . basename($config['default_lang']) . '/mods/') +				->find(); +		} + +		// Search for english, if its not the default or user language +		if ($config['default_lang'] != 'en' && $user->lang_name != 'en') +		{ +			$english_lang_files = $finder +				->prefix('info_' . strtolower($module_class) . '_') +				->suffix(".$phpEx") +				->extension_directory('/language/en') +				->core_path('language/en/mods/') +				->find(); +		} + +		// Find files in the user's language +		$user_lang_files = $finder  			->prefix('info_' . strtolower($module_class) . '_')  			->suffix(".$phpEx")  			->extension_directory('/language/' . $user->lang_name)  			->core_path('language/' . $user->lang_name . '/mods/')  			->find(); +		$lang_files = array_merge($english_lang_files, $default_lang_files, $user_lang_files);  		foreach ($lang_files as $lang_file => $ext_name)  		{  			$user->add_lang_ext($ext_name, $lang_file); @@ -1016,26 +1112,24 @@ class p_master  	}  	/** -	* If the basename contains a \ we dont use that for the URL. +	* If the basename contains a \ we don't use that for the URL.  	*  	* Firefox is currently unable to correctly copy a urlencoded \  	* so users will be unable to post links to modules. -	* However we can still fallback to the id instead of the name, -	* so we do that in this case. +	* However we can replace them with dashes and re-replace them later  	*  	* @param	string	$basename	Basename of the module -	* @param	int		$id			Id of the module -	* @return		mixed	Identifier that should be used for +	* @return		string	Identifier that should be used for  	*						module link creation  	*/ -	protected function get_module_identifier($basename, $id) +	protected function get_module_identifier($basename)  	{  		if (strpos($basename, '\\') === false)  		{  			return $basename;  		} -		return $id; +		return str_replace('\\', '-', $basename);  	}  	/** | 
