Index: modules/contact/contact.module =================================================================== RCS file: /cvs/drupal/drupal/modules/contact/contact.module,v retrieving revision 1.145 diff -u -p -r1.145 contact.module --- modules/contact/contact.module 26 Feb 2010 18:35:35 -0000 1.145 +++ modules/contact/contact.module 19 Mar 2010 10:32:24 -0000 @@ -168,13 +168,6 @@ function contact_load($cid) { } /** - * Implements hook_user_insert(). - */ -function contact_user_insert(&$edit, $account, $category) { - $edit['contact'] = variable_get('contact_default_status', 1); -} - -/** * Implements hook_mail(). */ function contact_mail($key, &$message, $params) { @@ -241,6 +234,13 @@ function contact_form_user_profile_form_ } /** + * Implements hook_user_presave(). + */ +function contact_user_presave(&$edit, $account, $category) { + $edit['data']['contact'] = isset($edit['contact']) ? $edit['contact'] : variable_get('contact_default_status', 1); +} + +/** * Implement of hook_form_FORM_ID_alter(). * * Add the default personal contact setting on the user settings page. Index: modules/user/user.api.php =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.api.php,v retrieving revision 1.21 diff -u -p -r1.21 user.api.php --- modules/user/user.api.php 12 Mar 2010 15:56:30 -0000 1.21 +++ modules/user/user.api.php 19 Mar 2010 10:32:25 -0000 @@ -198,10 +198,8 @@ function hook_user_categories() { * * This hook is primarily intended for modules that want to store properties in * the serialized {users}.data column, which is automatically loaded whenever a - * user account object is loaded, and the module needs to prepare the stored - * data in some way. - * The module should save its custom additions to the user object into the - * database and set the saved fields to NULL in $edit. + * user account object is loaded, modules may add to $edit['data'] in order + * to have their data serialized on save. * * @param &$edit * The array of form values submitted by the user. @@ -216,9 +214,7 @@ function hook_user_categories() { function hook_user_presave(&$edit, $account, $category) { // Make sure that our form value 'mymodule_foo' is stored as 'mymodule_bar'. if (isset($edit['mymodule_foo'])) { - $edit['mymodule_bar'] = $edit['mymodule_foo']; - // Inform user_save() to ignore the value of our property. - $edit['mymodule_foo'] = NULL; + $edit['data']['my_module_foo'] = $edit['my_module_foo']; } } @@ -226,7 +222,7 @@ function hook_user_presave(&$edit, $acco * A user account was created. * * The module should save its custom additions to the user object into the - * database and set the saved fields to NULL in $edit. + * database. * * @param &$edit * The array of form values submitted by the user. @@ -245,8 +241,6 @@ function hook_user_insert(&$edit, $accou 'uid' => $account->uid, )) ->execute(); - // Inform user_save() to ignore the value of our property. - $edit['myfield'] = NULL; } /** Index: modules/user/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/user/user.module,v retrieving revision 1.1137 diff -u -p -r1.1137 user.module --- modules/user/user.module 18 Mar 2010 06:43:41 -0000 1.1137 +++ modules/user/user.module 19 Mar 2010 10:32:26 -0000 @@ -345,7 +345,6 @@ function user_save($account, $edit = arr $transaction = db_transaction(); try { $table = drupal_get_schema('users'); - $user_fields = $table['fields']; if (!empty($edit['pass'])) { // Allow alternate password hashing schemes. @@ -369,37 +368,22 @@ function user_save($account, $edit = arr if (!isset($account->is_new)) { $account->is_new = empty($account->uid); } - + // Prepopulate $edit['data'] with the current value of $account->data. + // Modules can add to or remove from this array in hook_user_presave(). + if (!empty($account->data)) { + $data = unserialize($account->data); + foreach ($data as $key => $value) { + $edit['data'][$key] = $value; + } + } user_module_invoke('presave', $edit, $account, $category); if (is_object($account) && !$account->is_new) { - $data = unserialize(db_query('SELECT data FROM {users} WHERE uid = :uid', array(':uid' => $account->uid))->fetchField()); // Consider users edited by an administrator as logged in, if they haven't // already, so anonymous users can view the profile (if allowed). if (empty($edit['access']) && empty($account->access) && user_access('administer users')) { $edit['access'] = REQUEST_TIME; } - // Find the fields attached to this user. - $field_names = array(); - list(, , $bundle) = entity_extract_ids('user', (object) $edit); - foreach (field_info_instances('user', $bundle) as $instance) { - $field = field_info_field_by_id($instance['field_id']); - $field_names[] = $field['field_name']; - } - - foreach ($edit as $key => $value) { - // Form fields that don't pertain to the users, user_roles, or - // Field API are automatically serialized into the users.data - // column. - if (!in_array($key, array('roles', 'is_new', 'current_pass_required_values', 'current_pass')) && empty($user_fields[$key]) && empty($field_names[$key])) { - if ($value === NULL) { - unset($data[$key]); - } - else { - $data[$key] = $value; - } - } - } // Process picture uploads. if (!empty($edit['picture']->fid)) { @@ -422,7 +406,6 @@ function user_save($account, $edit = arr } $edit['picture'] = empty($edit['picture']->fid) ? 0 : $edit['picture']->fid; - $edit['data'] = $data; // Do not allow 'uid' to be changed. $edit['uid'] = $account->uid; // Save changes to the user table. @@ -522,22 +505,6 @@ function user_save($account, $edit = arr user_module_invoke('insert', $edit, $user, $category); entity_invoke('insert', 'user', $user); - // Note, we wait with saving the data column to prevent module-handled - // fields from being saved there. - $data = array(); - foreach ($edit as $key => $value) { - // Form fields that don't pertain to the users, user_roles, or - // Field API are automatically serialized into the user.data - // column. - if ((!in_array($key, array('roles', 'is_new'))) && (empty($user_fields[$key]) && empty($field_form[$key])) && ($value !== NULL)) { - $data[$key] = $value; - } - } - if (!empty($data)) { - $data_array = array('uid' => $user->uid, 'data' => $data); - drupal_write_record('users', $data_array, 'uid'); - } - // Save user roles. if (isset($edit['roles']) && is_array($edit['roles'])) { $query = db_insert('users_roles')->fields(array('uid', 'rid')); @@ -1156,15 +1123,18 @@ function user_user_presave(&$edit, $acco elseif (!empty($edit['picture_delete'])) { $edit['picture'] = NULL; } - // Remove these values so they don't end up serialized in the data field. - $edit['picture_upload'] = NULL; - $edit['picture_delete'] = NULL; - // Prepare user roles. if (isset($edit['roles'])) { $edit['roles'] = array_filter($edit['roles']); } } + + // Move account cancellation information into $user->data. + foreach (array('user_cancel_method', 'user_cancel_notify') as $key) { + if (isset($edit[$key])) { + $edit['data'][$key] = $edit[$key]; + } + } } /**