2009-07-25 11 views

Respuesta

5

general, no hay funciones de la API de Drupal para este tipo de tarea (tirando hacia arriba de las entidades que responden a ciertos criterios). Tiende a centrarse en funciones CRUD de una sola entidad en la API; todo lo demás depende de las habilidades de SQL del desarrollador.

El módulo Vistas le permite crear listas de usuarios filtradas por rol, permiso, etc., pero podría ser exagerado.

+0

Haría mi propia respuesta, pero creo que debería ampliar esto. No hay función que le permita hacer una lista de usuarios y filtrar por función dentro de Drupal (núcleo como mínimo). Puedes escribir tu propia función o, como dijo eaton, usar las vistas para crear una lista de usuarios. – codeincarnate

+0

A las vistas es fácil aquí. –

+0

usted __really__ debería usar vistas. es la solución que estás buscando. – alexanderpas

0

No conozco ninguna API que pueda ayudar a recopilar usuarios por rol. Aquí tienes un enlace para obtener algo: http://drupal.org/node/82002. Aunque SO es un servicio increíble, sugiero usar drupal.org o el canal #drupal en irc.freenode.org para preguntas relacionadas con Drupal.

Obs .: veces SQL no es que el mal :)

+0

Estoy de acuerdo. Veo muchos plugins de Wordpress que consultan directamente la base de datos en lugar de usar funciones predefinidas. –

+4

Solo comentando para agregar que StackOverflow es excelente para las preguntas de Drupal y más personas deberían preguntar aquí. – alxp

+0

consultas sql deben evitarse, ya que drupal7 usará nueva API api para resumir SQL (para que pueda usar cosas como mongodb :) –

1

Una opción fácil es usar Views para generar el SQL (aparece debajo de la vista cuando presiona el botón de vista previa) para usted y luego usar el Drupal SQL abstraction layer para obtener los resultados que necesita si necesita acceder al datos en bruto en lugar de mostrar una Vista.

Se vería un poco como esto:

$result = db_query('SELECT users.uid AS uid, 
    users.mail AS users_mail, 
    users.name AS users_name 
FROM users users'); 
while ($existing_user = db_fetch_object($result)) { 
    print_r($existing_user); // or do whatever 
    } 

simplemente añada más campos a la vista para obtener la consulta completa.

+1

El SQL de vistas es innecesariamente complejo, pruebe 'SELECCIONE el uid, correo, nombre FROM {users}' – Adaddinsane

2

El SQL que funcionó para mí:

 
$users = ""; 
$result = db_query('SELECT users.name AS users_name FROM users users 
     INNER JOIN users_roles users_roles ON users.uid = users_roles.uid 
     WHERE users_roles.rid = 4'); 

while ($existing_user = db_fetch_object($result)) { 
     if ($users != "") $users .= ", "; 
     $users .= $existing_user->users_name; // or do whatever 
} 
echo $users; 

Tenga en cuenta que esto es para Drupal 6 y no estoy seguro sobre el rendimiento de esta para grandes bases de usuarios. No estoy seguro acerca de Drupal 7.

+1

El rendimiento estaría bien. Su ejemplo en el código D7: 'var_dump (db_query ('SELECT nombre FROM {usuarios} u INNER JOIN {usuarios_rolas} r ON u.uid = r.uid WHERE r.rid = 4') -> fetchCol()); ' – pfrenssen

9

Puede usar entity_load para obtener una matriz de usuarios. Aquí está la muestra que va a crear la lista de todos los mensajes de correo electrónico para los usuarios administradores (utilizado para enviar una notificación)

<?php 
$users = entity_load('user'); 
$emails = ''; 
foreach($users as $user) { 
    if (array_key_exists(3, $user->roles)) { 
    if (strlen($emails) > 0) { 
     $emails .= ' ' . $user->mail; 
    } else { 
     $emails = $user->mail; 
    } 
    } 
} 
?> 
+2

Si bien la respuesta aceptada por Eaton generalmente parece ser el caso de Drupal,' entity_load ('user') 'en realidad carga a todos los usuarios del sitio como objetos, en una matriz indexada por uid. –

+0

Esto funciona pero es extremadamente ineficiente y sería una idea terrible en sitios que tienen miles de usuarios. – chadpeppers

0

En Drupal 7, utilice EntityFieldQuery es la forma correcta.

+1

podría dar un ejemplo de cómo hacerlo? – akalata

0

En Drupal 8 las siguientes obras (en este ejemplo, cargar todos los usuarios con el rol administrator)

\Drupal::service('entity_type.manager') 
    ->getStorage('user') 
    ->loadByProperties(['roles' => 'administrator']); 

devolverá una lista de las entidades usuarias.

Para obtener una lista de uid s en cambio, una consulta de campo de entidad:

$query = \Drupal::service('entity_type.manager')->getStorage('user')->getQuery(); 
$query->condition('roles', 'administrator'); 
$query->execute(); 
0

En Drupal 8:

$users = \Drupal\user\Entity\User::loadMultiple(); 

Y si usted desea conseguir, por ejemplo, solo administradores:

$admins = []; 
foreach ($users as $user) { 
    if ($user->hasRole('administrator')) { 
    $admins[] = $user; 
    } 
} 
Cuestiones relacionadas