Marzo 20, 2013
enzo
En algunas ocasiones necesitamos en nuestros módulos personalizados obtener un listado de todos los usuarios asociados a un rol especifico para realizar alguna tarea masiva, como quizas enviar un correo notificando algún cambio es sus derechos administrativos.
Esta función no esta dentro de las funciones propias del core de Drupal, pero a continuación haremos dicha implementación como se puede apreciar en el siguiente listado de código.
/**
* Fetches all users in a role name.
*
* @param $role
* A string representing the role name or a Role ID.
*
* @return
* An array with fully-loaded user object
*/
function _get_users_per_role($role) {
if(is_integer($role)) {
$role_object = user_role_load($role);
}
else {
$role_object = user_role_load_by_name($role_name);
}
//Get all users active and block related with the role.
$users = array();
$result = db_select('users_roles', 'ur')
->fields('ur')
->condition('ur.rid', $role_object->rid, '=')
->execute();
//Create an array of users ids.
foreach ($result as $record) {
$uids[] = $record->uid;
};
//Execute a query to get and object for active users only
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'user')
->propertyCondition('uid', $uids, 'IN')
->propertyCondition('status', 1);
$entities = $query->execute();
if (!empty($entities)) {
$users = entity_load('user', array_keys($entities['user']));
}
return $users;
}
Veamos un poco la lógica de la función.
La función recibe tanto como un id de rol o el nombre del rol del cual queremos obtener los usuarios asociados.
Posteriormente se obtienen todos los identificadores de usuario, pero esto no discrimina si son usuarios activos o no.
Para finalizar se hace una consulta usando los identificadores de usuario usando el EntityFieldQuery, pero restringiendo que solo retorne los usuario activos. Puedes ver una introducción a EntityFieldQuery aquí.
Espero que les sea de utilidad para sus módulos personalizados.
enzo