From 59c343104a938da7de97d0f5c267b4d9415abc7f Mon Sep 17 00:00:00 2001 From: Imanol Losada Date: Wed, 18 Mar 2015 16:23:46 -0500 Subject: [PATCH] Add Gravatar support - refs #4507 --- main/inc/lib/api.lib.php | 35 +++++++++++++------ main/inc/lib/usermanager.lib.php | 58 ++++++++++++++++++++++++++++---- 2 files changed, 76 insertions(+), 17 deletions(-) diff --git a/main/inc/lib/api.lib.php b/main/inc/lib/api.lib.php index f30444e560..037c806bbb 100644 --- a/main/inc/lib/api.lib.php +++ b/main/inc/lib/api.lib.php @@ -1404,9 +1404,9 @@ function _api_format_user($user, $add_password = false) // Getting user avatar. $picture_filename = trim($result['picture_uri']); - $avatar = api_get_path(WEB_CODE_PATH).'img/unknown.jpg'; - $avatar_small = api_get_path(WEB_CODE_PATH).'img/unknown_22.jpg'; - $avatar_sys_path = api_get_path(SYS_CODE_PATH).'img/unknown.jpg'; + $result['avatar'] = api_get_path(WEB_CODE_PATH).'img/unknown.jpg'; + $result['avatar_small'] = api_get_path(WEB_CODE_PATH).'img/unknown_22.jpg'; + $result['avatar_sys_path'] = api_get_path(SYS_CODE_PATH).'img/unknown.jpg'; $dir = 'upload/users/'.$user_id.'/'; //if (!empty($picture_filename) && api_is_anonymous() ) { //Why you have to be anonymous? @@ -1417,16 +1417,29 @@ function _api_format_user($user, $add_password = false) } $image_sys_path = api_get_path(SYS_CODE_PATH).$dir.$picture_filename; - if (file_exists($image_sys_path) && !is_dir($image_sys_path)) { - $avatar = api_get_path(WEB_CODE_PATH).$dir.$picture_filename; - $avatar_small = api_get_path(WEB_CODE_PATH).$dir.'small_'.$picture_filename; - $avatar_sys_path = api_get_path(SYS_CODE_PATH).$dir.$picture_filename; + if ($picture_filename) { + if (file_exists($image_sys_path)) { + $result['avatar'] = api_get_path(WEB_CODE_PATH).$dir.$picture_filename; + $result['avatar_small'] = api_get_path(WEB_CODE_PATH).$dir.'small_'.$picture_filename; + $result['avatar_sys_path'] = api_get_path(SYS_CODE_PATH).$dir.$picture_filename; + } else if (api_get_configuration_value('gravatar_enabled')) { + $userEmail = isset($user['email']) ? $user['email'] : ''; + $gravatarType = api_get_configuration_value('gravatar_type'); + $avatarPaths = array( + 'avatar' => $result['avatar'], + 'avatar_small' => $result['avatar_small'], + 'avatar_sys_path' => $result['avatar_sys_path'] + ); + foreach ($avatarPaths as $key => $value) { + $avatarSize = api_getimagesize($value); + $avatarSize = $avatarSize['width'] > $avatarSize['height'] ? + $avatarSize['width'] : + $avatarSize['height']; + $result[$key] = UserManager::getGravatar($userEmail, $avatarSize, $gravatarType); + } + } } - $result['avatar'] = $avatar; - $result['avatar_sys_path'] = $avatar_sys_path; - $result['avatar_small'] = $avatar_small; - if (isset($user['user_is_online'])) { $result['user_is_online'] = $user['user_is_online'] == true ? 1 : 0; } diff --git a/main/inc/lib/usermanager.lib.php b/main/inc/lib/usermanager.lib.php index c9bf51f7f9..ad24822037 100755 --- a/main/inc/lib/usermanager.lib.php +++ b/main/inc/lib/usermanager.lib.php @@ -1244,21 +1244,24 @@ class UserManager $base = ''; } + $noPicturePath = array('dir' => $base.'img/', 'file' => 'unknown.jpg'); + if (empty($id) || empty($type)) { - return $anonymous ? array('dir' => $base.'img/', 'file' => 'unknown.jpg') : array('dir' => '', 'file' => ''); + return $anonymous ? $noPicturePath : array('dir' => '', 'file' => ''); } $user_id = intval($id); $user_table = Database :: get_main_table(TABLE_MAIN_USER); - $sql = "SELECT picture_uri FROM $user_table WHERE user_id=".$user_id; + $sql = "SELECT email, picture_uri FROM $user_table WHERE user_id=".$user_id; $res = Database::query($sql); if (!Database::num_rows($res)) { - return $anonymous ? array('dir' => $base.'img/', 'file' => 'unknown.jpg') : array('dir' => '', 'file' => ''); + return $anonymous ? $noPicturePath : array('dir' => '', 'file' => ''); } $user = Database::fetch_array($res); + $picture_filename = trim($user['picture_uri']); if (api_get_setting('split_users_upload_directory') === 'true') { @@ -1271,16 +1274,34 @@ class UserManager } else { $dir = $base.'upload/users/'.$user_id.'/'; } - if (empty($picture_filename) && $anonymous) { - return array('dir' => $base.'img/', 'file' => 'unknown.jpg'); + + if (!$picture_filename || ($picture_filename && !file_exists($dir.$picture_filename))) { + if ($anonymous) { + return $noPicturePath; + } + if (api_get_configuration_value('gravatar_enabled')) { + $avatarSize = api_getimagesize($noPicturePath['dir'].$noPicturePath['file']); + $avatarSize = $avatarSize['width'] > $avatarSize['height'] ? + $avatarSize['width'] : + $avatarSize['height']; + return array( + 'dir' => '', + 'file' => self::getGravatar( + $user['email'], + $avatarSize, + api_get_configuration_value('gravatar_type') + ) + ); + } } + return array('dir' => $dir, 'file' => $picture_filename); } /** * Creates new user photos in various sizes of a user, or deletes user photos. * Note: This method relies on configuration setting from main/inc/conf/profile.conf.php - * @param int $user_id The user internal identitfication number. + * @param int $user_id The user internal identification number. * @param string $file The common file name for the newly created photos. * It will be checked and modified for compatibility with the file system. * If full name is provided, path component is ignored. @@ -5197,4 +5218,29 @@ EOF; return false; } + + /** + * Get either a Gravatar URL or complete image tag for a specified email address. + * + * @param string $email The email address + * @param string $s Size in pixels, defaults to 80px [ 1 - 2048 ] + * @param string $d Default imageset to use [ 404 | mm | identicon | monsterid | wavatar ] + * @param string $r Maximum rating (inclusive) [ g | pg | r | x ] + * @param boole $img True to return a complete IMG tag False for just the URL + * @param array $atts Optional, additional key/value attributes to include in the IMG tag + * @return String containing either just a URL or a complete image tag + * @source http://gravatar.com/site/implement/images/php/ + */ + public static function getGravatar( $email, $s = 80, $d = 'mm', $r = 'g', $img = false, $atts = array() ) { + $url = 'http://www.gravatar.com/avatar/'; + $url .= md5( strtolower( trim( $email ) ) ); + $url .= "?s=$s&d=$d&r=$r"; + if ( $img ) { + $url = ' $val ) + $url .= ' ' . $key . '="' . $val . '"'; + $url .= ' />'; + } + return $url; + } }