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.

Customising the CMS

using urlParams to view profile


Reply

3 Posts   2271 Views

Avatar
McBainVT

25 September 2009 at 7:27am Community Member, 5 Posts

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

26 September 2009 at 1:31pm Community Member, 528 Posts

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

Avatar
McBainVT

1 October 2009 at 5:46am Community Member, 5 Posts

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.