#144397: Use drupal_render for user profiles and convert to themer-friendly .tpl.php files.
parent
aa308028aa
commit
e7d31327cf
|
@ -48,11 +48,12 @@ function blog_access($op, $node) {
|
||||||
*/
|
*/
|
||||||
function blog_user($type, &$edit, &$user) {
|
function blog_user($type, &$edit, &$user) {
|
||||||
if ($type == 'view' && user_access('edit own blog', $user)) {
|
if ($type == 'view' && user_access('edit own blog', $user)) {
|
||||||
$items['blog'] = array('title' => t('Blog'),
|
$user->content['summary']['blog'] = array(
|
||||||
'value' => l(t('View recent blog entries'), "blog/$user->uid", array('title' => t("Read @username's latest blog entries.", array('@username' => $user->name)))),
|
'#type' => 'user_profile_item',
|
||||||
'class' => 'blog',
|
'#title' => t('Blog'),
|
||||||
|
'#value' => l(t('View recent blog entries'), "blog/$user->uid", array('title' => t("Read @username's latest blog entries.", array('@username' => $user->name)))),
|
||||||
|
'#attributes' => array('class' => 'blog'),
|
||||||
);
|
);
|
||||||
return array(t('History') => $items);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -575,7 +575,7 @@ function profile_view_field($user, $field) {
|
||||||
&& (user_access('administer users') || $field->visibility != PROFILE_PRIVATE)
|
&& (user_access('administer users') || $field->visibility != PROFILE_PRIVATE)
|
||||||
&& !empty($field->page);
|
&& !empty($field->page);
|
||||||
|
|
||||||
if ($value = $user->{$field->name}) {
|
if (isset($user->{$field->name}) && $value = $user->{$field->name}) {
|
||||||
switch ($field->type) {
|
switch ($field->type) {
|
||||||
case 'textarea':
|
case 'textarea':
|
||||||
return check_markup($value);
|
return check_markup($value);
|
||||||
|
@ -612,7 +612,7 @@ function profile_view_field($user, $field) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function profile_view_profile($user) {
|
function profile_view_profile(&$user) {
|
||||||
|
|
||||||
profile_load_profile($user);
|
profile_load_profile($user);
|
||||||
|
|
||||||
|
@ -628,14 +628,24 @@ function profile_view_profile($user) {
|
||||||
while ($field = db_fetch_object($result)) {
|
while ($field = db_fetch_object($result)) {
|
||||||
if ($value = profile_view_field($user, $field)) {
|
if ($value = profile_view_field($user, $field)) {
|
||||||
$title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL;
|
$title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL;
|
||||||
$item = array('title' => $title,
|
|
||||||
'value' => $value,
|
// Create a single fieldset for each category.
|
||||||
'class' => $field->name,
|
if (!isset($user->content[$field->category])) {
|
||||||
|
$user->content[$field->category] = array(
|
||||||
|
'#type' => 'user_profile_category',
|
||||||
|
'#title' => check_plain($field->category),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user->content[$field->category][$field->name] = array(
|
||||||
|
'#type' => 'user_profile_item',
|
||||||
|
'#title' => check_plain($title),
|
||||||
|
'#value' => check_markup($value),
|
||||||
|
'#weight' => $field->weight,
|
||||||
|
'#attributes' => array('class' => 'profile-'. $field->name),
|
||||||
);
|
);
|
||||||
$fields[$field->category][$field->name] = $item;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $fields;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function _profile_form_explanation($field) {
|
function _profile_form_explanation($field) {
|
||||||
|
@ -666,7 +676,7 @@ function profile_form_profile($edit, $user, $category, $register = FALSE) {
|
||||||
case 'url':
|
case 'url':
|
||||||
$fields[$category][$field->name] = array('#type' => 'textfield',
|
$fields[$category][$field->name] = array('#type' => 'textfield',
|
||||||
'#title' => check_plain($field->title),
|
'#title' => check_plain($field->title),
|
||||||
'#default_value' => $edit[$field->name],
|
'#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '',
|
||||||
'#maxlength' => 255,
|
'#maxlength' => 255,
|
||||||
'#description' => _profile_form_explanation($field),
|
'#description' => _profile_form_explanation($field),
|
||||||
'#required' => $field->required,
|
'#required' => $field->required,
|
||||||
|
|
|
@ -44,10 +44,16 @@
|
||||||
float: right; /* LTR */
|
float: right; /* LTR */
|
||||||
margin: 0 1em 1em 0; /* LTR */
|
margin: 0 1em 1em 0; /* LTR */
|
||||||
}
|
}
|
||||||
|
.profile h3 {
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
.profile dl {
|
||||||
|
margin: 0 0 1.5em 0;
|
||||||
|
}
|
||||||
.profile dt {
|
.profile dt {
|
||||||
margin: 1em 0 0.2em 0;
|
margin: 0 0 0.2em 0;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.profile dd {
|
.profile dd {
|
||||||
margin:0;
|
margin: 0 0 1em 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,16 @@ function user_theme() {
|
||||||
'arguments' => array('account' => NULL),
|
'arguments' => array('account' => NULL),
|
||||||
),
|
),
|
||||||
'user_profile' => array(
|
'user_profile' => array(
|
||||||
'arguments' => array('account' => NULL, 'fields' => NULL),
|
'arguments' => array('account' => NULL),
|
||||||
|
'file' => 'user_profile',
|
||||||
|
),
|
||||||
|
'user_profile_category' => array(
|
||||||
|
'arguments' => array('element' => NULL),
|
||||||
|
'file' => 'user_profile_category',
|
||||||
|
),
|
||||||
|
'user_profile_item' => array(
|
||||||
|
'arguments' => array('element' => NULL),
|
||||||
|
'file' => 'user_profile_item',
|
||||||
),
|
),
|
||||||
'user_list' => array(
|
'user_list' => array(
|
||||||
'arguments' => array('users' => NULL, 'title' => NULL),
|
'arguments' => array('users' => NULL, 'title' => NULL),
|
||||||
|
@ -512,14 +521,26 @@ function user_search($op = 'search', $keys = NULL, $skip_access_check = FALSE) {
|
||||||
/**
|
/**
|
||||||
* Implementation of hook_user().
|
* Implementation of hook_user().
|
||||||
*/
|
*/
|
||||||
function user_user($type, &$edit, &$user, $category = NULL) {
|
function user_user($type, &$edit, &$account, $category = NULL) {
|
||||||
if ($type == 'view') {
|
if ($type == 'view') {
|
||||||
$items['history'] = array('title' => t('Member for'),
|
$account->content['user_picture'] = array(
|
||||||
'value' => format_interval(time() - $user->created),
|
'#value' => theme('user_picture', $account),
|
||||||
'class' => 'member',
|
'#weight' => -10,
|
||||||
|
);
|
||||||
|
if (!isset($account->content['summary'])) {
|
||||||
|
$account->content['summary'] = array();
|
||||||
|
}
|
||||||
|
$account->content['summary'] += array(
|
||||||
|
'#type' => 'user_profile_category',
|
||||||
|
'#attributes' => array('class' => 'user-member'),
|
||||||
|
'#weight' => -5,
|
||||||
|
'#title' => t('History'),
|
||||||
|
);
|
||||||
|
$account->content['summary']['member_for'] = array(
|
||||||
|
'#type' => 'user_profile_item',
|
||||||
|
'#title' => t('Member for'),
|
||||||
|
'#value' => format_interval(time() - $account->created),
|
||||||
);
|
);
|
||||||
|
|
||||||
return array(t('History') => $items);
|
|
||||||
}
|
}
|
||||||
if ($type == 'form' && $category == 'account') {
|
if ($type == 'form' && $category == 'account') {
|
||||||
$form_state = array();
|
$form_state = array();
|
||||||
|
@ -701,38 +722,6 @@ function theme_user_picture($account) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Theme a user page
|
|
||||||
* @param $account the user object
|
|
||||||
* @param $fields a multidimensional array for the fields, in the form of array (
|
|
||||||
* 'category1' => array(item_array1, item_array2), 'category2' => array(item_array3,
|
|
||||||
* .. etc.). Item arrays are formatted as array(array('title' => 'item title',
|
|
||||||
* 'value' => 'item value', 'class' => 'class-name'), ... etc.). Module names are incorporated
|
|
||||||
* into the CSS class.
|
|
||||||
*
|
|
||||||
* @ingroup themeable
|
|
||||||
*/
|
|
||||||
function theme_user_profile($account, $fields) {
|
|
||||||
$output = '<div class="profile">';
|
|
||||||
$output .= theme('user_picture', $account);
|
|
||||||
foreach ($fields as $category => $items) {
|
|
||||||
if (strlen($category) > 0) {
|
|
||||||
$output .= '<h2 class="title">'. $category .'</h2>';
|
|
||||||
}
|
|
||||||
$output .= '<dl>';
|
|
||||||
foreach ($items as $item) {
|
|
||||||
if (isset($item['title'])) {
|
|
||||||
$output .= '<dt class="'. $item['class'] .'">'. $item['title'] .'</dt>';
|
|
||||||
}
|
|
||||||
$output .= '<dd class="'. $item['class'] .'">'. $item['value'] .'</dd>';
|
|
||||||
}
|
|
||||||
$output .= '</dl>';
|
|
||||||
}
|
|
||||||
$output .= '</div>';
|
|
||||||
|
|
||||||
return $output;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a list of users.
|
* Make a list of users.
|
||||||
* @param $items an array with user objects. Should contain at least the name and uid
|
* @param $items an array with user objects. Should contain at least the name and uid
|
||||||
|
@ -1671,24 +1660,32 @@ function user_edit_submit($form, &$form_state) {
|
||||||
function user_view($account) {
|
function user_view($account) {
|
||||||
global $user;
|
global $user;
|
||||||
|
|
||||||
|
// Retrieve all profile fields and store data in content element.
|
||||||
|
$account->content = user_build_content($account);
|
||||||
drupal_set_title(check_plain($account->name));
|
drupal_set_title(check_plain($account->name));
|
||||||
// Retrieve and merge all profile fields:
|
/**
|
||||||
$fields = array();
|
* To theme user profiles, copy modules/user/user_profile.tpl.php
|
||||||
foreach (module_list() as $module) {
|
* to your theme directory, and edit it as instructed in that file's comments.
|
||||||
if ($data = module_invoke($module, 'user', 'view', '', $account)) {
|
*/
|
||||||
foreach ($data as $category => $items) {
|
return theme('user_profile', $account);
|
||||||
foreach ($items as $key => $item) {
|
|
||||||
$item['class'] = "$module-". $item['class'];
|
|
||||||
$fields[$category][$key] = $item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drupal_alter('profile', $fields, $account);
|
/**
|
||||||
|
* Builds a structured array representing the profile content.
|
||||||
|
*
|
||||||
|
* @param $account
|
||||||
|
* A user object.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A structured array containing the individual elements of the profile.
|
||||||
|
*/
|
||||||
|
function user_build_content($account) {
|
||||||
|
$edit = NULL;
|
||||||
|
user_module_invoke('view', $edit, $account);
|
||||||
|
// Allow modules to modify the fully-built profile.
|
||||||
|
drupal_alter('profile', $edit, $account);
|
||||||
|
|
||||||
drupal_set_title(check_plain($account->name));
|
return $account->content;
|
||||||
return theme('user_profile', $account, $fields);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*** Administrative features ***********************************************/
|
/*** Administrative features ***********************************************/
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In order to customize user profiles, replace the HTML below with your own
|
||||||
|
* wrapper and then sprinkle drupal_render($account->content[foo]) calls
|
||||||
|
* where you need each piece of data to appear. Replace the 'foo' in the
|
||||||
|
* example above with the element that is desired such as
|
||||||
|
* drupal_render($account->content['summary']['member_for']).
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Uncomment the line below to see what data is available in this template.
|
||||||
|
# print '<pre>'. check_plain(print_r($account->content, 1)) .'</pre>';
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="profile">
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// The following line should always be the last PHP in this file. Do not remove.
|
||||||
|
print drupal_render($account->content);
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
</div>
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?php if ($element['#title']): ?>
|
||||||
|
<h3><?php print $element['#title'] ?></h3>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<dl<?php (isset($element['#attributes']) ? print drupal_attributes($element['#attributes']) : '') ?>>
|
||||||
|
<?php print $element['#children'] ?>
|
||||||
|
</dl>
|
|
@ -0,0 +1,5 @@
|
||||||
|
<?php
|
||||||
|
$attributes = isset($element['#attributes']) ? ' '. drupal_attributes($element['#attributes']) : '';
|
||||||
|
?>
|
||||||
|
<dt<?php print $attributes ?>><?php print $element['#title'] ?></dt>
|
||||||
|
<dd<?php print $attributes ?>><?php print $element['#value'] ?></dd>
|
|
@ -867,6 +867,31 @@ html.js fieldset.collapsed legend a {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User profiles.
|
||||||
|
*/
|
||||||
|
.profile {
|
||||||
|
margin-top: 1.5em;
|
||||||
|
}
|
||||||
|
.profile h3 {
|
||||||
|
border-bottom: 0;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
.profile dl {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.profile dt {
|
||||||
|
font-weight: normal;
|
||||||
|
color: #898989;
|
||||||
|
font-size: 0.92em;
|
||||||
|
line-height: 1.3em;
|
||||||
|
margin-top: 1.4em;
|
||||||
|
margin-bottom: 0.45em;
|
||||||
|
}
|
||||||
|
.profile dd {
|
||||||
|
margin-bottom: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Admin Styles
|
* Admin Styles
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<div class="profile-category">
|
||||||
|
<?php if ($element['#title']): ?>
|
||||||
|
<h3><?php print $element['#title'] ?></h3>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<dl<?php (isset($element['#attributes']) ? print drupal_attributes($element['#attributes']) : '') ?>>
|
||||||
|
<?php print $element['#children'] ?>
|
||||||
|
</dl>
|
||||||
|
</div>
|
Loading…
Reference in New Issue