Skip to Content

Add Block Regions to your User Profile page in Drupal 5 and 6

Tags

Here's a small snippet to allow the output of blocks in your user profiles. This is assuming that you are currently over-riding the user page with the following code.
Update!I've added code for both Drupal 5 and 6, take a look.

Drupal 5


<?php
/**
* Catch the theme_user_profile function, and redirect through the template api
*/
function phptemplate_user_profile($user, $fields = array()) {
// Pass to phptemplate, including translating the parameters to an associative array. The element names are the names that the variables
// will be assigned within your template.
/* potential need for other code to extract field info */
return _phptemplate_callback('user_profile', array('user' => $user, 'fields' => $fields));
}
?>

(Code from: http://drupal.org/node/35728 )

and have your user_profile.tpl.php named as so.

Settings up your block regions:

First we'll slip into our theme's template.php file and make sure we create a new region.

<?php
function basic_regions() {
return array(
'sidebar_left' => t('left sidebar'),
'sidebar_right' => t('right sidebar'),
'content_top' => t('content top'),
'content_bottom' => t('content bottom'),
'header' => t('header'),
'footer_block' => t('footer'),
'profile_block' => t('profile blocks'),
);
}
?>

This allows us to create a new region called profile block which will hold all our blocks that we decide to put there. Now we want to be able to pass the $profile_block variable onto our user_profile.tpl.php to be outputted.

Adding the Block variables:


<?php
function _phptemplate_variables($hook, $vars = array()) {
switch ($hook) {
case 'user_profile':
$vars['profile_block'] = theme('blocks', 'profile_block');
break;
}
return $vars;
}
?>

Now we can go into our user_profile.tpl.php and add the following code anywhere in the file. This is where our newly created block region will be outputted.

<?php
echo $profile_block;
?>

Drupal 6

In your themename.info file (themename being replaced by your actual theme name) add your block region.

(In our themename.info)

<?php
regions[profile_block] = Profile Block
?>

We now create our user-profile.tpl.php file where we will output the block region and any other profile information that we need. To expose the $profile_block variable to our user-profile.tpl.php, we add the following code to our template.php file:

(In our template.php)

<?php
function phptemplate_preprocess_user_profile(&$variables) {
$variables['profile'] = array();
// Sort sections by weight
uasort($variables['account']->content, 'element_sort');
// Provide keyed variables so themers can print each section independantly.
foreach (element_children($variables['account']->content) as $key) {
$variables['profile'][$key] = drupal_render($variables['account']->content[$key]);
}
// Collect all profiles to make it easier to print all items at once.
$variables['user_profile'] = implode($variables['profile']);
$variables['profile_block'] = theme('blocks', 'profile_block');
}
?>

( Structure taken from: http://api.drupal.org/api/function/template_preprocess_user_profile/6 )
Note the added $variables['profile_block'] = theme('blocks', 'profile_block'); at the end. This allows us to access the block region, profile_block, by echoing out $profile_block in our user-profile.tpl.php file like so:

(In our user-profile.tpl.php)

<?php
echo $profile_block;
?>

Voila! Block regions in our user profile template file!

Great, worked seamlessly and compatible with my Drupal 6.1 too. That was one easy and good step by step guide and followed the change provided by TC to solve duplicate definition error and suggest to mention it in your original post too.

Great Post having enough information about drupal.6 ..m really impressed

Nice Tutorial and good Posting

Good tutorial, really informative one!
A student can learn so much from this example;
Drupal blocks are very important with the concern of database;

regards,

Matt John
I have started work at home to earn money!

This it a nice example, thank you for the nice tipp

Thanks Mate!

I solved a big question with this tutorial :-)

Thanks so much for this tip! It really helped me a ton!

Great tutorial, I think this is what I need to add "latest posts by this user" to the profile page. Any ideas how I might do this? Sorry quickly getting lost in all this...
A xx

Thanks for the tip. Found I needed just the thing tonight.

I found that with drupal 6.3, my methods in template.php all start with phptemplate for whatever reason.

so - using this method name - template_preprocess_user_profile - produced a duplicate definition error, but by prepending the php - ala: 'phptemplate_preprocess_user_profile', it worked like a charm.

Thanks for the original post!

Totally correct. "template" should be replaced with your current theme name or "phptemplate". I guess I should define that a bit more. thanks for the catch!

Yes, a nice tutorial that should expand my knowledge and skill. Will give this a go.

Thank You!

Is this example Drupal 6 compatible ?

Hey,

I've updated the post to include Drupal 6 compatibility.

a nice example on how to provide new regions to a specific template file, thanks :)

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h3> <h2> <br/>
  • Lines and paragraphs break automatically.

More information about formatting options