]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
Fixes #3920 profile plugin adds a fast loading of user avatars
authorCash Costello <cash.costello@gmail.com>
Sat, 29 Oct 2011 13:52:17 +0000 (09:52 -0400)
committerCash Costello <cash.costello@gmail.com>
Sat, 29 Oct 2011 13:52:17 +0000 (09:52 -0400)
engine/classes/ElggEntity.php
mod/profile/icon.php [deleted file]
mod/profile/icondirect.php
mod/profile/start.php

index 2fa0d7b02a78d0a1c4fd140392c14830d9f1f6dc..ccf88a6f7c7b8023dd7dc8cf062b9f32cf10dbe2 100644 (file)
@@ -1179,16 +1179,16 @@ abstract class ElggEntity extends ElggData implements
                        return $this->icon_override[$size];
                }
 
-               $url = "_graphics/icons/default/$size.png";
-               $url = elgg_normalize_url($url);
-
                $type = $this->getType();
                $params = array(
                        'entity' => $this,
                        'size' => $size,
                );
 
-               $url = elgg_trigger_plugin_hook('entity:icon:url', $type, $params, $url);
+               $url = elgg_trigger_plugin_hook('entity:icon:url', $type, $params, null);
+               if ($url == null) {
+                       $url = "_graphics/icons/default/$size.png";
+               }
 
                return elgg_normalize_url($url);
        }
diff --git a/mod/profile/icon.php b/mod/profile/icon.php
deleted file mode 100644 (file)
index a624c08..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-/**
-* Elgg profile icon
-*
-* @package ElggProfile
-*/
-
-require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
-// Get the owning user
-$user = elgg_get_page_owner_entity();
-
-// Get the size
-$size = strtolower(get_input('size'));
-if (!in_array($size,array('large','medium','small','tiny','master','topbar')))
-       $size = "medium";
-
-// If user doesn't exist, return default icon
-if (!$user) {
-       $path = elgg_view("icon/user/default/$size");
-       header("Location: $path");
-       exit;
-}
-
-// Try and get the icon
-$filehandler = new ElggFile();
-$filehandler->owner_guid = $user->getGUID();
-$filehandler->setFilename("profile/" .  $user->getGUID() . $size . ".jpg");
-
-$success = false;
-if ($filehandler->open("read")) {
-       if ($contents = $filehandler->read($filehandler->size())) {
-               $success = true;
-       }
-}
-
-if (!$success) {
-       $path = elgg_view("icon/user/default/$size");
-       header("Location: $path");
-       exit;
-}
-
-header("Content-type: image/jpeg");
-header('Expires: ' . date('r',time() + 864000));
-header("Pragma: public");
-header("Cache-Control: public");
-header("Content-Length: " . strlen($contents));
-
-$splitString = str_split($contents, 1024);
-
-foreach($splitString as $chunk) {
-       echo $chunk;
-}
\ No newline at end of file
index fe4726d1adafab8fbd1d7367efd84050a4234eac..f7188455e40ce86c803bb9823e7a13febb1ab2a1 100644 (file)
@@ -1,38 +1,33 @@
 <?php
-
 /**
  * Elgg profile icon cache/bypass
  * 
+ * 
  * @package ElggProfile
  */
 
-
 // Get DB settings
 require_once(dirname(dirname(dirname(__FILE__))). '/engine/settings.php');
 
 global $CONFIG;
 
-$joindate = (int)$_GET['joindate'];
+$join_date = (int)$_GET['joindate'];
 $guid = (int)$_GET['guid'];
 
 $size = strtolower($_GET['size']);
