You are here

user.inc in User Import 7.3

File

supported/user.inc
View source
<?php

/**
 * @todo move contact options to separate contact.inc
 */

/**
 * Implementation of hook_user_import_form_field_match().
 */
function user_user_import_form_field_match() {
  $options = array();
  $options['user']['email'] = t('Email Address*');
  $options['user']['password'] = t('Password');
  $options['user']['roles'] = t('Roles');
  $options['user']['created'] = t('Account Creation Date');

  // $options['user']['username'] = t('Username');
  // $options['user']['uid'] = t('UID');
  // $options['user']['modified'] = t('Modified');
  // $options['user']['picture_uri'] = t('Picture');
  // $options['user']['timezone'] = t('Timezone');
  // $options['user']['md5_password'] = t('Password MD5');
  return $options;
}

/**
 * Implementation of hook_user_import_form_fieldsets().
 */
function user_user_import_form_fieldset($import, $collapsed) {
  $form = array();
  user_user_import_edit_roles_fields($form, $import, $collapsed);
  user_user_import_edit_email_fields($form, $import, $collapsed);
  return $form;
}

/**
 * Implementation of hook_user_import_form_update_user().
 */
function user_user_import_form_update_user() {
  $form['roles'] = array(
    'title' => t('Roles'),
    'description' => t('Affected: roles assigned to user.'),
  );
  $form['password'] = array(
    'title' => t('Password'),
    'description' => t('Affected: password.'),
    'exclude_add' => TRUE,
  );
  $form['contact'] = array(
    'title' => t('Contact'),
    'description' => t('Affected: user contact option.'),
    'exclude_add' => TRUE,
  );
  return $form;
}

/**
 * Implementation of hook_user_import_data().
 *
 * @param $settings
 * @param $update_setting
 *    TRUE if "Update existing users" is set to "Replace data" or "Update  data"
 *    for at least one item.
 * @param $column_settings
 * @param $module
 * @param $field_id
 * @param $colum_id
 */
function user_user_import_data($settings, $update_setting, $column_settings, $module, $field_id, $data, $column_id) {
  if ($module != 'user') {
    return;
  }
  if ($field_id == 'email') {
    $value = trim($data[$column_id]);
    if (!empty($settings['options']['email_domain'])) {
      $value .= $settings['options']['email_domain'];
    }
    _user_import_validate_email($value, $update_setting);
  }
  if ($field_id == 'password') {
    $value = trim($data[$column_id]);
  }
  if ($field_id == 'created') {
    $value = trim($data[$column_id]);
    if (!empty($value) && !is_numeric($value)) {
      $parsed = date_parse($value);
      $timestamp = mktime($parsed['hour'], $parsed['minute'], $parsed['second'], $parsed['month'], $parsed['day'], $parsed['year']);
      if (!empty($timestamp) && is_numeric($timestamp)) {
        $value = $timestamp;
      }
    }
  }
  if ($field_id == 'roles') {
    $value = user_user_import_roles_data($data[$column_id], $settings['roles_new']);
  }
  return $value;
}

/**
 * Implementation of hook_user_import_pre_save().
 */
function user_user_import_pre_save($settings, $account, $fields, $errors, $update_setting_per_module) {
  $account_add['mail'] = $fields['user']['email'][0];
  if (!empty($account['uid'])) {

    // update roles
    switch ($update_setting_per_module['roles']) {
      case UPDATE_ADD:

        // include currently assigned roles
        foreach ($account['roles'] as $rid => $role_name) {
          $account_add['roles'][$rid] = $rid;
        }
      case UPDATE_REPLACE:

        // update roles
        if (!isset($account_add['roles'])) {
          $account_add['roles'] = array();
        }
        foreach ($settings['roles'] as $rid => $role_set) {
          if (!empty($role_set)) {
            $account_add['roles'][$rid] = $rid;
          }
        }
        break;
    }

    // update password
    if ($update_setting_per_module['password'] == UPDATE_REPLACE) {
      $account_add['pass'] = empty($fields['user']['password'][0]) ? user_password() : $fields['user']['password'][0];
    }
    else {
      $account_add['pass'] = "";
    }

    // update contact
    if ($update_setting_per_module['contact'] == UPDATE_REPLACE) {
      $account_add['contact'] = $settings['contact'];
    }
    else {
      $account_add['contact'] = isset($account['contact']) ? $account['contact'] : '';
    }
  }
  else {
    $account_add['timezone'] = variable_get('date_default_timezone', @date_default_timezone_get());
    $account_add['status'] = 1;
    $account_add['init'] = $fields['user']['email'][0];
    $account_add['pass'] = empty($fields['user']['password'][0]) ? user_password() : $fields['user']['password'][0];
    if (isset($fields['user']['created'][0]) && !empty($fields['user']['created'][0])) {
      $account_add['created'] = $fields['user']['created'][0];
    }
    $account_add['init'] = $fields['user']['email'][0];
    if (!empty($settings['options']['activate'])) {
      $account_add['access'] = time();
      $account_add['login'] = time();
    }

    // add selected roles
    foreach ($settings['roles'] as $rid => $role_set) {
      if (!empty($role_set)) {
        $account_add['roles'][$rid] = $rid;
      }
    }
  }
  return $account_add;
}

