? access_4.patch.txt
? files
? formpull_11.patch
? mw.patch
? patch
? tmp.patch
? modules/user/mw.patch
Index: modules/blog/blog.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/blog/blog.module,v
retrieving revision 1.280
diff -u -F^f -r1.280 blog.module
--- modules/blog/blog.module	30 Apr 2007 17:03:23 -0000	1.280
+++ modules/blog/blog.module	14 Jun 2007 14:35:53 -0000
@@ -48,11 +48,12 @@ function blog_access($op, $node) {
  */
 function blog_user($type, &$edit, &$user) {
   if ($type == 'view' && user_access('edit own blog', $user)) {
-    $items['blog'] = array('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)))),
-      'class' => 'blog',
+    $user->content['summary']['blog'] =  array(
+      '#type' => 'user_profile_item',
+      '#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);
   }
 }
 
Index: modules/profile/profile.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/profile/profile.module,v
retrieving revision 1.205
diff -u -F^f -r1.205 profile.module
--- modules/profile/profile.module	9 Jun 2007 07:25:15 -0000	1.205
+++ modules/profile/profile.module	14 Jun 2007 14:35:53 -0000
@@ -575,7 +575,7 @@ function profile_view_field($user, $fiel
          && (user_access('administer users') || $field->visibility != PROFILE_PRIVATE)
          && !empty($field->page);
 
-  if ($value = $user->{$field->name}) {
+  if (isset($user->{$field->name}) && $value = $user->{$field->name}) {
     switch ($field->type) {
       case 'textarea':
         return check_markup($value);
@@ -612,7 +612,7 @@ function profile_view_field($user, $fiel
   }
 }
 
-function profile_view_profile($user) {
+function profile_view_profile(&$user) {
 
   profile_load_profile($user);
 
@@ -628,14 +628,24 @@ function profile_view_profile($user) {
   while ($field = db_fetch_object($result)) {
     if ($value = profile_view_field($user, $field)) {
       $title = ($field->type != 'checkbox') ? check_plain($field->title) : NULL;
-      $item = array('title' => $title,
-        'value' => $value,
-        'class' => $field->name,
+
+      // Create a single fieldset for each category.
+      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) {
@@ -666,7 +676,7 @@ function profile_form_profile($edit, $us
       case 'url':
         $fields[$category][$field->name] = array('#type' => 'textfield',
           '#title' => check_plain($field->title),
-          '#default_value' => $edit[$field->name],
+          '#default_value' => isset($edit[$field->name]) ? $edit[$field->name] : '',
           '#maxlength' => 255,
           '#description' => _profile_form_explanation($field),
           '#required' => $field->required,
Index: modules/user/user.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.css,v
retrieving revision 1.6
diff -u -F^f -r1.6 user.css
--- modules/user/user.css	27 May 2007 17:57:48 -0000	1.6
+++ modules/user/user.css	14 Jun 2007 14:35:53 -0000
@@ -44,10 +44,16 @@
   float: right; /* LTR */
   margin: 0 1em 1em 0; /* LTR */
 }
+.profile h3 {
+  border-bottom: 1px solid #ccc;
+}
+.profile dl {
+  margin: 0 0 1.5em 0;
+}
 .profile dt {
-  margin: 1em 0 0.2em 0;
+  margin: 0 0 0.2em 0;
   font-weight: bold;
 }
 .profile dd {
-  margin:0;
+  margin: 0 0 1em 0;
 }
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.797
diff -u -F^f -r1.797 user.module
--- modules/user/user.module	12 Jun 2007 20:37:07 -0000	1.797
+++ modules/user/user.module	14 Jun 2007 14:35:54 -0000
@@ -33,7 +33,16 @@ function user_theme() {
       'arguments' => array('account' => NULL),
     ),
     '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(
       'arguments' => array('users' => NULL, 'title' => NULL),
@@ -485,14 +494,26 @@ function user_search($op = 'search', $ke
 /**
  * Implementation of hook_user().
  */
-function user_user($type, &$edit, &$user, $category = NULL) {
+function user_user($type, &$edit, &$account, $category = NULL) {
   if ($type == 'view') {
-    $items['history'] = array('title' => t('Member for'),
-      'value' => format_interval(time() - $user->created),
-      'class' => 'member',
+    $account->content['user_picture'] = array(
+      '#value' => theme('user_picture', $account),
+      '#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') {
     $form_state = array();
@@ -675,38 +696,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.
  * @param $items an array with user objects. Should contain at least the name and uid
  *
@@ -1636,24 +1625,32 @@ function user_edit_submit($form, &$form_
 function user_view($account) {
   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));
-  // Retrieve and merge all profile fields:
-  $fields = array();
-  foreach (module_list() as $module) {
-    if ($data = module_invoke($module, 'user', 'view', '', $account)) {
-      foreach ($data as $category => $items) {
-        foreach ($items as $key => $item) {
-          $item['class'] = "$module-". $item['class'];
-          $fields[$category][$key] = $item;
-        }
-      }
-    }
-  }
+  /** 
+   * To theme user profiles, copy modules/user/user_profile.tpl.php
+   * to your theme directory, and edit it as instructed in that file's comments.
+   */
+  return theme('user_profile', $account);
+}
 
-  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 theme('user_profile', $account, $fields);
+  return $account->content;
 }
 
 /*** Administrative features ***********************************************/
Index: modules/user/user_profile.tpl.php
===================================================================
RCS file: modules/user/user_profile.tpl.php
diff -N modules/user/user_profile.tpl.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/user/user_profile.tpl.php	14 Jun 2007 14:35:54 -0000
@@ -0,0 +1,19 @@
+<?php
+
+/*
+ * In order to customize user profiles, replace the HTML here 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>';
+
+print '<div class="profile">';
+
+// The following line should always be the last PHP in this file. Do not remove.
+print drupal_render($account->content);
+
+print '</div>';
\ No newline at end of file
Index: modules/user/user_profile_category.tpl.php
===================================================================
RCS file: modules/user/user_profile_category.tpl.php
diff -N modules/user/user_profile_category.tpl.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/user/user_profile_category.tpl.php	14 Jun 2007 14:35:54 -0000
@@ -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>
Index: modules/user/user_profile_item.tpl.php
===================================================================
RCS file: modules/user/user_profile_item.tpl.php
diff -N modules/user/user_profile_item.tpl.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/user/user_profile_item.tpl.php	14 Jun 2007 14:35:54 -0000
@@ -0,0 +1,9 @@
+<?php
+
+if ($element['#title'] != '') {
+  $dt = (isset($element['#attributes']) ? drupal_attributes($element['#attributes']) : '') .'>'. $element['#title'];
+  $dd = (isset($element['#attributes']) ? drupal_attributes($element['#attributes']) : '') .'>' . $element['#value'];
+  ?>
+  <dt<?php print $dt ?></dt>
+  <dd<?php print $dd ?></dd>
+<?php } ?>
\ No newline at end of file
