uid = 0; $account->roles = array_filter($this->config['roles']); $account->status = $this->config['status']; return $account; } /** * Loads an existing user. */ protected function entityLoad(FeedsSource $source, $uid) { return user_load($uid); } /** * Validates a user account. */ protected function entityValidate($account) { if (empty($account->name) || empty($account->mail) || !valid_email_address($account->mail)) { throw new FeedsValidationException(t('User name missing or email not valid.')); } } /** * Save a user account. */ protected function entitySave($account) { if ($this->config['defuse_mail']) { $account->mail = $account->mail . '_test'; } user_save($account, (array) $account); if ($account->uid && $account->openid) { $authmap = array( 'uid' => $account->uid, 'module' => 'openid', 'authname' => $account->openid, ); if (SAVED_UPDATED != drupal_write_record('authmap', $authmap, array('uid', 'module'))) { drupal_write_record('authmap', $authmap); } } } /** * Delete multiple user accounts. */ protected function entityDeleteMultiple($uids) { foreach ($uids as $uid) { user_delete($uid); } } /** * Override parent::configDefaults(). */ public function configDefaults() { return array( 'roles' => array(), 'status' => 1, 'defuse_mail' => FALSE, ) + parent::configDefaults(); } /** * Override parent::configForm(). */ public function configForm(&$form_state) { $form = parent::configForm($form_state); $form['status'] = array( '#type' => 'radios', '#title' => t('Status'), '#description' => t('Select whether users should be imported active or blocked.'), '#options' => array(0 => t('Blocked'), 1 => t('Active')), '#default_value' => $this->config['status'], ); $roles = user_roles(TRUE); unset($roles[2]); if (count($roles)) { $form['roles'] = array( '#type' => 'checkboxes', '#title' => t('Additional roles'), '#description' => t('Every user is assigned the "authenticated user" role. Select additional roles here.'), '#default_value' => $this->config['roles'], '#options' => $roles, ); } // @todo Implement true updating. $form['update_existing'] = array( '#type' => 'checkbox', '#title' => t('Replace existing users'), '#description' => t('If an existing user is found for an imported user, replace it. Existing users will be determined using mappings that are a "unique target".'), '#default_value' => $this->config['update_existing'], ); $form['defuse_mail'] = array( '#type' => 'checkbox', '#title' => t('Defuse e-mail addresses'), '#description' => t('This appends _test to all imported e-mail addresses to ensure they cannot be used as recipients.'), '#default_value' => $this->config['defuse_mail'], ); return $form; } /** * Override setTargetElement to operate on a target item that is a node. */ public function setTargetElement(FeedsSource $source, $target_user, $target_element, $value) { switch ($target_element) { case 'created': $target_user->created = feeds_to_unixtime($value, REQUEST_TIME); break; default: parent::setTargetElement($source, $target_user, $target_element, $value); break; } } /** * Return available mapping targets. */ public function getMappingTargets() { $targets = parent::getMappingTargets(); $targets += array( 'name' => array( 'name' => t('User name'), 'description' => t('Name of the user.'), 'optional_unique' => TRUE, ), 'mail' => array( 'name' => t('Email address'), 'description' => t('Email address of the user.'), 'optional_unique' => TRUE, ), 'created' => array( 'name' => t('Created date'), 'description' => t('The created (e. g. joined) data of the user.'), ), ); if (module_exists('openid')) { $targets['openid'] = array( 'name' => t('OpenID identifier'), 'description' => t('The OpenID identifier of the user. CAUTION: Use only for migration purposes, misconfiguration of the OpenID identifier can lead to severe security breaches like users gaining access to accounts other than their own.'), 'optional_unique' => TRUE, ); } // Let other modules expose mapping targets. self::loadMappers(); feeds_alter('feeds_processor_targets', $targets, 'user', 'user'); return $targets; } /** * Get id of an existing feed item term if available. */ protected function existingEntityId(FeedsSource $source, FeedsParserResult $result) { if ($uid = parent::existingEntityId($source, $result)) { return $uid; } // Iterate through all unique targets and try to find a user for the // target's value. foreach ($this->uniqueTargets($source, $result) as $target => $value) { switch ($target) { case 'name': $uid = db_query("SELECT uid FROM {users} WHERE name = :name", array(':name' => $value))->fetchField(); break; case 'mail': $uid = db_query("SELECT uid FROM {users} WHERE mail = :mail", array(':mail' => $value))->fetchField(); break; case 'openid': $uid = db_query("SELECT uid FROM {authmap} WHERE authname = :authname AND module = 'openid'", array(':authname' => $value))->fetchField(); break; } if ($uid) { // Return with the first nid found. return $uid; } } return 0; } }