MDL-28043 user Fixed context hack in pluginfile for user pics leading to init of...
authorSam Hemelryk <sam@moodle.com>
Mon, 5 Sep 2011 23:29:05 +0000 (11:29 +1200)
committerSam Hemelryk <sam@moodle.com>
Mon, 5 Sep 2011 23:29:05 +0000 (11:29 +1200)
lib/outputcomponents.php
lib/outputrenderers.php
pluginfile.php

index 8bb6d76..9a4a123 100644 (file)
@@ -259,6 +259,78 @@ class user_picture implements renderable {
 
         return $return;
     }
+
+    /**
+     * Works out the URL for the users picture.
+     *
+     * This method is recommended as it avoids costly redirects of user pictures
+     * if requests are made for non-existent files etc.
+     *
+     * @param renderer_base $renderer
+     * @return moodle_url
+     */
+    public function get_url(moodle_page $page, renderer_base $renderer = null) {
+        global $CFG;
+
+        if (is_null($renderer)) {
+            $renderer = $page->get_renderer('core');
+        }
+
+        if (!empty($CFG->forcelogin) and !isloggedin()) {
+            // protect images if login required and not logged in;
+            // do not use require_login() because it is expensive and not suitable here anyway
+            return $renderer->pix_url('u/f1');
+        }
+
+        // Sort out the filename and size. Size is only required for the gravatar
+        // implementation presently.
+        if (empty($this->size)) {
+            $filename = 'f2';
+            $size = 35;
+        } else if ($this->size === true or $this->size == 1) {
+            $filename = 'f1';
+            $size = 100;
+        } else if ($this->size >= 50) {
+            $filename = 'f1';
+            $size = (int)$this->size;
+        } else {
+            $filename = 'f2';
+            $size = (int)$this->size;
+        }
+
+        if ($this->user->picture == 1) {
+            // The user has uploaded their own profile pic. In this case we will
+            // check that a profile pic file does actually exist
+            $fs = get_file_storage();
+            $context = get_context_instance(CONTEXT_USER, $this->user->id);
+            if (!$fs->file_exists($context->id, 'user', 'icon', 0, '/', $filename.'/.png')) {
+                if (!$fs->file_exists($context->id, 'user', 'icon', 0, '/', $filename.'/.jpg')) {
+                    return $renderer->pix_url('u/'.$filename);
+                }
+            }
+            $path = '/';
+            if (clean_param($page->theme->name, PARAM_THEME) == $page->theme->name) {
+                // We append the theme name to the file path if we have it so that
+                // in the circumstance that the profile picture is not available
+                // when the user actually requests it they still get the profile
+                // picture for the correct theme.
+                $path .= $page->theme->name.'/';
+            }
+            return moodle_url::make_pluginfile_url($context->id, 'user', 'icon', NULL, $path, $filename);
+
+        } else if ($this->user->picture == 2) {
+            // This is just VERY basic support for gravatar to give the actual
+            // implementor a headstart in what to do.
+            if ($size < 1 || $size > 500) {
+                $size = 35;
+            }
+            $md5 = md5(strtolower(trim($this->user->email)));
+            $default = urlencode($this->pix_url('u/'.$filename)->out(false));
+            return "http://www.gravatar.com/avatar/{$md5}?s={$size}&d={$default}";
+        }
+
+        return $renderer->pix_url('u/'.$filename);
+    }
 }
 
 /**
index da23b21..d685cd2 100644 (file)
@@ -1801,33 +1801,21 @@ class core_renderer extends renderer_base {
         }
 
         if (empty($userpicture->size)) {
-            $file = 'f2';
             $size = 35;
         } else if ($userpicture->size === true or $userpicture->size == 1) {
-            $file = 'f1';
             $size = 100;
-        } else if ($userpicture->size >= 50) {
-            $file = 'f1';
-            $size = $userpicture->size;
         } else {
-            $file = 'f2';
             $size = $userpicture->size;
         }
 
         $class = $userpicture->class;
 
-        if ($user->picture == 1) {
-            $usercontext = get_context_instance(CONTEXT_USER, $user->id);
-            $src = moodle_url::make_pluginfile_url($usercontext->id, 'user', 'icon', NULL, '/', $file);
-
-        } else if ($user->picture == 2) {
-            //TODO: gravatar user icon support
-
-        } else { // Print default user pictures (use theme version if available)
+        if ($user->picture != 1 && $user->picture != 2) {
             $class .= ' defaultuserpic';
-            $src = $this->pix_url('u/' . $file);
         }
 
+        $src = $userpicture->get_url($this->page, $this);
+
         $attributes = array('src'=>$src, 'alt'=>$alt, 'title'=>$alt, 'class'=>$class, 'width'=>$size, 'height'=>$size);
 
         // get the image html output fisrt
index e9e83db..635273f 100644 (file)
@@ -279,24 +279,32 @@ if ($component === 'blog') {
 // ========================================================================================================================
 } else if ($component === 'user') {
     if ($filearea === 'icon' and $context->contextlevel == CONTEXT_USER) {
-        // XXX: pix_url will initialize $PAGE, so we have to set up context here
-        // this temp hack should be fixed by better solution
-        $PAGE->set_context(get_system_context());
-        if (!empty($CFG->forcelogin) and !isloggedin()) {
+        $redirect = false;
+        if (count($args) == 1) {
+            $themename = theme_config::DEFAULT_THEME;
+            $filename = array_shift($args);
+        } else {
+            $themename = array_shift($args);
+            $filename = array_shift($args);
+        }
+        if ((!empty($CFG->forcelogin) and !isloggedin())) {
             // protect images if login required and not logged in;
             // do not use require_login() because it is expensive and not suitable here anyway
-            redirect($OUTPUT->pix_url('u/f1'));
+            $redirect = true;
         }
-        $filename = array_pop($args);
-        if ($filename !== 'f1' and $filename !== 'f2') {
-            redirect($OUTPUT->pix_url('u/f1'));
+        if (!$redirect and ($filename !== 'f1' and $filename !== 'f2')) {
+            $filename = 'f1';
+            $redirect = true;
         }
-        if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'/.png')) {
+        if (!$redirect && !$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'/.png')) {
             if (!$file = $fs->get_file($context->id, 'user', 'icon', 0, '/', $filename.'/.jpg')) {
-                redirect($OUTPUT->pix_url('u/'.$filename));
+                $redirect = true;
             }
         }
-
+        if ($redirect) {
+            $theme = theme_config::load($themename);
+            redirect($theme->pix_url('u/'.$filename, 'moodle'));
+        }
         send_stored_file($file, 60*60*24); // enable long caching, there are many images on each page
 
     } else if ($filearea === 'private' and $context->contextlevel == CONTEXT_USER) {