-if (!in_array($size,array('large','medium','small','tiny','master','topbar'))) {
+if (!in_array($size, array('large', 'medium', 'small', 'tiny', 'master', 'topbar'))) {
        $size = "medium";
 }
 
-$mysql_dblink = @mysql_connect($CONFIG->dbhost,$CONFIG->dbuser,$CONFIG->dbpass, true);
+$mysql_dblink = @mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, true);
 if ($mysql_dblink) {
-       if (@mysql_select_db($CONFIG->dbname,$mysql_dblink)) {
-
-               // get dataroot and simplecache_enabled in one select for efficiency
-               if ($result = mysql_query("select name, value from {$CONFIG->dbprefix}datalists where name in ('dataroot','simplecache_enabled')",$mysql_dblink)) {
-                       $simplecache_enabled = true;
+       if (@mysql_select_db($CONFIG->dbname, $mysql_dblink)) {
+               $result = mysql_query("select name, value from {$CONFIG->dbprefix}datalists where name='dataroot'", $mysql_dblink);
+               if ($result) {
                        $row = mysql_fetch_object($result);
                        while ($row) {
                                if ($row->name == 'dataroot') {
-                                       $dataroot = $row->value;
-                               } else if ($row->name == 'simplecache_enabled') {
-                                       $simplecache_enabled = $row->value;
+                                       $data_root = $row->value;
                                }
                                $row = mysql_fetch_object($result);
                        }
@@ -40,21 +35,22 @@ if ($mysql_dblink) {
 
                @mysql_close($mysql_dblink);
 
-               // if the simplecache is enabled, we get icon directly
-               if ($simplecache_enabled) {
+               if (isset($data_root)) {
+
+                       // this depends on ElggDiskFilestore::makeFileMatrix()
+                       $user_path = date('Y/m/d/', $join_date) . $guid;
 
-                       // first try to read icon directly
-                       $user_path = date('Y/m/d/', $joindate) . $guid;
-                       $filename = "$dataroot$user_path/profile/{$guid}{$size}.jpg";
+                       $filename = "$data_root$user_path/profile/{$guid}{$size}.jpg";
                        $contents = @file_get_contents($filename);
                        if (!empty($contents)) {
                                header("Content-type: image/jpeg");
-                               header('Expires: ' . date('r',time() + 864000));
+                               header('Expires: ' . date('r', strtotime("+6 months")), true);
                                header("Pragma: public");
                                header("Cache-Control: public");
                                header("Content-Length: " . strlen($contents));
-                               $splitString = str_split($contents, 1024);
-                               foreach($splitString as $chunk) {
+                               // this chunking is done for supposedly better performance
+                               $split_string = str_split($contents, 1024);
+                               foreach ($split_string as $chunk) {
                                        echo $chunk;
                                }
                                exit;
@@ -64,8 +60,7 @@ if ($mysql_dblink) {
 
 }
 
-// simplecache is not turned on or something went wrong so load engine and try that way
+// something went wrong so load engine and try to forward to default icon
 require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-$user = get_entity($guid);
-set_input('username', $user->username);
-require_once(dirname(__FILE__).'/icon.php');
+elgg_log("Profile icon direct failed.", "WARNING");
+forward("_graphics/icons/user/default{$size}.gif");
index 2c38fdd2d1360c6e87e0547889540bd6e267cf25..0f13ad8445343352b11a8a46bb22a9691bf427b5 100644 (file)
@@ -20,6 +20,9 @@ function profile_init() {
        // will dictate the URL for all ElggUser objects
        elgg_register_entity_url_handler('user', 'all', 'profile_url');
 
+       elgg_register_plugin_hook_handler('entity:icon:url', 'user', 'profile_override_avatar_url');
+       elgg_unregister_plugin_hook_handler('entity:icon:url', 'user', 'user_avatar_hook');
+
 
        elgg_register_simplecache_view('icon/user/default/tiny');
        elgg_register_simplecache_view('icon/user/default/topbar');
@@ -28,7 +31,6 @@ function profile_init() {
        elgg_register_simplecache_view('icon/user/default/large');
        elgg_register_simplecache_view('icon/user/default/master');
 
-       // Register a page handler, so we can have nice URLs
        elgg_register_page_handler('profile', 'profile_page_handler');
 
        elgg_extend_view('page/elements/head', 'profile/metatags');
@@ -45,7 +47,7 @@ function profile_init() {
 /**
  * Profile page handler
  *
- * @param array $page Array of page elements, forwarded by the page handling mechanism
+ * @param array $page Array of URL segments passed by the page handling mechanism
  */
 function profile_page_handler($page) {
 
@@ -94,15 +96,66 @@ function profile_url($user) {
        return elgg_get_site_url() . "profile/" . $user->username;
 }
 
+/**
+ * Use a URL for avatars that avoids loading Elgg engine for better performance
+ *
+ * @param string $hook
+ * @param string $entity_type
+ * @param string $return_value
+ * @param array  $params
+ * @return string
+ */
+function profile_override_avatar_url($hook, $entity_type, $return_value, $params) {
+
+       // if someone already set this, quit
+       if ($return_value) {
+               return null;
+       }
+
+       $user = $params['entity'];
+       $size = $params['size'];
+       
+       if (!elgg_instanceof($user, 'user')) {
+               return null;
+       }
+
+       $user_guid = $user->getGUID();
+       $icon_time = $user->icontime;
+
+       if (!$icon_time) {
+               return "_graphics/icons/user/default{$size}.gif";
+       }
+
+       if ($user->isBanned()) {
+               return null;
+       }
+
+       $filehandler = new ElggFile();
+       $filehandler->owner_guid = $user_guid;
+       $filehandler->setFilename("profile/{$user_guid}{$size}.jpg");
+
+       try {
+               if ($filehandler->exists()) {
+                       $join_date = $user->getTimeCreated();
+                       return "mod/profile/icondirect.php?lastcache=$icon_time&joindate=$join_date&guid=$user_guid&size=$size";
+               }
+       } catch (InvalidParameterException $e) {
+               elgg_log("Unable to get profile icon for user with GUID $user_guid", 'ERROR');
+               return "_graphics/icons/default/$size.png";
+       }
+
+       return null;
+}
+
 /**
  * Parse ECML on parts of the profile
  *
- * @param unknown_type $hook
- * @param unknown_type $entity_type
- * @param unknown_type $return_value
- * @param unknown_type $params
+ * @param string $hook
+ * @param string $entity_type
+ * @param array  $return_value
+ * @return array
  */
-function profile_ecml_views_hook($hook, $entity_type, $return_value, $params) {
+function profile_ecml_views_hook($hook, $entity_type, $return_value) {
        $return_value['profile/profile_content'] = elgg_echo('profile');
 
        return $return_value;
@@ -111,13 +164,12 @@ function profile_ecml_views_hook($hook, $entity_type, $return_value, $params) {
 /**
  * Register profile widgets with default widgets
  *
- * @param unknown_type $hook
- * @param unknown_type $type
- * @param unknown_type $return
- * @param unknown_type $params
+ * @param string $hook
+ * @param string $type
+ * @param array  $return
  * @return array
  */
-function profile_default_widgets_hook($hook, $type, $return, $params) {
+function profile_default_widgets_hook($hook, $type, $return) {
        $return[] = array(
                'name' => elgg_echo('profile'),
                'widget_context' => 'profile',