Отримайте список усіх користувачів і в масив


17

Мені було цікаво, як отримати всіх користувачів і помістити всі їх UID в масив? Я бачив подібні запитання, але жоден насправді не відповідає на моє запитання.

Відповіді:


18

У Drupal 7 ви можете забирати всіх користувачів, використовуючи entit_load, як:

$users = entity_load('user');

і array_keys ($ користувачів) надасть вам масив uid's


9

Ви можете досягти результату в Drupal 8:

$query = \Drupal::entityQuery('user');

$uids = $query->execute();

1

Просто поділився фрагментом, який я нещодавно створив, щоб отримати HTML та EMAIL усіх існуючих користувачів у базі даних.

Працює до 2000+ користувачів. Після цього я пропоную здійснити пакетне використання або альтернативний прямий запит до бази даних.

Це покладається на завантаження Drupal кожного користувача.

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'user');
$html = '<table>';
$result = $query->execute();

$uids = array_keys($result['user']);

// THIS IS YOUR ARRAY OF UIDS.
$users = user_load_multiple($uids);

// EXTRA CODE.
foreach($users as $user){
  $mail = $user->mail;
  $name = $user->name;
  $html .= '<tr><td>'.$mail.'</td>'.'<td>'.$name.'</td></tr>';
}
$html .= '</table'>;

Поверне просту таблицю HTML, яку ви можете легко скопіювати у excels тощо.

Щоб отримати їх у масиві, просто використовуйте змінну, вказану в коді для UIDS.


0

Щоб відповісти на деякі коментарі: Якщо ви працюєте з великою кількістю користувачів, ви не зможете завантажувати всіх користувачів у масив без таймауту, тому, ймовірно, вам потрібно буде пакетно обробити їх ...

Ось як (так, це:

 function _set_batch_revench_agains_users(){
  $batch = [
    'operations' => [
      ['_revench_against_users_batch_process']
    ],
    'finished' => '_revench_against_users_batch_finished',
    'title' => t('Punishing users for ungratefulness and general insolence.'),
    'init_message' => t('Batch is starting, he he he...'),
    'progress_message' => t('Processed @current out of @total.'),
    'error_message' => t('Batch has encountered an error, nooooo!'),
    'file' => drupal_get_path('module', 'revench_agains_users') . '/user_agains_users.module'
  ];
  batch_set($batch);
  batch_process('admin');
}

/**
 * Batch 'Processing' callback
 */

function _revench_against_users_batch_process(&$context){
 //all this $context stuff is mandatory, it is a bit heavy, but the batchAPI need it to keep track of progresses
  if (!isset($context['sandbox']['current'])) {
    $context['sandbox']['count'] = 0;
    $context['sandbox']['current'] = 0;
  }

  //don't use entity field query for such simple use cases as gettings all ids (much better performances, less code to write...)
  $query =  db_select('users', 'u');
  $query->addField('u', 'uid');
  $query->condition('u.uid', $context['sandbox']['current'], '>');
  $query->orderBy('u.uid');
  // Get the total amount of items to process.
  if (!isset($context['sandbox']['total'])) {
    $context['sandbox']['total'] = $query->countQuery()->execute()->fetchField();

    // If there are no users to "update", stop immediately.
    if (!$context['sandbox']['total']) {
      $context['finished'] = 1;
      return;
    }
  }

  $query->range(0, 25);
  $uids = $query->execute()->fetchCol();
  //finaly ! here is your user array, limited to a manageable chunk of 25 users
  $users_array = user_load_multiple($uids);
  //send it to some function to "process"...
  _burn_users_burnburnburn($users_array); // I won't reveal the content of this function for legal reasons
  //more mandatory context stuff
  $context['sandbox']['count'] += count($uids);
  $context['sandbox']['current'] = max($uids);
  $context['message'] = t('burned @uid ... feels better ...', array('@uid' => end($uids)));

  if ($context['sandbox']['count'] != $context['sandbox']['total']) {
    $context['finished'] = $context['sandbox']['count'] / $context['sandbox']['total'];
  }

}

/**
 * Batch 'finished' callback
 */
function _revench_against_users_batch_finished($success, $results, $operations) {
  if ($success) {
    // Here we do something meaningful with the results.
    $message = t('@count users successfully burned:', array('@count' => count($results)));

    drupal_set_message($message);
  }
  else {
    // An error occurred.
    // $operations contains the operations that remained unprocessed.
    $error_operation = reset($operations);
    $message = t('An error occurred while processing %error_operation with arguments: @arguments some users might have escaped !', array('%error_operation' => $error_operation[0], '@arguments' => print_r($error_operation[1], TRUE)));
    drupal_set_message($message, 'error');
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.