/**
 * Implementation of hook_user_import_after_save().
 */
function user_user_import_after_save($settings, $account, $password, $fields, $updated, $update_setting_per_module) {

  /**
   * @todo change hook_user_import_after_save() so that all changes to data are returned and saved in one hit.
   */
  $roles = isset($fields['user']['roles']) ? $fields['user']['roles'] : array();
  user_user_import_after_save_role($account, $settings['roles_new'], $account->roles, $roles);
}

/**
 * Role assign.
 */
function user_user_import_edit_roles_fields(&$form, $import, $collapsed) {
  if (!user_access('user import assign roles')) {
    return;
  }
  $roles = user_roles(TRUE);

  // remove 'authenticated user' always [2].
  unset($roles[2]);

  // roles selected
  if (!empty($import['roles'])) {
    foreach ($import['roles'] as $rid) {
      if ($rid != 0) {
        $roles_selected[] = $rid;
      }
    }
  }
  if (empty($roles_selected)) {
    $roles_selected[] = 2;
  }
  $form['role_selection'] = array(
    '#type' => 'fieldset',
    '#title' => t('Role Assign'),
    '#weight' => -80,
    '#collapsible' => TRUE,
    '#collapsed' => $collapsed,
  );
  $form['role_selection']['roles'] = array(
    '#title' => t('Assign Role(s) To All Users'),
    '#type' => 'checkboxes',
    '#options' => $roles,
    '#default_value' => $roles_selected,
    '#description' => t("Select which role(s) all imported users should be assigned. The role 'authenticated user' is assigned automatically."),
  );
  $form['role_selection']['roles_new'] = array(
    '#type' => 'checkbox',
    '#title' => t('Add New Roles'),
    '#default_value' => isset($import['roles_new']) ? $import['roles_new'] : 0,
    '#description' => t('Create imported role(s) that are not found and assign it to the user, in addition to any role(s) selected above. Warning: incorrect roles will be created if the incoming data includes typos.'),
  );
}
function user_user_import_edit_email_fields(&$form, $import, $collapsed) {
  $form['email_message'] = array(
    '#type' => 'fieldset',
    '#title' => t('Email Message'),
    '#description' => t('Welcome message to be sent to imported users. Leave blank to use the default !message. If an existing user account is updated no welcome email will be sent to that user. <strong>Note - if "Activate Accounts" option is enabled !login_url (one time login) will not work.</strong>', array(
      '!message' => l(t('message'), 'admin/config/people/accounts'),
    )),
    '#collapsible' => TRUE,
    '#collapsed' => $collapsed,
  );
  $form['email_message']['subject'] = array(
    '#type' => 'textfield',
    '#title' => t('Message Subject'),
    '#default_value' => isset($import['subject']) ? $import['subject'] : '',
    '#description' => t('Customize the subject of the welcome e-mail, which is sent to imported members.') . ' ' . t('Available variables are:') . ' !username, !site, !password, !uri, !uri_brief, !mailto, !date, !login_uri, !edit_uri, !login_url.',
    '#element_validate' => array(
      'user_import_send_email_subject_validate',
    ),
  );
  $form['email_message']['message'] = array(
    '#type' => 'textarea',
    '#title' => t('Message'),
    '#default_value' => isset($import['message']) ? $import['message'] : '',
    '#description' => t('Customize the body of the welcome e-mail, which is sent to imported members.') . ' ' . t('Available variables are:') . ' !username, !site, !password, !uri, !uri_brief, !mailto, !login_uri, !edit_uri, !login_url.',
    '#element_validate' => array(
      'user_import_send_email_message_validate',
    ),
  );
  $form['email_message']['message_format'] = array(
    '#type' => 'radios',
    '#title' => t('Email Format'),
    '#default_value' => isset($import['message_format']) ? $import['message_format'] : 0,
    '#options' => array(
      t('Plain Text'),
      t('HTML'),
    ),
  );
  $form['email_message']['message_css'] = array(
    '#type' => 'textarea',
    '#title' => t('CSS'),
    '#default_value' => isset($import['message_css']) ? $import['message_css'] : '',
    '#description' => t('Use if sending HTML formated email.'),
  );
}

