diff options
author | Dries Buytaert <dries@buytaert.net> | 2010-03-20 14:55:06 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2010-03-20 14:55:06 +0000 |
commit | 3b3f0966682cb69c5d701bb7d8f56fd3f479a961 (patch) | |
tree | a1ec13540dc355daedecc452d269616603feeee0 /modules | |
parent | 883a870160354fae729e91293ab6cc7399f3e85c (diff) | |
download | brdo-3b3f0966682cb69c5d701bb7d8f56fd3f479a961.tar.gz brdo-3b3f0966682cb69c5d701bb7d8f56fd3f479a961.tar.bz2 |
- Patch #721436 by catch, chx, moshe weitzman: remove magical fairy saving of cruft from user_save().
Diffstat (limited to 'modules')
-rw-r--r-- | modules/contact/contact.module | 14 | ||||
-rw-r--r-- | modules/user/user.api.php | 14 | ||||
-rw-r--r-- | modules/user/user.module | 60 |
3 files changed, 26 insertions, 62 deletions
diff --git a/modules/contact/contact.module b/modules/contact/contact.module index 2bbf816bf..183a45c2b 100644 --- a/modules/contact/contact.module +++ b/modules/contact/contact.module @@ -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_alter(&$form, &$form_state) { } /** + * 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. diff --git a/modules/user/user.api.php b/modules/user/user.api.php index 07f28611c..2200555dd 100644 --- a/modules/user/user.api.php +++ b/modules/user/user.api.php @@ -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, $account, $category) { * 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, $account, $category) { 'uid' => $account->uid, )) ->execute(); - // Inform user_save() to ignore the value of our property. - $edit['myfield'] = NULL; } /** diff --git a/modules/user/user.module b/modules/user/user.module index 7d56d9bae..ec2d7d0d0 100644 --- a/modules/user/user.module +++ b/modules/user/user.module @@ -345,7 +345,6 @@ function user_save($account, $edit = array(), $category = 'account') { $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 = array(), $category = 'account') { 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 = array(), $category = 'account') { } $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 = array(), $category = 'account') { 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, $account, $category) { 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]; + } + } } /** |