diff options
Diffstat (limited to 'mod/profile/start.php')
| -rw-r--r-- | mod/profile/start.php | 348 |
1 files changed, 118 insertions, 230 deletions
diff --git a/mod/profile/start.php b/mod/profile/start.php index 1b47445d7..ab596f235 100644 --- a/mod/profile/start.php +++ b/mod/profile/start.php @@ -3,298 +3,186 @@ * Elgg profile plugin * * @package ElggProfile - * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2 - * @author Curverider Ltd <info@elgg.com> - * @copyright Curverider Ltd 2008-2010 - * @link http://elgg.com/ */ +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; sets up the profile functions - * + * Profile init function */ function profile_init() { - global $CONFIG; - - require_once 'profile_lib.php'; // Register a URL handler for users - this means that profile_url() // will dictate the URL for all ElggUser objects - register_entity_url_handler('profile_url', 'user', 'all'); - - // Set up the menu for logged-in users - //if (isloggedin()) { - // add_menu(elgg_echo('profile:yours'), $_SESSION['user']->getURL() . '/extend'); - //} - - // Metadata on users needs to be independent - register_metadata_as_independent('user'); - - elgg_view_register_simplecache('icon/user/default/tiny'); - elgg_view_register_simplecache('icon/user/default/topbar'); - elgg_view_register_simplecache('icon/user/default/small'); - elgg_view_register_simplecache('icon/user/default/medium'); - elgg_view_register_simplecache('icon/user/default/large'); - elgg_view_register_simplecache('icon/user/default/master'); - - // Register a page handler, so we can have nice URLs - register_page_handler('profile', 'profile_page_handler'); - register_page_handler('defaultprofile', 'profileedit_page_handler'); - register_page_handler('icon', 'profile_icon_handler'); - register_page_handler('iconjs', 'profile_iconjs_handler'); + elgg_register_entity_url_handler('user', 'all', 'profile_url'); - // Add Javascript reference to the page header - elgg_extend_view('metatags', 'profile/metatags'); - elgg_extend_view('css', 'profile/css'); - elgg_extend_view('js/initialise_elgg', 'profile/javascript'); + 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'); - // Now override icons - register_plugin_hook('entity:icon:url', 'user', 'profile_usericon_hook'); -} - -/** - * This function loads a set of default fields into the profile, then triggers a hook letting other plugins to edit - * add and delete fields. - * - * Note: This is a secondary system:init call and is run at a super low priority to guarantee that it is called after all - * other plugins have initialised. - */ -function profile_fields_setup() { - global $CONFIG; - - $profile_defaults = array ( - 'description' => 'longtext', - 'briefdescription' => 'text', - 'location' => 'tags', - 'interests' => 'tags', - 'skills' => 'tags', - 'contactemail' => 'email', - 'phone' => 'text', - 'mobile' => 'text', - 'website' => 'url', - 'twitter' => 'text' - ); + elgg_register_simplecache_view('icon/user/default/tiny'); + elgg_register_simplecache_view('icon/user/default/topbar'); + elgg_register_simplecache_view('icon/user/default/small'); + elgg_register_simplecache_view('icon/user/default/medium'); + elgg_register_simplecache_view('icon/user/default/large'); + elgg_register_simplecache_view('icon/user/default/master'); - $loaded_default = array(); - if ($fieldlist = get_plugin_setting('user_defined_fields','profile')) { - if (!empty($fieldlist)) { - $fieldlistarray = explode(',',$fieldlist); - $loaded_defaults = array(); - foreach($fieldlistarray as $listitem) { - if ($translation = get_plugin_setting("admin_defined_profile_{$listitem}", 'profile')) { - $type = get_plugin_setting("admin_defined_profile_type_{$listitem}", 'profile'); - $loaded_defaults["admin_defined_profile_{$listitem}"] = $type; - add_translation(get_current_language(), array("profile:admin_defined_profile_{$listitem}" => $translation)); - } - } - } - } + elgg_register_page_handler('profile', 'profile_page_handler'); - if (count($loaded_defaults)) { - $CONFIG->profile_using_custom = true; - $profile_defaults = $loaded_defaults; - } + elgg_extend_view('page/elements/head', 'profile/metatags'); + elgg_extend_view('css/elgg', 'profile/css'); + elgg_extend_view('js/elgg', 'profile/js'); - $CONFIG->profile = trigger_plugin_hook('profile:fields', 'profile', NULL, $profile_defaults); + // allow ECML in parts of the profile + elgg_register_plugin_hook_handler('get_views', 'ecml', 'profile_ecml_views_hook'); - // register any tag metadata names - foreach ($CONFIG->profile as $name => $type) { - if ($type == 'tags') { - elgg_register_tag_metadata_name($name); - // register a tag name translation - add_translation(get_current_language(), array("tag_names:$name" => elgg_echo("profile:$name"))); - } - } + // allow admins to set default widgets for users on profiles + elgg_register_plugin_hook_handler('get_list', 'default_widgets', 'profile_default_widgets_hook'); } /** * 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) { - global $CONFIG; - - $username = $action = NULL; - // short circuit if invalid or banned username if (isset($page[0])) { $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()); + } - if (!$user || ($user->isBanned() && !isadminloggedin())) { - return elgg_echo('profile:notfound'); - } else { - set_input('username', $page[0]); - } + // short circuit if invalid or banned username + if (!$user || ($user->isBanned() && !elgg_is_admin_logged_in())) { + register_error(elgg_echo('profile:notfound')); + forward(); } + $action = NULL; if (isset($page[1])) { $action = $page[1]; } - switch ($action) { - case 'edit': - $layout = 'one_column_with_sidebar'; - - if (!$user || !$user->canEdit()) { - register_error(elgg_echo("profile:noaccess")); - forward(); - } - - $content = profile_get_user_edit_content($user, $page); - $content = elgg_view_layout($layout, $content); - break; - - default: - $layout = 'one_column'; - if (isset($page[1])) { - $section = $page[1]; - } else { - $section = 'activity'; - } - $content = profile_get_user_profile_html($user, $section); - $content = elgg_view_layout($layout, $content); - break; + if ($action == 'edit') { + // use the core profile edit page + $base_dir = elgg_get_root_path(); + require "{$base_dir}pages/profile/edit.php"; + return true; } - page_draw($title, $content); - return; + // main profile page + $params = array( + 'content' => elgg_view('profile/wrapper'), + 'num_columns' => 3, + ); + $content = elgg_view_layout('widgets', $params); + + $body = elgg_view_layout('one_column', array('content' => $content)); + echo elgg_view_page($user->name, $body); + return true; } /** - * Profile edit page handler + * Profile URL generator for $user->getUrl(); * - * @param array $page Array of page elements, forwarded by the page handling mechanism + * @param ElggUser $user + * @return string User URL */ -function profileedit_page_handler($page) { - global $CONFIG; - - // The username should be the file we're getting - if (isset($page[0])) { - switch ($page[0]) { - default: - include($CONFIG->pluginspath . "profile/defaultprofile.php"); - break; - } - } +function profile_url($user) { + return elgg_get_site_url() . "profile/" . $user->username; } /** - * Pagesetup function + * 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_pagesetup() -{ - global $CONFIG; - if (get_context() == 'admin' && isadminloggedin()) { - add_submenu_item(elgg_echo('profile:edit:default'), $CONFIG->wwwroot . 'pg/defaultprofile/edit/'); +function profile_override_avatar_url($hook, $entity_type, $return_value, $params) { + + // if someone already set this, quit + if ($return_value) { + return null; } - //add submenu options - if (get_context() == "profile") { - $page_owner = page_owner_entity(); - add_submenu_item(elgg_echo('profile:editdetails'), $CONFIG->wwwroot . "pg/profile/{$page_owner->username}/edit/details"); - add_submenu_item(elgg_echo('profile:editicon'), $CONFIG->wwwroot . "pg/profile/{$page_owner->username}/edit/icon"); + $user = $params['entity']; + $size = $params['size']; + + if (!elgg_instanceof($user, 'user')) { + return null; } -} -/** - * Profile icon page handler - * - * @param array $page Array of page elements, forwarded by the page handling mechanism - */ -function profile_icon_handler($page) { - global $CONFIG; + $user_guid = $user->getGUID(); + $icon_time = $user->icontime; - // The username should be the file we're getting - if (isset($page[0])) { - set_input('username',$page[0]); + if (!$icon_time) { + return "_graphics/icons/user/default{$size}.gif"; } - if (isset($page[1])) { - set_input('size',$page[1]); + + if ($user->isBanned()) { + return null; } - // Include the standard profile index - include($CONFIG->pluginspath . "profile/icon.php"); -} -/** - * Icon JS - */ -function profile_iconjs_handler($page) { - global $CONFIG; - include($CONFIG->pluginspath . "profile/javascript.php"); + $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; } /** - * Profile URL generator for $user->getUrl(); + * Parse ECML on parts of the profile * - * @param ElggUser $user - * @return string User URL + * @param string $hook + * @param string $entity_type + * @param array $return_value + * @return array */ -function profile_url($user) { - global $CONFIG; - return $CONFIG->wwwroot . "pg/profile/" . $user->username; +function profile_ecml_views_hook($hook, $entity_type, $return_value) { + $return_value['profile/profile_content'] = elgg_echo('profile'); + + return $return_value; } /** - * This hooks into the getIcon API and provides nice user icons for users where possible. + * Register profile widgets with default widgets * - * @param unknown_type $hook - * @param unknown_type $entity_type - * @param unknown_type $returnvalue - * @param unknown_type $params - * @return unknown + * @param string $hook + * @param string $type + * @param array $return + * @return array */ -function profile_usericon_hook($hook, $entity_type, $returnvalue, $params){ - global $CONFIG; - if ((!$returnvalue) && ($hook == 'entity:icon:url') && ($params['entity'] instanceof ElggUser)){ - $entity = $params['entity']; - $type = $entity->type; - $subtype = get_subtype_from_id($entity->subtype); - $viewtype = $params['viewtype']; - $size = $params['size']; - $username = $entity->username; - - if ($icontime = $entity->icontime) { - $icontime = "{$icontime}"; - } else { - $icontime = "default"; - } - - if ($entity->isBanned()) { - return elgg_view('icon/user/default/'.$size); - } - - $filehandler = new ElggFile(); - $filehandler->owner_guid = $entity->getGUID(); - $filehandler->setFilename("profile/" . $username . $size . ".jpg"); +function profile_default_widgets_hook($hook, $type, $return) { + $return[] = array( + 'name' => elgg_echo('profile'), + 'widget_context' => 'profile', + 'widget_columns' => 3, + + 'event' => 'create', + 'entity_type' => 'user', + 'entity_subtype' => ELGG_ENTITIES_ANY_VALUE, + ); - if ($filehandler->exists()) { - //$url = $CONFIG->url . "pg/icon/$username/$size/$icontime.jpg"; - return $CONFIG->wwwroot . 'mod/profile/icondirect.php?lastcache='.$icontime.'&username='.$entity->username.'&joindate=' . $entity->time_created . '&guid=' . $entity->guid . '&size='.$size; - } - } + return $return; } - -// Make sure the profile initialisation function is called on initialisation -register_elgg_event_handler('init','system','profile_init',1); -register_elgg_event_handler('init','system','profile_fields_setup', 10000); // Ensure this runs after other plugins - -register_elgg_event_handler('pagesetup','system','profile_pagesetup'); -register_elgg_event_handler('profileupdate','all','object_notifications'); - - -// Register actions -global $CONFIG; -register_action("profile/edit",false,$CONFIG->pluginspath . "profile/actions/edit.php"); -register_action("profile/iconupload",false,$CONFIG->pluginspath . "profile/actions/iconupload.php"); -register_action("profile/cropicon",false,$CONFIG->pluginspath . "profile/actions/cropicon.php"); -register_action("profile/editdefault",false,$CONFIG->pluginspath . "profile/actions/editdefault.php", true); -register_action("profile/editdefault/delete",false,$CONFIG->pluginspath . "profile/actions/deletedefaultprofileitem.php", true); -register_action("profile/editdefault/reset",false,$CONFIG->pluginspath . "profile/actions/resetdefaultprofile.php", true); -register_action("profile/editdefault/reorder",false,$CONFIG->pluginspath . "profile/actions/reorder.php", true); -register_action("profile/editdefault/editfield",false,$CONFIG->pluginspath . "profile/actions/editfield.php", true); -register_action("profile/addcomment",false,$CONFIG->pluginspath . "profile/actions/addcomment.php"); -register_action("profile/deletecomment",false,$CONFIG->pluginspath . "profile/actions/deletecomment.php"); |
