diff options
Diffstat (limited to 'mod/profile')
| -rw-r--r-- | mod/profile/icondirect.php | 77 | ||||
| -rw-r--r-- | mod/profile/languages/en.php | 12 | ||||
| -rw-r--r-- | mod/profile/manifest.xml | 17 | ||||
| -rw-r--r-- | mod/profile/start.php | 188 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/css.php | 126 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/details.php | 68 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/js.php | 9 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/metatags.php | 16 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/owner_block.php | 66 | ||||
| -rw-r--r-- | mod/profile/views/default/profile/wrapper.php | 12 | 
10 files changed, 591 insertions, 0 deletions
diff --git a/mod/profile/icondirect.php b/mod/profile/icondirect.php new file mode 100644 index 000000000..5f1599e0d --- /dev/null +++ b/mod/profile/icondirect.php @@ -0,0 +1,77 @@ +<?php +/** + * Elgg profile icon cache/bypass + *  + *  + * @package ElggProfile + */ + +// Get DB settings +require_once(dirname(dirname(dirname(__FILE__))). '/engine/settings.php'); + +global $CONFIG; + +// won't be able to serve anything if no joindate or guid +if (!isset($_GET['joindate']) || !isset($_GET['guid'])) { +	header("HTTP/1.1 404 Not Found"); +	exit; +} + +$join_date = (int)$_GET['joindate']; +$last_cache = (int)$_GET['lastcache']; // icontime +$guid = (int)$_GET['guid']; + +// If is the same ETag, content didn't changed. +$etag = $last_cache . $guid; +if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH']) == "\"$etag\"") { +	header("HTTP/1.1 304 Not Modified"); +	exit; +} + +$size = strtolower($_GET['size']); +if (!in_array($size, array('large', 'medium', 'small', 'tiny', 'master', 'topbar'))) { +	$size = "medium"; +} + +$mysql_dblink = @mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, true); +if ($mysql_dblink) { +	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') { +					$data_root = $row->value; +				} +				$row = mysql_fetch_object($result); +			} +		} + +		@mysql_close($mysql_dblink); + +		if (isset($data_root)) { + +			// this depends on ElggDiskFilestore::makeFileMatrix() +			$user_path = date('Y/m/d/', $join_date) . $guid; + +			$filename = "$data_root$user_path/profile/{$guid}{$size}.jpg"; +			$filesize = @filesize($filename); +			if ($filesize) { +				header("Content-type: image/jpeg"); +				header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', strtotime("+6 months")), true); +				header("Pragma: public"); +				header("Cache-Control: public"); +				header("Content-Length: $filesize"); +				header("ETag: \"$etag\""); +				readfile($filename); +				exit; +			} +		} +	} + +} + +// something went wrong so load engine and try to forward to default icon +require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php"); +elgg_log("Profile icon direct failed.", "WARNING"); +forward("_graphics/icons/user/default{$size}.gif"); diff --git a/mod/profile/languages/en.php b/mod/profile/languages/en.php new file mode 100644 index 000000000..50f04bb33 --- /dev/null +++ b/mod/profile/languages/en.php @@ -0,0 +1,12 @@ +<?php +/** + * Elgg profile plugin language pack + */ + +$english = array( +	'profile' => 'Profile', +	'profile:notfound' => 'Sorry. We could not find the requested profile.', + +); + +add_translation('en', $english);
\ No newline at end of file diff --git a/mod/profile/manifest.xml b/mod/profile/manifest.xml new file mode 100644 index 000000000..86fbc7b7b --- /dev/null +++ b/mod/profile/manifest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> +	<name>Profile</name> +	<description>The default profile plugin.</description> +	<author>Core developers</author> +	<version>1.8</version> +	<category>bundled</category> +	<category>social</category> +	<website>http://elgg.org/</website> +	<copyright>See COPYRIGHT.txt</copyright> +	<license>GNU General Public License Version 2</license> +	<activate_on_install>true</activate_on_install> +	<requires> +		<type>elgg_release</type> +		<version>1.8</version> +	</requires> +</plugin_manifest> diff --git a/mod/profile/start.php b/mod/profile/start.php new file mode 100644 index 000000000..ab596f235 --- /dev/null +++ b/mod/profile/start.php @@ -0,0 +1,188 @@ +<?php +/** + * Elgg profile plugin + * + * @package ElggProfile + */ + +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 + */ +function profile_init() { + +	// Register a URL handler for users - this means that profile_url() +	// 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'); +	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'); + +	elgg_register_page_handler('profile', 'profile_page_handler'); + +	elgg_extend_view('page/elements/head', 'profile/metatags'); +	elgg_extend_view('css/elgg', 'profile/css'); +	elgg_extend_view('js/elgg', 'profile/js'); + +	// allow ECML in parts of the profile +	elgg_register_plugin_hook_handler('get_views', 'ecml', 'profile_ecml_views_hook'); + +	// 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 URL segments passed by the page handling mechanism + * @return bool + */ +function profile_page_handler($page) { + +	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()); +	} + +	// 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]; +	} + +	if ($action == 'edit') { +		// use the core profile edit page +		$base_dir = elgg_get_root_path(); +		require "{$base_dir}pages/profile/edit.php"; +		return true; +	} + +	// 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 URL generator for $user->getUrl(); + * + * @param ElggUser $user + * @return string User URL + */ +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 string $hook + * @param string $entity_type + * @param array  $return_value + * @return array + */ +function profile_ecml_views_hook($hook, $entity_type, $return_value) { +	$return_value['profile/profile_content'] = elgg_echo('profile'); + +	return $return_value; +} + +/** + * Register profile widgets with default widgets + * + * @param string $hook + * @param string $type + * @param array  $return + * @return array + */ +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, +	); + +	return $return; +} diff --git a/mod/profile/views/default/profile/css.php b/mod/profile/views/default/profile/css.php new file mode 100644 index 000000000..e24f555a9 --- /dev/null +++ b/mod/profile/views/default/profile/css.php @@ -0,0 +1,126 @@ +<?php +/** + * Elgg Profile CSS + *  + * @package Profile + */ +?> +/* *************************************** +	Profile +*************************************** */ +.profile { +	float: left; +	margin-bottom: 15px; +} +.profile .elgg-inner { +	margin: 0 5px; +	border: 2px solid #eee; +	 +	-webkit-border-radius: 8px; +	-moz-border-radius: 8px; +	border-radius: 8px; +} +#profile-details { +	padding: 15px; +} +/*** ownerblock ***/ +#profile-owner-block { +	width: 200px; +	float: left; +	background-color: #eee; +	padding: 15px; +} +#profile-owner-block .large { +	margin-bottom: 10px; +} +#profile-owner-block a.elgg-button-action { +	margin-bottom: 4px; +	display: table; +} +.profile-content-menu a { +	display: block; +	 +	-webkit-border-radius: 8px; +	-moz-border-radius: 8px; +	border-radius: 8px; +	 +	background-color: white; +	margin: 3px 0 5px 0; +	padding: 2px 4px 2px 8px; +} +.profile-content-menu a:hover { +	background: #0054A7; +	color: white; +	text-decoration: none; +} +.profile-admin-menu { +	display: none; +} +.profile-admin-menu-wrapper a { +	display: block; +	 +	-webkit-border-radius: 8px; +	-moz-border-radius: 8px; +	border-radius: 8px; +	 +	background-color: white; +	margin: 3px 0 5px 0; +	padding: 2px 4px 2px 8px; +} +.profile-admin-menu-wrapper { +	background-color: white; +	 +	-webkit-border-radius: 8px; +	-moz-border-radius: 8px; +	border-radius: 8px; +} +.profile-admin-menu-wrapper li a { +	background-color: white; +	color: red; +	margin-bottom: 0; +} +.profile-admin-menu-wrapper a:hover { +	color: black; +} +/*** profile details ***/ +#profile-details .odd { +	background-color: #f4f4f4; +	 +	-webkit-border-radius: 4px;  +	-moz-border-radius: 4px; +	border-radius: 4px; +	 +	margin: 0 0 7px; +	padding: 2px 4px; +} +#profile-details .even { +	background-color:#f4f4f4; +	 +	-webkit-border-radius: 4px;  +	-moz-border-radius: 4px; +	border-radius: 4px; +	 +	margin: 0 0 7px; +	padding: 2px 4px; +} +.profile-aboutme-title { +	background-color:#f4f4f4; +	 +	-webkit-border-radius: 4px;  +	-moz-border-radius: 4px; +	border-radius: 4px; +	 +	margin: 0; +	padding: 2px 4px; +} +.profile-aboutme-contents { +	padding: 2px 0 0 3px; +} +.profile-banned-user { +	border: 2px solid red; +	padding: 4px 8px; +	 +	-webkit-border-radius: 6px;  +	-moz-border-radius: 6px; +	border-radius: 6px; +} diff --git a/mod/profile/views/default/profile/details.php b/mod/profile/views/default/profile/details.php new file mode 100644 index 000000000..da4e95690 --- /dev/null +++ b/mod/profile/views/default/profile/details.php @@ -0,0 +1,68 @@ +<?php +/** + * Elgg user display (details) + * @uses $vars['entity'] The user entity + */ + +$user = elgg_get_page_owner_entity(); + +$profile_fields = elgg_get_config('profile_fields'); + +echo '<div id="profile-details" class="elgg-body pll">'; +echo "<h2>{$user->name}</h2>"; + +echo elgg_view("profile/status", array("entity" => $user)); + +$even_odd = null; +if (is_array($profile_fields) && sizeof($profile_fields) > 0) { +	foreach ($profile_fields as $shortname => $valtype) { +		if ($shortname == "description") { +			// skip about me and put at bottom +			continue; +		} +		$value = $user->$shortname; + +		if (!empty($value)) { + +			// fix profile URLs populated by https://github.com/Elgg/Elgg/issues/5232 +			// @todo Replace with upgrade script, only need to alter users with last_update after 1.8.13 +			if ($valtype == 'url' && $value == 'http://') { +				$user->$shortname = ''; +				continue; +			} + +			// validate urls +			if ($valtype == 'url' && !preg_match('~^https?\://~i', $value)) { +				$value = "http://$value"; +			} + +			// this controls the alternating class +			$even_odd = ( 'odd' != $even_odd ) ? 'odd' : 'even'; +			?> +			<div class="<?php echo $even_odd; ?>"> +				<b><?php echo elgg_echo("profile:{$shortname}"); ?>: </b> +				<?php +					echo elgg_view("output/{$valtype}", array('value' => $value)); +				?> +			</div> +			<?php +		} +	} +} + +if (!elgg_get_config('profile_custom_fields')) { +	if ($user->isBanned()) { +		echo "<p class='profile-banned-user'>"; +		echo elgg_echo('banned'); +		echo "</p>"; +	} else { +		if ($user->description) { +			echo "<p class='profile-aboutme-title'><b>" . elgg_echo("profile:aboutme") . "</b></p>"; +			echo "<div class='profile-aboutme-contents'>"; +			echo elgg_view('output/longtext', array('value' => $user->description, 'class' => 'mtn')); +			echo "</div>"; +		} +	} +} + +echo '</div>';
\ No newline at end of file diff --git a/mod/profile/views/default/profile/js.php b/mod/profile/views/default/profile/js.php new file mode 100644 index 000000000..5a08a90bd --- /dev/null +++ b/mod/profile/views/default/profile/js.php @@ -0,0 +1,9 @@ + +// force the first column to at least be as large as the profile box in cols 2 and 3 +// we also want to run before the widget init happens so priority is < 500 +elgg.register_hook_handler('init', 'system', function() { +	// only do this on the profile page's widget canvas. +	if ($('.profile').length) { +		$('#elgg-widget-col-1').css('min-height', $('.profile').outerHeight(true) + 1); +	} +}, 400); diff --git a/mod/profile/views/default/profile/metatags.php b/mod/profile/views/default/profile/metatags.php new file mode 100644 index 000000000..52048b8a7 --- /dev/null +++ b/mod/profile/views/default/profile/metatags.php @@ -0,0 +1,16 @@ +<?php +/** + * FOAF + *  + * @package ElggProfile + *  + */ + +$owner = elgg_get_page_owner_entity(); + +if (elgg_instanceof($owner, 'user')) { +?> +	<link rel="meta" type="application/rdf+xml" title="FOAF" href="<?php echo current_page_url(); ?>?view=foaf" /> +<?php + +} diff --git a/mod/profile/views/default/profile/owner_block.php b/mod/profile/views/default/profile/owner_block.php new file mode 100644 index 000000000..63cb5391a --- /dev/null +++ b/mod/profile/views/default/profile/owner_block.php @@ -0,0 +1,66 @@ +<?php +/** + * Profile owner block + */ + +$user = elgg_get_page_owner_entity(); + +if (!$user) { +	// no user so we quit view +	echo elgg_echo('viewfailure', array(__FILE__)); +	return TRUE; +} + +$icon = elgg_view_entity_icon($user, 'large', array( +	'use_hover' => false, +	'use_link' => false, +)); + +// grab the actions and admin menu items from user hover +$menu = elgg_trigger_plugin_hook('register', "menu:user_hover", array('entity' => $user), array()); +$builder = new ElggMenuBuilder($menu); +$menu = $builder->getMenu(); +$actions = elgg_extract('action', $menu, array()); +$admin = elgg_extract('admin', $menu, array()); + +$profile_actions = ''; +if (elgg_is_logged_in() && $actions) { +	$profile_actions = '<ul class="elgg-menu profile-action-menu mvm">'; +	foreach ($actions as $action) { +		$profile_actions .= '<li>' . $action->getContent(array('class' => 'elgg-button elgg-button-action')) . '</li>'; +	} +	$profile_actions .= '</ul>'; +} + +// if admin, display admin links +$admin_links = ''; +if (elgg_is_admin_logged_in() && elgg_get_logged_in_user_guid() != elgg_get_page_owner_guid()) { +	$text = elgg_echo('admin:options'); + +	$admin_links = '<ul class="profile-admin-menu-wrapper">'; +	$admin_links .= "<li><a rel=\"toggle\" href=\"#profile-menu-admin\">$text…</a>"; +	$admin_links .= '<ul class="profile-admin-menu" id="profile-menu-admin">'; +	foreach ($admin as $menu_item) { +		$admin_links .= elgg_view('navigation/menu/elements/item', array('item' => $menu_item)); +	} +	$admin_links .= '</ul>'; +	$admin_links .= '</li>'; +	$admin_links .= '</ul>';	 +} + +// content links +$content_menu = elgg_view_menu('owner_block', array( +	'entity' => elgg_get_page_owner_entity(), +	'class' => 'profile-content-menu', +)); + +echo <<<HTML + +<div id="profile-owner-block"> +	$icon +	$profile_actions +	$content_menu +	$admin_links +</div> + +HTML; diff --git a/mod/profile/views/default/profile/wrapper.php b/mod/profile/views/default/profile/wrapper.php new file mode 100644 index 000000000..73b7934f2 --- /dev/null +++ b/mod/profile/views/default/profile/wrapper.php @@ -0,0 +1,12 @@ +<?php +/** + * Profile info box + */ + +?> +<div class="profile elgg-col-2of3"> +	<div class="elgg-inner clearfix"> +		<?php echo elgg_view('profile/owner_block'); ?> +		<?php echo elgg_view('profile/details'); ?> +	</div> +</div>
\ No newline at end of file  | 
