You are here

userdelete.module in Bulk User Delete 7

Provide a method of batch deleting users from a list of email addresses.

File

userdelete.module
View source
<?php

/**
 * @file
 * Provide a method of batch deleting users from a list of email addresses.
 */

/**
 * Implements hook_menu().
 */
function userdelete_menu() {
  $items = array();
  $items['admin/people/userdelete'] = array(
    'title' => 'Delete users',
    'description' => 'Bulk delete users.',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'userdelete_admin_form',
    ),
    'access arguments' => array(
      'administer users',
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 10,
  );
  return $items;
}

/**
 * Form builder function for user delete admin form.
 */
function userdelete_admin_form() {
  $form['description'] = array(
    '#type' => 'markup',
    '#markup' => t('Use this form to batch delete users. Enter one email address per line. <br /><br />WARNING: There is no confirmation for this action, users are deleted immmediately.'),
  );
  $form['emails'] = array(
    '#type' => 'textarea',
    '#title' => 'Email addresses',
    '#rows' => 20,
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Delete',
  );
  return $form;
}

/**
 * Validation handler for the user delete form.
 */
function userdelete_admin_form_validate($form, $form_state) {
  $emails = $form_state['values']['emails'];
  if (empty($emails)) {
    form_set_error('emails', 'Email addresses cannot be blank.');
  }
  $emails_array = userdelete_array_from_text($emails);
  foreach ($emails_array as $key => $email) {
    if (!valid_email_address($email)) {
      form_set_error('emails', 'At least one email address is invalid: ' . check_plain($email));
      return;
    }
  }
}

/**
 * Submit handler for the user delete form.
 */
function userdelete_admin_form_submit($form, &$form_state) {
  $emails = $form_state['values']['emails'];
  $emails_array = userdelete_array_from_text($emails);
  $num_mails = count($emails_array);
  $emails_chunks = array_chunk($emails_array, 4);
  $operations = array();
  foreach ($emails_chunks as $key => $value) {
    $operations[] = array(
      'userdelete_batch_op',
      array(
        $value,
      ),
    );
  }
  $batch = array(
    'operations' => $operations,
    'finished' => 'userdelete_batch_finished',
  );
  batch_set($batch);
}

/**
 * Batch delete users.
 */
function userdelete_batch_op($value, &$context) {
  $users = array();
  foreach ($value as $email) {
    $uid = db_query('SELECT uid FROM {users} WHERE mail = :mail', array(
      ':mail' => $email,
    ))
      ->fetchField();
    if ($uid) {
      $users[$email] = $uid;
    }
    else {
      $context['results']['notfound'][] = $email;
    }
  }
  foreach ($users as $email => $uid) {
    $context['results']['deleted'][] = $email . ', uid = ' . $uid;
  }
  user_delete_multiple($users);
}

/**
 * Batch is finished.
 */
function userdelete_batch_finished($success, $results, $operations) {
  if ($success) {
    if (isset($results['notfound'])) {
      drupal_set_message('The following users were not found:', 'warning');
      foreach ($results['notfound'] as $res) {
        drupal_set_message($res, 'warning');
      }
    }
    if (isset($results['deleted'])) {
      drupal_set_message('The following users were deleted successfully:');
      foreach ($results['deleted'] as $res) {
        drupal_set_message($res);
      }
    }
  }
  else {

    // An error occurred.
    // $operations contains the operations that remained unprocessed.
    $error_operation = reset($operations);
    drupal_set_message(t('An error occurred while processing @operation with arguments : @args', array(
      '@operation' => $error_operation[0],
      '@args' => print_r($error_operation[0], TRUE),
    )));
  }
}

/**
 * Helper function to break newline terminated text into array, removing dupes.
 */
function userdelete_array_from_text($text) {

  // Break into array and clean.
  $emails_array = explode("\n", $text);
  foreach ($emails_array as $key => $email) {
    $emails_array[$key] = strtolower(trim($email));
  }
  $emails_array = array_unique($emails_array);
  return array_filter($emails_array);
}

Functions

Namesort descending Description
userdelete_admin_form Form builder function for user delete admin form.
userdelete_admin_form_submit Submit handler for the user delete form.
userdelete_admin_form_validate Validation handler for the user delete form.
userdelete_array_from_text Helper function to break newline terminated text into array, removing dupes.
userdelete_batch_finished Batch is finished.
userdelete_batch_op Batch delete users.
userdelete_menu Implements hook_menu().