Hero

Agregar roles vía código en Drupal 7

Noviembre 18, 2013

andreyjose

Cuando trabajamos con roles en Drupal 7, a veces nos sucede que tenemos que actualizar o agregar un rol a un usuario, debido a una acción realizada por el usuario en el sitio y las opciones de Drupal no nos permite asignarle el rol al usuario. A continuación se muestra una función que nos aydudará a realizar la asignación de un rol en un usuario cuando nosotros queramos con sólo pasarle el nombre del rol.

1. Agregar rol a un usuario:

Para la creación de la función debemos declararlo dentro de un módulo personalizado creado de la siguiente forma:

function MIMODULO_agregar_rol($nombre_rol) {
  global $user;

  // user_roles() devuelve un arreglo con todos 
  // los roles que se han definido en el sitio.
  $arreglo_roles = user_roles();
  
  // Obtiene los roles que tiene el usuario.
  $usuario_roles = $user->roles;

  // Devuelve la clave del rol.
  $clave = array_search($nombre_rol, $arreglo_roles);

  // Verifica si el usuario ya tiene el rol
  // sino es así lo actualiza.
  if (!isset($usuario_roles[$clave])) {
    $usuario_roles[$clave] = $nombre_rol;
    $user->roles = $usuario_roles;
    
    // user_save es una fucnión de drupal para
    // actualizar el usuario en la base de datos.
    user_save($user);
  }
} 

Como se observa en el código anterior, la función recibe un string con el nombre del rol como fue creado en la configuración de Drupal y la función está hecha para actualizar los roles del usuario que se encuentra auténticado en ese momento. Además de que la función lo que hace es agregar un rol sin eliminar los otros roles que tiene asignado el usuario.

A continuación realizaremos algo distinto que sería asignarle un único rol a un usuario en vez de agregar otro como se realizó anteriormente.

2. Cambiar rol de un usuario:

Si se quiere hacer un cambio de rol, es decir eliminar los roles que tiene el usuario en ese momento y asignar otro, lo único que se tiene que hacer es cambiar la condición del if que se encuentra en la función por la siguiente parte de código:

if (!isset($usuario_roles[$clave])) {
  // Se declara un nuevo arreglo.
  $nuevo_rol[$clave] = $nombre_rol;
    
  // Se actualiza el nuevo arreglo en la clave de roles
  // cayendole encima y quitando el rol que tenía anteriormente.
  user_save($user, array('roles' => $nuevo_rol));
}

Espero que les haya sido de ayuda y muchas gracias.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.