aboutsummaryrefslogtreecommitdiff
path: root/mod/profile/start.php
diff options
context:
space:
mode:
Diffstat (limited to 'mod/profile/start.php')
-rw-r--r--mod/profile/start.php92
1 files changed, 75 insertions, 17 deletions
diff --git a/mod/profile/start.php b/mod/profile/start.php
index d91b66371..ab596f235 100644
--- a/mod/profile/start.php
+++ b/mod/profile/start.php
@@ -7,6 +7,10 @@
elgg_register_event_handler('init', 'system', 'profile_init', 1);
+// Metadata on users needs to be independent
+// outside of init so it happens earlier in boot. See #3316
+register_metadata_as_independent('user');
+
/**
* Profile init function
*/
@@ -16,8 +20,9 @@ function profile_init() {
// will dictate the URL for all ElggUser objects
elgg_register_entity_url_handler('user', 'all', 'profile_url');
- // Metadata on users needs to be independent
- register_metadata_as_independent('user');
+ 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');
@@ -26,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');
@@ -43,7 +47,8 @@ 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
+ * @return bool
*/
function profile_page_handler($page) {
@@ -51,6 +56,8 @@ function profile_page_handler($page) {
$username = $page[0];
$user = get_user_by_username($username);
elgg_set_page_owner_guid($user->guid);
+ } elseif (elgg_is_logged_in()) {
+ forward(elgg_get_logged_in_user_entity()->getURL());
}
// short circuit if invalid or banned username
@@ -68,7 +75,7 @@ function profile_page_handler($page) {
// use the core profile edit page
$base_dir = elgg_get_root_path();
require "{$base_dir}pages/profile/edit.php";
- return;
+ return true;
}
// main profile page
@@ -79,7 +86,8 @@ function profile_page_handler($page) {
$content = elgg_view_layout('widgets', $params);
$body = elgg_view_layout('one_column', array('content' => $content));
- echo elgg_view_page($title, $body);
+ echo elgg_view_page($user->name, $body);
+ return true;
}
/**
@@ -93,14 +101,65 @@ function profile_url($user) {
}
/**
+ * 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;
@@ -109,13 +168,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',
@@ -127,4 +185,4 @@ function profile_default_widgets_hook($hook, $type, $return, $params) {
);
return $return;
-} \ No newline at end of file
+}