it-swarm.com.de

Holen Sie sich eine Liste aller Benutzer und in ein Array

Ich habe mich gefragt, wie ich alle Benutzer dazu bringen und alle ihre UIDs in ein Array einfügen kann. Ich habe ähnliche Fragen gesehen, aber keine beantwortet meine Frage wirklich.

17
Nick

In Drupal 7) können Sie alle Benutzer mit entity_load wie folgt abrufen:

$users = entity_load('user');

und array_keys ($ users) gibt Ihnen das Array der UIDs

19
Mathankumar

Sie können das Ergebnis in Drupal 8 von erreichen) durch:

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

$uids = $query->execute();
10
Matoeil

Ich teile nur ein Snippet, das ich kürzlich erstellt habe, um HTML und E-MAIL aller vorhandenen Benutzer in der Datenbank abzurufen.

Funktioniert gut bis zu 2000+ Benutzern. Danach schlage ich vor, Batching oder eine alternative direkte Datenbankabfrage zu implementieren.

Dies hängt davon ab, dass Drupal jeden Benutzer lädt.

$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'>;

Gibt eine einfache HTML-Tabelle zurück, die Sie leicht in Excel kopieren können usw.

Um sie in ein Array zu bekommen, verwenden Sie einfach die im Code für UIDS angegebene Variable.

1
Jarkko Oksanen

So beantworten Sie einige der Kommentare: Wenn Sie mit einer großen Anzahl von Benutzern arbeiten, können Sie nicht alle Benutzer ohne Zeitüberschreitung in ein Array laden, sodass Sie sie wahrscheinlich stapelweise verarbeiten müssen ...

Hier ist wie (ja es ist:

 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');
  }
}
0
Thony