user.inc 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. <?php
  2. /**
  3. * @todo move contact options to separate contact.inc
  4. */
  5. /**
  6. * Implementation of hook_user_import_form_field_match().
  7. */
  8. function user_user_import_form_field_match() {
  9. $options = array();
  10. $options['user']['email'] = t('Email Address*');
  11. $options['user']['password'] = t('Password');
  12. $options['user']['roles'] = t('Roles');
  13. $options['user']['created'] = t('Account Creation Date');
  14. // $options['user']['username'] = t('Username');
  15. // $options['user']['uid'] = t('UID');
  16. // $options['user']['modified'] = t('Modified');
  17. // $options['user']['picture_uri'] = t('Picture');
  18. // $options['user']['timezone'] = t('Timezone');
  19. // $options['user']['md5_password'] = t('Password MD5');
  20. return $options;
  21. }
  22. /**
  23. * Implementation of hook_user_import_form_fieldsets().
  24. */
  25. function user_user_import_form_fieldset($import, $collapsed) {
  26. $form = array();
  27. user_user_import_edit_roles_fields($form, $import, $collapsed);
  28. user_user_import_edit_email_fields($form, $import, $collapsed);
  29. return $form;
  30. }
  31. /**
  32. * Implementation of hook_user_import_form_update_user().
  33. */
  34. function user_user_import_form_update_user() {
  35. $form['roles'] = array('title' => t('Roles'), 'description' => t('Affected: roles assigned to user.'));
  36. $form['password'] = array('title' => t('Password'), 'description' => t('Affected: password.'), 'exclude_add' => TRUE);
  37. $form['contact'] = array('title' => t('Contact'), 'description' => t('Affected: user contact option.'), 'exclude_add' => TRUE);
  38. return $form;
  39. }
  40. /**
  41. * Implementation of hook_user_import_data().
  42. */
  43. function user_user_import_data($settings, $update_setting, $column_settings, $module, $field_id, $data, $column_id) {
  44. if ($module != 'user') return;
  45. if ($field_id == 'email') {
  46. $value = trim($data[$column_id]);
  47. if (!empty($settings['options']['email_domain'])) {
  48. $value .= $settings['options']['email_domain'];
  49. }
  50. _user_import_validate_email($value, $update_setting);
  51. }
  52. if ($field_id == 'password') {
  53. $value = trim($data[$column_id]);
  54. }
  55. if ($field_id == 'created') {
  56. $value = trim($data[$column_id]);
  57. if (!empty($value) && !is_numeric($value)) {
  58. $parsed = date_parse($value);
  59. $timestamp = mktime(
  60. $parsed['hour'],
  61. $parsed['minute'],
  62. $parsed['second'],
  63. $parsed['month'],
  64. $parsed['day'],
  65. $parsed['year']
  66. );
  67. if (!empty($timestamp) && is_numeric($timestamp)) {
  68. $value = $timestamp;
  69. }
  70. }
  71. }
  72. if ($field_id == 'roles') {
  73. $value = user_user_import_roles_data($data[$column_id], $settings['roles_new']);
  74. }
  75. return $value;
  76. }
  77. /**
  78. * Implementation of hook_user_import_pre_save().
  79. */
  80. function user_user_import_pre_save($settings, $account, $fields, $errors, $update_setting_per_module) {
  81. $account_add['mail'] = $fields['user']['email'][0];
  82. if (!empty($account['uid'])) {
  83. // update roles
  84. switch ($update_setting_per_module['roles']) {
  85. case UPDATE_ADD:
  86. // include currently assigned roles
  87. foreach ($account['roles'] as $rid => $role_name) {
  88. $account_add['roles'][$rid] = $rid;
  89. }
  90. case UPDATE_REPLACE:
  91. // update roles
  92. if (!isset($account_add['roles'])) {
  93. $account_add['roles'] = array();
  94. }
  95. foreach ($settings['roles'] as $rid => $role_set) {
  96. if (!empty($role_set)) {
  97. $account_add['roles'][$rid] = $rid;
  98. }
  99. }
  100. break;
  101. }
  102. // update password
  103. if ($update_setting_per_module['password'] == UPDATE_REPLACE) {
  104. $account_add['pass'] = (empty($fields['user']['password'][0])) ? user_password() : $fields['user']['password'][0];
  105. }
  106. else {
  107. $account_add['pass'] = "";
  108. }
  109. // update contact
  110. if ($update_setting_per_module['contact'] == UPDATE_REPLACE) {
  111. $account_add['contact'] = $settings['contact'];
  112. }
  113. else {
  114. $account_add['contact'] = isset($account['contact']) ? $account['contact'] : '';
  115. }
  116. }
  117. else {
  118. $account_add['timezone'] = variable_get('date_default_timezone', @date_default_timezone_get());
  119. $account_add['status'] = 1;
  120. $account_add['init'] = $fields['user']['email'][0];
  121. $account_add['pass'] = (empty($fields['user']['password'][0])) ? user_password() : $fields['user']['password'][0];
  122. if (isset($fields['user']['created'][0]) && !empty($fields['user']['created'][0])) {
  123. $account_add['created'] = $fields['user']['created'][0];
  124. }
  125. $account_add['init'] = $fields['user']['email'][0];
  126. if (!empty($settings['options']['activate'])) {
  127. $account_add['access'] = time();
  128. $account_add['login'] = time();
  129. }
  130. // add selected roles
  131. foreach ($settings['roles'] as $rid => $role_set) {
  132. if (!empty($role_set)) $account_add['roles'][$rid] = $rid;
  133. }
  134. }
  135. return $account_add;
  136. }
  137. /**
  138. * Implementation of hook_user_import_after_save().
  139. */
  140. function user_user_import_after_save($settings, $account, $password, $fields, $updated, $update_setting_per_module) {
  141. /**
  142. * @todo change hook_user_import_after_save() so that all changes to data are returned and saved in one hit
  143. */
  144. $roles = isset($fields['user']['roles']) ? $fields['user']['roles'] : array();
  145. user_user_import_after_save_role($account, $settings['roles_new'], $account->roles, $roles);
  146. return;
  147. }
  148. function user_user_import_edit_roles_fields(&$form, $import, $collapsed) {
  149. $roles = array();
  150. $roles_data = user_roles();
  151. // remove 'anonymous user' option
  152. while (list ($rid, $role_name) = each($roles_data)) {
  153. if ($role_name != 'anonymous user' && $role_name != 'authenticated user') $roles[$rid] = $role_name;
  154. }
  155. // roles selected
  156. if (!empty($import['roles'])) {
  157. foreach ($import['roles'] as $rid) {
  158. if ($rid != 0) $roles_selected[] = $rid;
  159. }
  160. }
  161. if (empty($roles_selected)) $roles_selected[] = 2;
  162. $form['role_selection'] = array(
  163. '#type' => 'fieldset',
  164. '#title' => t('Role Assign'),
  165. '#weight' => -80,
  166. '#collapsible' => TRUE,
  167. '#collapsed' => $collapsed,
  168. );
  169. $form['role_selection']['roles'] = array(
  170. '#title' => t('Assign Role(s) To All Users'),
  171. '#type' => 'checkboxes',
  172. '#options' => $roles,
  173. '#default_value' => $roles_selected,
  174. '#description' => t("Select which role(s) all imported users should be assigned. The role 'authenticated user' is assigned automatically."),
  175. );
  176. $form['role_selection']['roles_new'] = array(
  177. '#type' => 'checkbox',
  178. '#title' => t('Add New Roles'),
  179. '#default_value' => isset($import['roles_new']) ? $import['roles_new'] : 0,
  180. '#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.'),
  181. );
  182. return;
  183. }
  184. function user_user_import_edit_email_fields(&$form, $import, $collapsed) {
  185. $form['email_message'] = array(
  186. '#type' => 'fieldset',
  187. '#title' => t('Email Message'),
  188. '#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/people/settings'))),
  189. '#collapsible' => TRUE,
  190. '#collapsed' => $collapsed,
  191. );
  192. $form['email_message']['subject'] = array(
  193. '#type' => 'textfield',
  194. '#title' => t('Message Subject'),
  195. '#default_value' => isset($import['subject']) ? $import['subject'] : '',
  196. '#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.',
  197. '#element_validate' => array('user_import_send_email_subject_validate'),
  198. );
  199. $form['email_message']['message'] = array(
  200. '#type' => 'textarea',
  201. '#title' => t('Message'),
  202. '#default_value' => isset($import['message']) ? $import['message'] : '',
  203. '#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.',
  204. '#element_validate' => array('user_import_send_email_message_validate'),
  205. );
  206. $form['email_message']['message_format'] = array(
  207. '#type' => 'radios',
  208. '#title' => t('Email Format'),
  209. '#default_value' => isset($import['message_format']) ? $import['message_format'] : 0,
  210. '#options' => array(t('Plain Text'), t('HTML')),
  211. );
  212. $form['email_message']['message_css'] = array(
  213. '#type' => 'textarea',
  214. '#title' => t('CSS'),
  215. '#default_value' => isset($import['message_css']) ? $import['message_css'] : '',
  216. '#description' => t('Use if sending HTML formated email.'),
  217. );
  218. return;
  219. }
  220. function _user_import_validate_email($email = NULL, $duplicates_allowed = FALSE) {
  221. if (empty($email)) {
  222. user_import_errors(t('no email'));
  223. }
  224. elseif (!valid_email_address($email)) {
  225. user_import_errors(t('invalid email'));
  226. }
  227. // Handle duplicate emails.
  228. elseif (!$duplicates_allowed && _user_import_existing_uid($email)) {
  229. user_import_errors(t('duplicate email'));
  230. }
  231. return;
  232. }
  233. function user_user_import_roles_data($data, $new_roles_allowed) {
  234. $roles = array();
  235. if (empty($data)) return;
  236. $values = explode(',', $data);
  237. // check if any roles are specified that don't already exist
  238. $existing_roles = user_roles();
  239. foreach ($values as $piece) {
  240. $role = trim($piece);
  241. $unrecognised = array();
  242. if (!empty($role)) {
  243. // only add if role is recognized or adding new roles is allowed
  244. if (empty($new_roles_allowed) && !array_search($role, $existing_roles)) {
  245. $unrecognised[] = $role;
  246. }
  247. else {
  248. $roles[] = $role;
  249. }
  250. }
  251. }
  252. if (!empty($unrecognised)) {
  253. user_import_errors(t('The following unrecognised roles were specified:') . implode(',', $unrecognised));
  254. }
  255. return $roles;
  256. }
  257. /**
  258. * Return an existing user ID, if present, for a given email.
  259. */
  260. function _user_import_existing_uid($email) {
  261. $sql = 'SELECT uid FROM {users} WHERE mail = :mail';
  262. $args = array(':mail' => $email);
  263. $uid = db_query_range($sql, 0, 1, $args)->fetchField();
  264. return $uid;
  265. }
  266. function user_user_import_after_save_role($account, $new_roles_allowed, $account_roles, $roles) {
  267. $existing_roles = user_roles();
  268. // if roles were specified, add to existing roles
  269. $assign_roles = array();
  270. if (is_array($roles) && !empty($roles)) {
  271. foreach ($roles as $role) {
  272. if (!empty($role)) {
  273. $key = array_search($role, $existing_roles);
  274. if (!empty($new_roles_allowed) && empty($key)) {
  275. $key = db_insert('role')
  276. ->fields(array(
  277. 'name' => $role,
  278. ))
  279. ->execute();
  280. $existing_roles[$key] = $role;
  281. }
  282. $assign_roles[$key] = $role;
  283. }
  284. }
  285. $need_update = FALSE;
  286. foreach ($assign_roles as $key => $role) {
  287. if (!isset($account_roles[$key])) {
  288. $need_update = TRUE;
  289. $account_roles[$key] = $role;
  290. }
  291. }
  292. if ($need_update) {
  293. user_save($account, array('roles' => $account_roles));
  294. }
  295. }
  296. return;
  297. }