1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-02-25 12:33:29 +01:00
php-phpbb/phpBB/phpbb/avatar/manager.php
Nils Adermann 52845b22f2 Merge pull request #1815 from marc1706/ticket/11525
[ticket/11525] Only remove group or user prefix from given avatar data
2013-11-13 09:52:21 -08:00

310 lines
6.9 KiB
PHP

<?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;
}
}