1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-19 22:10:14 +02:00

[feature/avatars] Implement UCP remote/local avatars

Implementing selection logic for gallery and remote avatars. Modified
some of the driver interfaces to make things work nicer also. Upload
functionality will be in the next commit.

PHPBB3-10018
This commit is contained in:
Cullen Walsh 2011-04-18 22:54:35 -07:00 committed by Cullen Walsh
parent f102d9a631
commit 00d4b9d431
9 changed files with 165 additions and 64 deletions

View File

@ -102,7 +102,7 @@ abstract class phpbb_avatar_driver
/**
* @TODO
**/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
return false;
}

View File

@ -47,13 +47,8 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
return '';
}
$avatar_list = ($this->cache == null) ? false : $this->cache->get('av_local_list');
if (!$avatar_list)
@ -78,10 +73,13 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
// Match all images in the gallery folder
if (preg_match('#^[^&\'"<>]+\.(?:gif|png|jpe?g)$#i', $image))
{
$avatar_list[$cat][] = array(
$dims = getimagesize($this->phpbb_root_path . $this->config['avatar_gallery_path'] . '/' . $cat . '/' . $image);
$avatar_list[$cat][$image] = array(
'file' => rawurlencode($cat) . '/' . rawurlencode($image),
'filename' => rawurlencode($image),
'name' => ucfirst(str_replace('_', ' ', preg_replace('#^(.*)\..*$#', '\1', $image))),
'width' => $dims[0],
'height' => $dims[1],
);
}
}
@ -98,8 +96,25 @@ class phpbb_avatar_driver_local extends phpbb_avatar_driver
$this->cache->put('av_local_list', $avatar_list);
}
}
$category = request_var('av_local_cat', '');
if ($submitted) {
$file = request_var('av_local_file', '');
if (!isset($avatar_list[$category][urldecode($file)]))
{
$error[] = 'AVATAR_URL_NOT_FOUND';
return false;
}
return array(
'user_avatar' => $category . '/' . $file,
'user_avatar_width' => $avatar_list[$category][urldecode($file)]['width'],
'user_avatar_height' => $avatar_list[$category][urldecode($file)]['height'],
);
}
$categories = array_keys($avatar_list);
foreach ($categories as $cat)

View File

@ -47,14 +47,111 @@ class phpbb_avatar_driver_remote extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
return '';
if ($submitted)
{
$url = request_var('av_remote_url', '');
$width = request_var('av_remote_width', 0);
$height = request_var('av_remote_height', 0);
if (!preg_match('#^(http|https|ftp)://#i', $url))
{
$url = 'http://' . $url;
}
$error = array_merge($error, validate_data(array(
'url' => $url,
), array(
'url' => array('string', true, 5, 255),
)));
if (!empty($error))
{
return false;
}
// Check if this url looks alright
// This isn't perfect, but it's what phpBB 3.0 did, and might as well make sure everything is compatible
if (!preg_match('#^(http|https|ftp)://(?:(.*?\.)*?[a-z0-9\-]+?\.[a-z]{2,4}|(?:\d{1,3}\.){3,5}\d{1,3}):?([0-9]*?).*?\.(gif|jpg|jpeg|png)$#i', $url))
{
$error[] = 'AVATAR_URL_INVALID';
return false;
}
// Make sure getimagesize works...
if (($image_data = getimagesize($url)) === false && ($width <= 0 || $height <= 0))
{
$error[] = 'UNABLE_GET_IMAGE_SIZE';
return false;
}
if (!empty($image_data) && ($image_data[0] < 2 || $image_data[1] < 2))
{
$error[] = 'AVATAR_NO_SIZE';
return false;
}
$width = ($width && $height) ? $width : $image_data[0];
$height = ($width && $height) ? $height : $image_data[1];
if ($width < 2 || $height < 2)
{
$error[] = 'AVATAR_NO_SIZE';
return false;
}
include_once($this->phpbb_root_path . 'includes/functions_upload.' . $this->phpEx);
$types = fileupload::image_types();
$extension = strtolower(filespec::get_extension($url));
if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
{
if (!isset($types[$image_data[2]]))
{
$error[] = 'UNABLE_GET_IMAGE_SIZE';
}
else
{
$error[] = array('IMAGE_FILETYPE_MISMATCH', $types[$image_data[2]][0], $extension);
}
return false;
}
if ($this->config['avatar_max_width'] || $this->config['avatar_max_height'])
{
if ($width > $this->config['avatar_max_width'] || $height > $this->config['avatar_max_height'])
{
$error[] = array('AVATAR_WRONG_SIZE', $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], $width, $height);
return false;
}
}
if ($this->config['avatar_min_width'] || $this->config['avatar_min_height'])
{
if ($width < $this->config['avatar_min_width'] || $height < $this->config['avatar_min_height'])
{
$error[] = array('AVATAR_WRONG_SIZE', $this->config['avatar_min_width'], $this->config['avatar_min_height'], $this->config['avatar_max_width'], $this->config['avatar_max_height'], $width, $height);
return false;
}
}
$result = array(
'user_avatar' => $url,
'user_avatar_width' => $width,
'user_avatar_height' => $height,
);
return $result;
}
else
{
$template->assign_vars(array(
'AV_REMOTE_WIDTH' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar_width']) ? $user_row['user_avatar_width'] : request_var('av_local_width', 0),
'AV_REMOTE_HEIGHT' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar_height']) ? $user_row['user_avatar_height'] : request_var('av_local_width', 0),
'AV_REMOTE_URL' => (($user_row['user_avatar_type'] == AVATAR_REMOTE || $user_row['user_avatar_type'] == 'remote') && $user_row['user_avatar']) ? $user_row['user_avatar'] : '',
));
return true;
}
}

