diff options
Diffstat (limited to 'phpBB/phpbb/avatar/manager.php')
| -rw-r--r-- | phpBB/phpbb/avatar/manager.php | 309 | 
1 files changed, 309 insertions, 0 deletions
diff --git a/phpBB/phpbb/avatar/manager.php b/phpBB/phpbb/avatar/manager.php new file mode 100644 index 0000000000..6ce924d2eb --- /dev/null +++ b/phpBB/phpbb/avatar/manager.php @@ -0,0 +1,309 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2011 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\avatar; + +/** +* @package avatar +*/ +class manager +{ +	/** +	* phpBB configuration +	* @var \phpbb\config\config +	*/ +	protected $config; + +	/** +	* Array that contains a list of enabled drivers +	* @var array +	*/ +	static protected $enabled_drivers = false; + +	/** +	* Array that contains all available avatar drivers which are passed via the +	* service container +	* @var array +	*/ +	protected $avatar_drivers; + +	/** +	* Default avatar data row +	* @var array +	*/ +	static protected $default_row = array( +		'avatar'		=> '', +		'avatar_type'	=> '', +		'avatar_width'	=> '', +		'avatar_height'	=> '', +	); + +	/** +	* Construct an avatar manager object +	* +	* @param \phpbb\config\config $config phpBB configuration +	* @param array $avatar_drivers Avatar drivers passed via the service container +	*/ +	public function __construct(\phpbb\config\config $config, $avatar_drivers) +	{ +		$this->config = $config; +		$this->register_avatar_drivers($avatar_drivers); +	} + +	/** +	* Register avatar drivers +	* +	* @param array $avatar_drivers Service collection of avatar drivers +	*/ +	protected function register_avatar_drivers($avatar_drivers) +	{ +		if (!empty($avatar_drivers)) +		{ +			foreach ($avatar_drivers as $driver) +			{ +				$this->avatar_drivers[$driver->get_name()] = $driver; +			} +		} +	} + +	/** +	* Get the driver object specified by the avatar type +	* +	* @param string $avatar_type Avatar type; by default an avatar's service container name +	* @param bool $load_enabled Load only enabled avatars +	* +	* @return object Avatar driver object +	*/ +	public function get_driver($avatar_type, $load_enabled = true) +	{ +		if (self::$enabled_drivers === false) +		{ +			$this->load_enabled_drivers(); +		} + +		$avatar_drivers = ($load_enabled) ? self::$enabled_drivers : $this->get_all_drivers(); + +		// Legacy stuff... +		switch ($avatar_type) +		{ +			case AVATAR_GALLERY: +				$avatar_type = 'avatar.driver.local'; +			break; +			case AVATAR_UPLOAD: +				$avatar_type = 'avatar.driver.upload'; +			break; +			case AVATAR_REMOTE: +				$avatar_type = 'avatar.driver.remote'; +			break; +		} + +		if (!isset($avatar_drivers[$avatar_type])) +		{ +			return null; +		} + +		/* +		* There is no need to handle invalid avatar types as the following code +		* will cause a ServiceNotFoundException if the type does not exist +		*/ +		$driver = $this->avatar_drivers[$avatar_type]; + +		return $driver; +	} + +	/** +	* Load the list of enabled drivers +	* This is executed once and fills self::$enabled_drivers +	*/ +	protected function load_enabled_drivers() +	{ +		if (!empty($this->avatar_drivers)) +		{ +			self::$enabled_drivers = array(); +			foreach ($this->avatar_drivers as $driver) +			{ +				if ($this->is_enabled($driver)) +				{ +					self::$enabled_drivers[$driver->get_name()] = $driver->get_name(); +				} +			} +			asort(self::$enabled_drivers); +		} +	} + +	/** +	* Get a list of all avatar drivers +	* +	* As this function will only be called in the ACP avatar settings page, it +	* doesn't make much sense to cache the list of all avatar drivers like the +	* list of the enabled drivers. +	* +	* @return array Array containing a list of all avatar drivers +	*/ +	public function get_all_drivers() +	{ +		$drivers = array(); + +		if (!empty($this->avatar_drivers)) +		{ +			foreach ($this->avatar_drivers as $driver) +			{ +				$drivers[$driver->get_name()] = $driver->get_name(); +			} +			asort($drivers); +		} + +		return $drivers; +	} + +	/** +	* Get a list of enabled avatar drivers +	* +	* @return array Array containing a list of the enabled avatar drivers +	*/ +	public function get_enabled_drivers() +	{ +		if (self::$enabled_drivers === false) +		{ +			$this->load_enabled_drivers(); +		} + +		return self::$enabled_drivers; +	} + +	/** +	* Strip out user_, group_, or other prefixes from array keys +	* +	* @param array	$row			User data or group data +	* @param string $prefix			Prefix of data keys (e.g. user), should not include the trailing underscore +	* +	* @return array	User or group data with keys that have been +	*			stripped from the preceding "user_" or "group_" +	*			Also the group id is prefixed with g, when the prefix group is removed. +	*/ +	static public function clean_row($row, $prefix = '') +	{ +		// Upon creation of a user/group $row might be empty +		if (empty($row)) +		{ +			return self::$default_row; +		} + +		$output = array(); +		foreach ($row as $key => $value) +		{ +			$key = preg_replace("#^(?:{$prefix}_)#", '', $key); +			$output[$key] = $value; +		} + +		if ($prefix === 'group' && isset($output['id'])) +		{ +			$output['id'] = 'g' . $output['id']; +		} + +		return $output; +	} + +	/** +	* Clean driver names that are returned from template files +	* Underscores are replaced with dots +	* +	* @param string $name Driver name +	* +	* @return string Cleaned driver name +	*/ +	static public function clean_driver_name($name) +	{ +		return str_replace(array('\\', '_'), '.', $name); +	} + +	/** +	* Prepare driver names for use in template files +	* Dots are replaced with underscores +	* +	* @param string $name Clean driver name +	* +	* @return string Prepared driver name +	*/ +	static public function prepare_driver_name($name) +	{ +		return str_replace('.', '_', $name); +	} + +	/** +	* Check if avatar is enabled +	* +	* @param object $driver Avatar driver object +	* +	* @return bool True if avatar is enabled, false if it's disabled +	*/ +	public function is_enabled($driver) +	{ +		$config_name = $this->get_driver_config_name($driver); + +		return $this->config["allow_avatar_{$config_name}"]; +	} + +	/** +	* Get the settings array for enabling/disabling an avatar driver +	* +	* @param object $driver Avatar driver object +	* +	* @return array Array of configuration options as consumed by acp_board +	*/ +	public function get_avatar_settings($driver) +	{ +		$config_name = $this->get_driver_config_name($driver); + +		return array( +			'allow_avatar_' . $config_name	=> array('lang' => 'ALLOW_' . strtoupper(str_replace('\\', '_', $config_name)),		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => false), +		); +	} + +	/** +	* Get the config name of an avatar driver +	* +	* @param object $driver Avatar driver object +	* +	* @return string Avatar driver config name +	*/ +	public function get_driver_config_name($driver) +	{ +		return preg_replace('#^phpbb\\\\avatar\\\\driver\\\\#', '', get_class($driver)); +	} + +	/** +	* Replace "error" strings with their real, localized form +	* +	* @param \phpbb\user phpBB User object +	* @param array	$error Array containing error strings +	*        Key values can either be a string with a language key or an array +	*        that will be passed to vsprintf() with the language key in the +	*        first array key. +	* +	* @return array Array containing the localized error strings +	*/ +	public function localize_errors(\phpbb\user $user, $error) +	{ +		foreach ($error as $key => $lang) +		{ +			if (is_array($lang)) +			{ +				$lang_key = array_shift($lang); +				$error[$key] = vsprintf($user->lang($lang_key), $lang); +			} +			else +			{ +				$error[$key] = $user->lang("$lang"); +			} +		} + +		return $error; +	} +}  | 
