Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Customising the CMS /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

using urlParams to view profile


Go to End


3 Posts   6473 Views

Avatar
McBainVT

Community Member, 5 Posts

25 September 2009 at 7:27am

I have extended the member class using dataobjectdecorator successfully, created custom login, registration and edit profile pages; however I am having a little trouble figuring out how I would create a view profile page.

I have created a viewprofile.php and viewprofile.ss page, setup similar to what exists in the forum module. Here is what I have in my viewprofile.php page.

<code>
class ViewProfile extends Page {

}

class ViewProfile_Controller extends Page_Controller {

function init() {
$member = $this->Member() ? $this->Member() : null;
$usernameText = ($member) ? ($member->Username . '\'s ') : '';

$this->Title = $usernameText . 'User Profile';

parent::init();
}

function Member() {
$member = null;

if(is_numeric($this->urlParams['ID'])) {
$member = DataObject::get_by_id('Member', $this->urlParams['ID']);
} else {
$member = Member::currentUser();
}

return $member;
}

} </code>

Here is what I have in my viewprofile.ss

<code>
<% control Member %>
<h1>$Username&#39;s <% _t('PROFILE','Profile') %></h1>
<p><b>Username: </b>$Username</p>
<% if FirstName %>
<p><b>First Name: </b>$FirstName</p>
<% end_if %>
<% if Surname %>
<p><b>Last Name: </b>$Surname</p>
<% end_if %>
<% if Website %>
<p><b>Website: </b>$Website</p>
<% end_if %>
<% end_control %></code>

At this point if I go to www.url.com/viewprofile/ when I am logged in it will show my profile. However I havent figured out how to display other users profiles by using urlParams. www.url.com/viewprofile/1 or any ID number doesnt return anything but a blank page. So it seems I am having a bit of trouble figuring out how to use urlParams to pass a member ID.

I have looked through the documentation but could use some more explanation of how urlParams work and how I can create a view profile page that will display any members profile by simply adding an ID number like this "www.url.com/viewprofile/1" where 1 is the member ID number.

Any help would be greatly appreciated.

Avatar
zenmonkey

Community Member, 545 Posts

26 September 2009 at 1:31pm

I've been trying to find documentation as well. the recipes:page_action_id is blank which in theory should explain it :)

Avatar
McBainVT

Community Member, 5 Posts

1 October 2009 at 5:46am

Managed to get it working fine.

Here is the code for viewprofile.php

<?php

class ViewProfile extends Page {
	

}
 
class ViewProfile_Controller extends Page_Controller {
	
	function init() {
		
		$params = Director::urlParams(); 
   		$id = (int)$params['ID']; 

   		$member = DataObject::get_by_id('Member',$id); 
		
		$usernameText = ($member) ? ($member->Username . '\'s ') : '';
		
		$this->Title = $usernameText . 'User Profile';
		
		parent::init();
 	}
 
	
	
	function Member($id = null) { 
       
   	$params = Director::urlParams(); 
   	$id = (int)$params['ID']; 

   	$object = DataObject::get_by_id('Member',$id); 

   		if($object) { 
      		return $this 
         	->customise(array('Member' => $object)) 
         	->renderWith(array('ViewProfile', 'Page')); 
   		} else { 
      		Director::redirect(Director::absoluteBaseURL() . '404'); 
   		} 
	}     

	
}
 

?>

Here is the code for memberdecorator.php

<?php 

class MemberDecorator extends DataObjectDecorator { 

	function augmentSQL(SQLQuery &$query) {} 

	function extraStatics() { 
    
		return array( 
			'db' => array( 
				"Website" => "Text", 
      			"Username" => "Text"       
			), 
			'has_one' => array( 
				"Avatar" => "Image" 
			), 
		); 
	}

	function getCMSFields() { 
		$fields = parent::getCMSFields();
		$this->extend('updateCMSFields', $fields); 
		return $fields; 
	} 

	function updateCMSFields(FieldSet &$fields) { 
		$fields->push(new TextField("Username", "Username"), 'Members'); 
		$fields->push(new TextField("Website", "Website URL"), 'Members'); 
		$fields->push(new ImageField("Avatar", "Profile Image"), 'Members'); 
	}
	
	function Link() { 
      	return Director::absoluteBaseURL() . SSViewer::topLevel()->URLSegment . "/member/" . $this->ID; 
   	} 
	
}

?>

The code for viewprofile.ss is still the same. Hope this helps.