Index: bio.module
===================================================================
--- bio.module	(Revision 275)
+++ bio.module	(Arbeitskopie)
@@ -87,7 +87,7 @@ function bio_menu($may_cache) {
  * Implementation of hook_form_alter().
  */
 function bio_form_alter($form_id, &$form) {
-  if ($form_id == bio_get_type() .'_node_form' && arg(0) == 'user') {
+  if (arg(0) == 'user' && $form_id == bio_get_type() .'_node_form' && (!variable_get('bio_edit_form', 0) || !module_exists('subform_element'))) {
     // We're editing the bio in the user area... be sure we end up here when we
     // finish submission, and disallow changing the author.
     $account = user_load(array('uid' => arg(1)));
@@ -266,7 +266,7 @@ function bio_nodeapi(&$node, $op, $a3 = 
  */
 function bio_user($op, &$edit, &$account, $category = NULL) {
   // If there's no bio for this user, nothing to do here.
-  if ($op != 'register' &&  $op != 'insert' && !$nid = bio_for_user($account->uid)) {
+  if ($op == 'view' && !$nid = bio_for_user($account->uid)) {
     return;
   }
 
@@ -298,11 +298,39 @@ function bio_user($op, &$edit, &$account
       // Display CCK fields on the user registration form, if they've been
       // marked as such.
       return bio_user_register_form();
-      break;
+
+    case 'form':
+      // Display bio node form on user account form, if enabled.
+      if (!variable_get('bio_edit_form', 0) || !module_exists('subform_element')) {
+        return;
+      }
+      $type = bio_get_type();
+      // Edit existing bio node.
+      if ($nid = bio_for_user($account->uid)) {
+        $node = node_load($nid);
+        $access = node_access('update', $node);
+      }
+      // Create new bio node.
+      else {
+        $node = (object)array('type' => $type, 'uid' => $account->uid, 'name' => $account->name);
+        $access = ($user->uid == $account->uid && node_access('create', $type)) || user_access('administer nodes');
+      }
+      if ($access) {
+        $form['bio_node'] = array(
+          '#type' => 'subform',
+          '#id' => $type .'_node_form',
+          '#arguments' => array($node),
+          '#data_separation' => TRUE,
+          '#weight' => 20,
+          #'#extra_form' => array('#post' => array()),
+        );
+        // Prepend subform_element form submit handler for bio node.
+        $form['#submit'] = array('subform_element_submit' => array()) + (array)$form['#submit'];
+      }
+      return $form;
 
     case 'insert':
       return bio_user_register_submit($edit);
-      break;
   }
 }
 
@@ -337,12 +365,18 @@ function bio_link($type, $node = NULL, $
  *   Node ID of bio, or FALSE if no bio node was found.
  */
 function bio_for_user($uid = NULL) {
+  static $nid;
+
+  if (isset($nid)) {
+    return $nid;
+  }
   if (is_null($uid)) {
     global $user;
     $uid = $user->uid;
   }
 
-  return db_result(db_query('SELECT nid FROM {bio} WHERE uid = %d', $uid));
+  $nid = db_result(db_query('SELECT nid FROM {bio} WHERE uid = %d', $uid));
+  return $nid;
 }
 
 /**
@@ -384,13 +418,24 @@ function bio_settings() {
     '#description' => t('Display nothing but the bio node on the user profile page.'),
     '#default_value' => variable_get('bio_profile_takeover', 0),
   );
+  $form['bio_edit_form'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Show fields on user account edit form'),
+    '#return_value' => 1,
+    '#default_value' => variable_get('bio_edit_form', 0),
+    '#description' => t('Enable this option to display bio fields on the user account edit form. This will automatically create or update a bio record for a user when they edit their user account.'),
+  );
+  if (!module_exists('subform_element')) {
+    $form['bio_edit_form']['#disabled'] = TRUE;
+    $form['bio_edit_form']['#description'] .= '<br />'. t('This feature requires the <a href="!subform-link">Subform Element</a> module.', array('!subform-link' => 'http://drupal.org/project/subform_element'));
+  }
 
   // Show fields on the registration form.
   if (module_exists('content')) {
     $form['bio_regstration_form'] = array(
-      '#type' => 'radios',
+      '#type' => 'checkbox',
       '#title' => t('Show fields on registration form'),
-      '#options' => array(t('Disabled'), t('Enabled')),
+      '#return_value' => 1,
       '#default_value' => variable_get('bio_regstration_form', 0),
       '#description' => t('Enable this option to display bio fields on the user registration form. This will automatically create a bio record for a user when they register.'),
     );
