Me preguntaba cómo conseguir todos los usuarios y poner todos sus UID en una matriz. He visto preguntas similares pero ninguna realmente responde a mi pregunta.
En Drupal 7, puede buscar a todos los usuarios que usan entity_load como sigue,
$users = entity_load('user');
y array_keys ($ users) le dará la matriz de uid
Puede lograr el resultado en Drupal 8 de la siguiente manera:
$query = \Drupal::entityQuery('user');
$uids = $query->execute();
Simplemente compartiendo un fragmento que creé recientemente para obtener HTML y EMAIL de todos los usuarios existentes en la base de datos.
Funciona bien hasta más de 2000 usuarios. Después de eso, sugiero implementar el procesamiento por lotes o una consulta de base de datos directa alternativa.
Esto depende de que Drupal cargue a cada usuario.
$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'>;
Devolverá una tabla html simple que puede copiar en sobres fácilmente, etc.
Para obtenerlos en una matriz, simplemente use la variable indicada en el código para UIDS.
Para responder algunos de los comentarios: si está trabajando con una gran cantidad de usuarios, no podrá cargar a todos los usuarios en una matriz sin tiempo de espera, por lo que probablemente necesitará procesarlos por lotes ...
Aquí está cómo (sí, lo es:
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');
}
}