View File

@ -47,7 +47,7 @@ class phpbb_avatar_driver_upload extends phpbb_avatar_driver
/**
* @inheritdoc
*/
public function handle_form($template, &$error = array(), $submitted = false)
public function handle_form($template, $user_row, &$error, $submitted = false)
{
if ($submitted) {
$error[] = 'TODO';
@ -60,6 +60,7 @@ class phpbb_avatar_driver_upload extends phpbb_avatar_driver
{
$template->assign_vars(array(
'S_UPLOAD_AVATAR_URL' => ($this->config['allow_avatar_remote_upload']) ? true : false,
'AV_UPLOAD_SIZE' => $this->config['avatar_filesize'],
));
return true;

View File

@ -544,12 +544,8 @@ class ucp_profile
break;
case 'avatar':
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
$display_gallery = request_var('display_gallery', '0');
$avatar_select = basename(request_var('avatar_select', ''));
$category = basename(request_var('category', ''));
include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx);
add_form_key('ucp_avatar');
$avatars_enabled = false;
@ -572,18 +568,15 @@ class ucp_profile
{
if (check_form_key('ucp_avatar'))
{
$result = $avatar->handle_form($template, $error, true);
$result = $avatar->handle_form($template, $user->data, $error, true);
if (empty($error))
{
// Success! Lets save the result in the database
$sql_ary = array(
'user_avatar_type' => $driver,
'user_avatar' => (string) $result,
);
$result['user_avatar_type'] = $driver;
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
SET ' . $db->sql_build_array('UPDATE', $result) . '
WHERE user_id = ' . $user->data['user_id'];
$db->sql_query($sql);
@ -599,7 +592,7 @@ class ucp_profile
}
}
if ($avatar->handle_form($template, $error)) {
if ($avatar->handle_form($template, $user->data, $error)) {
$driver_u = strtoupper($driver);
$template->assign_block_vars('avatar_drivers', array(
@ -613,39 +606,36 @@ class ucp_profile
}
}
}
// Replace "error" strings with their real, localised form
$error = array_map(array($user, 'lang'), $error);
// Replace "error" strings with their real, localised form
$err = $error;
$error = array();
foreach ($err as $e)
{
if (is_array($e))
{
$key = array_shift($e);
$error[] = vsprintf($user->lang($key), $e);
}
else
{
$error[] = $user->lang((string) $e);
}
}
$avatar = get_user_avatar($user->data, 'USER_AVATAR', true);
$template->assign_vars(array(
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
'AVATAR' => $avatar,
'AVATAR_SIZE' => $config['avatar_filesize'],
'U_GALLERY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=profile&amp;mode=avatar&amp;display_gallery=1'),
'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(),
'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
));
if ($config['allow_avatar'] && $display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local'])
{
avatar_gallery($category, $avatar_select, 4);
}
else if ($config['allow_avatar'])
{
$template->assign_vars(array(
'AVATAR_WIDTH' => request_var('width', empty($avatar) ? 0 : $user->data['user_avatar_width']),
'AVATAR_HEIGHT' => request_var('height', empty($avatar) ? 0 : $user->data['user_avatar_height']),
'S_AVATARS_ENABLED' => $avatars_enabled,
'S_DISPLAY_GALLERY' => ($auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) ? true : false)
);
}
break;
}

View File

@ -12,15 +12,6 @@
<dd><!-- IF AVATAR -->{AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF --></dd>
<!-- IF AVATAR && S_AVATARS_ENABLED --><dd><input type="submit" name="submit" id="delete" value="{LA_DELETE_AVATAR}" /></dd><!-- ENDIF -->
</dl>
<!-- IF S_AVATARS_ENABLED -->
<dl>
<dt><label for="width">{L_LINK_REMOTE_SIZE}:</label><br /><span>{L_LINK_REMOTE_SIZE_EXPLAIN}</span></dt>
<dd>
<label for="width"><input type="text" name="width" id="width" size="3" value="{AVATAR_WIDTH}" class="inputbox autowidth" /> {L_PIXEL}</label> &times;&nbsp;
<label for="height"><input type="text" name="height" id="height" size="3" value="{AVATAR_HEIGHT}" class="inputbox autowidth" /> {L_PIXEL}</label>
</dd>
</dl>
<!-- ENDIF -->
</fieldset>
<!-- BEGIN avatar_drivers -->

View File

@ -9,6 +9,6 @@
<div id="gallery">
<!-- BEGIN av_local_imgs -->
<label for="av-{av_local_imgs.S_ROW_COUNT}"><img src="{av_local_imgs.AVATAR_IMAGE}" alt="" /><br />
<input type="radio" name="avatar_select" id="av-{av_local_imgs.S_ROW_COUNT}" value="{av_local_imgs.AVATAR_FILE}" /></label>
<input type="radio" name="av_local_file" id="av-{av_local_imgs.S_ROW_COUNT}" value="{av_local_imgs.AVATAR_FILE}" /></label>
<!-- END av_local_imgs -->
</div>

View File

@ -1,4 +1,11 @@
<dl>
<dt><label for="remotelink">{L_LINK_REMOTE_AVATAR}:</label><br /><span>{L_LINK_REMOTE_AVATAR_EXPLAIN}</span></dt>
<dd><input type="text" name="remotelink" id="remotelink" value="" class="inputbox" /></dd>
<dt><label for="av_remote_url">{L_LINK_REMOTE_AVATAR}:</label><br /><span>{L_LINK_REMOTE_AVATAR_EXPLAIN}</span></dt>
<dd><input type="text" name="av_remote_url" id="av_remote_url" value="{AV_REMOTE_URL}" class="inputbox" /></dd>
</dl>
<dl>
<dt><label for="width">{L_LINK_REMOTE_SIZE}:</label><br /><span>{L_LINK_REMOTE_SIZE_EXPLAIN}</span></dt>
<dd>
<label for="width"><input type="text" name="width" id="width" size="3" value="{AV_REMOTE_WIDTH}" class="inputbox autowidth" /> {L_PIXEL}</label> &times;&nbsp;
<label for="height"><input type="text" name="height" id="height" size="3" value="{AV_REMOTE_HEIGHT}" class="inputbox autowidth" /> {L_PIXEL}</label>
</dd>
</dl>

View File

@ -1,11 +1,11 @@
<dl>
<dt><label for="uploadfile">{L_UPLOAD_AVATAR_FILE}:</label></dt>
<dd><input type="hidden" name="MAX_FILE_SIZE" value="{AVATAR_SIZE}" /><input type="file" name="uploadfile" id="uploadfile" class="inputbox autowidth" /></dd>
<dt><label for="av_upload_file">{L_UPLOAD_AVATAR_FILE}:</label></dt>
<dd><input type="hidden" name="MAX_FILE_SIZE" value="{AV_UPLOAD_SIZE}" /><input type="file" name="av_upload_file" id="av_upload_file" class="inputbox autowidth" /></dd>
</dl>
<!-- IF S_UPLOAD_AVATAR_URL -->
<dl>
<dt><label for="uploadurl">{L_UPLOAD_AVATAR_URL}:</label><br /><span>{L_UPLOAD_AVATAR_URL_EXPLAIN}</span></dt>
<dd><input type="text" name="uploadurl" id="uploadurl" value="{AVATAR_URL}" class="inputbox" /></dd>
<dt><label for="av_upload_url">{L_UPLOAD_AVATAR_URL}:</label><br /><span>{L_UPLOAD_AVATAR_URL_EXPLAIN}</span></dt>
<dd><input type="text" name="av_upload_url" id="av_upload_url" value="" class="inputbox" /></dd>
</dl>
<!-- ENDIF -->