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?
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);
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
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.