aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCullen Walsh <ckwalsh@phpbb.com>2011-04-18 22:54:35 -0700
committerCullen Walsh <ckwalsh@cullenwalsh.com>2012-03-18 22:20:45 +0000
commit00d4b9d431d6772889291f2f4c857a144bce93fb (patch)
treebc3506b3d6ee19a268dd3ef21d444711d0f24c3e
parentf102d9a631d6de464abefe2089ff1e6e13ed044d (diff)
downloadforums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.gz
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.bz2
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.tar.xz
forums-00d4b9d431d6772889291f2f4c857a144bce93fb.zip
[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
-rw-r--r--phpBB/includes/avatar/driver.php2
-rw-r--r--phpBB/includes/avatar/driver/local.php31
-rw-r--r--phpBB/includes/avatar/driver/remote.php105
-rw-r--r--phpBB/includes/avatar/driver/upload.php3
-rw-r--r--phpBB/includes/ucp/ucp_profile.php58
-rw-r--r--phpBB/styles/prosilver/template/ucp_avatar_options.html9
-rw-r--r--phpBB/styles/prosilver/template/ucp_avatar_options_local.html2
-rw-r--r--phpBB/styles/prosilver/template/ucp_avatar_options_remote.html11
-rw-r--r--phpBB/styles/prosilver/template/ucp_avatar_options_upload.html8
9 files changed, 165 insertions, 64 deletions
diff --git a/phpBB/includes/avatar/driver.php b/phpBB/includes/avatar/driver.php
index 60ec18670e..a2ff5d804d 100644
--- a/phpBB/includes/avatar/driver.php
+++ b/phpBB/includes/avatar/driver.php
@@ -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;
}
diff --git a/phpBB/includes/avatar/driver/local.php b/phpBB/includes/avatar/driver/local.php
index 65340c92ce..c00f65a81d 100644
--- a/phpBB/includes/avatar/driver/local.php
+++ b/phpBB/includes/avatar/driver/local.php
@@ -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)
diff --git a/phpBB/includes/avatar/driver/remote.php b/phpBB/includes/avatar/driver/remote.php
index bfc1be263f..ebaf3cf5c4 100644
--- a/phpBB/includes/avatar/driver/remote.php
+++ b/phpBB/includes/avatar/driver/remote.php
@@ -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;
}
}
diff --git a/phpBB/includes/avatar/driver/upload.php b/phpBB/includes/avatar/driver/upload.php
index 9705a888b6..84168722ec 100644
--- a/phpBB/includes/avatar/driver/upload.php
+++ b/phpBB/includes/avatar/driver/upload.php
@@ -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;
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index a93430644c..5d7dbe12d8 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -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;
}
diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options.html b/phpBB/styles/prosilver/template/ucp_avatar_options.html
index 680267bb10..e30fcc74aa 100644
--- a/phpBB/styles/prosilver/template/ucp_avatar_options.html
+++ b/phpBB/styles/prosilver/template/ucp_avatar_options.html
@@ -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 -->
diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options_local.html b/phpBB/styles/prosilver/template/ucp_avatar_options_local.html
index 2644397e0d..0dd83db017 100644
--- a/phpBB/styles/prosilver/template/ucp_avatar_options_local.html
+++ b/phpBB/styles/prosilver/template/ucp_avatar_options_local.html
@@ -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>
diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options_remote.html b/phpBB/styles/prosilver/template/ucp_avatar_options_remote.html
index 70869086a9..4e62e96d9d 100644
--- a/phpBB/styles/prosilver/template/ucp_avatar_options_remote.html
+++ b/phpBB/styles/prosilver/template/ucp_avatar_options_remote.html
@@ -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>
diff --git a/phpBB/styles/prosilver/template/ucp_avatar_options_upload.html b/phpBB/styles/prosilver/template/ucp_avatar_options_upload.html
index 9caab72444..9c8dd9af01 100644
--- a/phpBB/styles/prosilver/template/ucp_avatar_options_upload.html
+++ b/phpBB/styles/prosilver/template/ucp_avatar_options_upload.html
@@ -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 -->