summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/contact/contact.module14
-rw-r--r--modules/user/user.api.php14
-rw-r--r--modules/user/user.module60
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];
+ }
+ }
}
/**