web-dev-qa-db-fra.com

Comment attribuer par programmation des rôles d'utilisateur

J'attribue un rôle à l'utilisateur par ce code:

$user = user_load($user->uid);
$role = user_role_load_by_name("10-dis");
$user->roles = $user->roles + array($role->rid => $role->name);
user_save($user);

Je dois remplacer ce rôle par un nouveau rôle, cela signifie que je dois changer le rôle d'utilisateur en fonction d'une condition. Comment puis-je réaffecter par programmation le rôle d'utilisateur?

4
jsh

Drupal core user.module Fournit une fonction simple pour ajouter/supprimer des rôles à/d'un utilisateur. Voir user_multiple_role_edit() .

$uid = 12345; // The user ID of the account you want to change.
$role_id = 4; // The numeric role ID you want to add.
$role_id_rm = 3; // The numeric role ID you want to remove.

user_multiple_role_edit(array($uid), 'add_role', $role_id);
user_multiple_role_edit(array($uid), 'remove_role', $role_id_rm);
9
AyeshK

Pour supprimer un rôle d'un utilisateur, vous pouvez utiliser cette fonction:

/**
 * Remove a role from a user.
 *
 * @param $user
 *   User object or user ID.
 * @param $role_name
 *   String value of role to be removed.
 */
function custom_remove_role_from_user($user, $role_name) {

  // For convenience, we'll allow user ids as well as full user objects.
  if (is_numeric($user)) {
    $user = user_load($user);
  }

  // Only remove the role if the user already has it.
  $key = array_search($role_name, $user->roles);
  if ($key == TRUE) {

    // Get the rid from the roles table.
    $roles = user_roles(TRUE);
    $rid = array_search($role_name, $roles);
    if ($rid != FALSE) {

      // Make a copy of the roles array, without the deleted one.
      $new_roles = array();

      foreach($user->roles as $id => $name) {
        if ($id != $rid) {
          $new_roles[$id] = $name;
        }
      }

      user_save($user, array('roles' => $new_roles));
    }
  }
}

Pour ajouter un rôle à un utilisateur, vous pouvez utiliser cette fonction:

/**
 * Add a role to a user.
 *
 * @param $user
 *   User object or user ID.
 * @param $role_name
 *   String value of role to be added.
 *
 * @see http_://drupal.org/node/28379#comment-4277052
 * @see http_://api.drupal.org/api/drupal/modules--user--user.module/function/user_save
 */
function custom_add_role_to_user($user, $role_name) {

  // For convenience, we'll allow user ids as well as full user objects.
  if (is_numeric($user)) {
    $user = user_load($user);
  }

  // If the user doesn't already have the role, add the role to that user.
  $key = array_search($role_name, $user->roles);
  if ($key == FALSE) {

    // Get the rid from the roles table.
    $roles = user_roles(TRUE);
    $rid = array_search($role_name, $roles);
    if ($rid != FALSE) {

      $new_role[$rid] = $role_name;
      $all_roles = $user->roles + $new_role; // Add new role to existing roles.
      user_save($user, array('roles' => $all_roles));
    }
  }
}

Référence : Ajout et suppression par programmation de rôles aux utilisateurs dans Drupal

3
Adrian Cid Almaguer

Prenez la fonction d'assistance suivante fournie avec les arguments nécessaires pour remplacer le rôle d'un utilisateur:

/**
 * Helper function to replace a user's role.
 *
 * @param int $role_to_replace
 * @param int $role_to_replace_by
 * @param int $uid
 *
 * @throws \Exception
 */
function replace_role($role_to_replace, $role_to_replace_by, $uid) {

  $role_to_replace = (int) $role_to_replace;
  $role_to_replace_by = (int) $role_to_replace_by;
  $uid = (int) $uid;

  // Load user by user ID.
  $user = user_load($uid);

  if (array_key_exists($role_to_replace, $user->roles)) {

    // Remove old role.
    unset($user->roles[$role_to_replace]);

    // Load new role by role ID.
    $role = user_role_load($role_to_replace_by);

    // Add new role.
    $user->roles = $user->roles + [$role->rid => $role->name];

    // Save.
    user_save($user);
  }
}

L'appel de fonction ressemblera à:

replace_role(7, 11, 4024);

Ainsi, l'exemple ci-dessus remplacera le rôle avec l'ID de rôle 7 en rôle avec l'ID de rôle 11 pour l'utilisateur avec l'ID utilisateur 4024.

2
arpitr