/**
 * Helper function to validate email.
 *
 * @param $email
 *   The email address to validate.
 * @param $duplicates_allowed
 *   TRUE if "Update existing users" is set to "Replace data" or "Update  data"
 *   for at least one item.
 */
function _user_import_validate_email($email, $duplicates_allowed = FALSE) {
  if (empty($email)) {
    user_import_errors(t('no email'));
  }
  elseif (!valid_email_address($email)) {
    $nomail = variable_get('user_import_nomail', 'nomail');
    $domain = explode('@', $email)[1];
    if ($nomail == $domain) {
      return;
    }
    user_import_errors(t('invalid email'));
  }
  elseif (!$duplicates_allowed && _user_import_existing_uid($email)) {
    user_import_errors(t('duplicate email'));
  }
}
function user_user_import_roles_data($data, $new_roles_allowed) {
  $roles = array();
  if (empty($data)) {
    return;
  }
  $values = explode(',', $data);

  // check if any roles are specified that don't already exist
  $existing_roles = user_roles();
  foreach ($values as $piece) {
    $role = trim($piece);
    $unrecognised = array();
    if (!empty($role)) {

      // only add if role is recognized or adding new roles is allowed
      if (empty($new_roles_allowed) && !array_search($role, $existing_roles)) {
        $unrecognised[] = $role;
      }
      else {
        $roles[] = $role;
      }
    }
  }
  if (!empty($unrecognised)) {
    user_import_errors(t('The following unrecognised roles were specified:') . implode(',', $unrecognised));
  }
  return $roles;
}

/**
 * Return an existing user ID, if present, for a given email.
 */
function _user_import_existing_uid($email) {
  $sql = 'SELECT uid FROM {users} WHERE mail = :mail';
  $args = array(
    ':mail' => $email,
  );
  $uid = db_query_range($sql, 0, 1, $args)
    ->fetchField();
  return $uid;
}
function user_user_import_after_save_role($account, $new_roles_allowed, $account_roles, $roles) {
  $existing_roles = user_roles();

  // if roles were specified, add to existing roles
  $assign_roles = array();
  if (is_array($roles) && !empty($roles)) {
    foreach ($roles as $role) {
      if (!empty($role)) {
        $key = array_search($role, $existing_roles);
        if (!empty($new_roles_allowed) && empty($key)) {
          $key = db_insert('role')
            ->fields(array(
            'name' => $role,
          ))
            ->execute();
          $existing_roles[$key] = $role;
        }
        $assign_roles[$key] = $role;
      }
    }
    $need_update = FALSE;
    foreach ($assign_roles as $key => $role) {
      if (!isset($account_roles[$key])) {
        $need_update = TRUE;
        $account_roles[$key] = $role;
      }
    }
    if ($need_update) {
      user_save($account, array(
        'roles' => $account_roles,
      ));
    }
  }
}

Functions

Namesort descending Description
user_user_import_after_save Implementation of hook_user_import_after_save().
user_user_import_after_save_role
user_user_import_data Implementation of hook_user_import_data().
user_user_import_edit_email_fields
user_user_import_edit_roles_fields Role assign.
user_user_import_form_fieldset Implementation of hook_user_import_form_fieldsets().
user_user_import_form_field_match Implementation of hook_user_import_form_field_match().
user_user_import_form_update_user Implementation of hook_user_import_form_update_user().
user_user_import_pre_save Implementation of hook_user_import_pre_save().
user_user_import_roles_data
_user_import_existing_uid Return an existing user ID, if present, for a given email.
_user_import_validate_email Helper function to validate email.