Browse Source

Merge pull request #588 from ilosada/4507

C#4507 - Add Gravatar support
Yannick Warnier 10 years ago
parent
commit
8c5b384999
2 changed files with 76 additions and 17 deletions
  1. 24 11
      main/inc/lib/api.lib.php
  2. 52 6
      main/inc/lib/usermanager.lib.php

+ 24 - 11
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;
     }

+ 52 - 6
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 = '<img src="' . $url . '"';
+            foreach ( $atts as $key => $val )
+                $url .= ' ' . $key . '="' . $val . '"';
+            $url .= ' />';
+        }
+        return $url;
+    }
 }