Récupérer le rôle d'un utilisateur

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Je cherche à faire un module permettant de rediriger l'utilisateur selon son rôle lors de sa connection. J'ai longuement cherché comment récupérer le rôle de l'utilisateur loggué, mais je ne trouve pas. Quelqu'un saurait comment faire ?

Version de Drupal : 

Hello,

Dans ton module personnalisé, le bout de code suivant te permettra de récupérer les rôles d'un utilisateur donné :

<?php
function _mymodule_get_user_roles() {
 
// récupérer les infos sur l'utilisateur courant
 
global $user;

 
// récupérer un array avec les rôles de l'utilisateur
 
$roles = $user->roles;

  return
$roles;
}

// Afficher l'array de roles à l'écran
$_user_roles = _mymodule_get_user_roles();
print_r($_user_roles) ;
?>

Malheureusement j'ai essayé et ça ne marche pas. Voici mon petit module :

<?php
function _mymodule_get_user_roles() {
  // récupérer les infos sur l'utilisateur courant
  global $user;
  // récupérer un array avec les rôles de l'utilisateur
  $roles = $user->roles;

  return $roles;
}

function
redirec_user($op, &$edit, &$account, $category = NULL)
{
 
$_user_roles = _mymodule_get_user_roles();

    switch(
$op)
    {
      case
'login' :
       if(
$_user_roles=="4") $_REQUEST['destination'] = 'priveCU';
      elseif(
$_user_roles=="5") $_REQUEST['destination'] = 'priveMU';
      elseif(
$_user_roles=="7" || $_user_roles== 1) $_REQUEST['destination'] = 'accueil';
      else
$_REQUEST['destination'] = 'priveClient';
     break;
 }
}
?>

Hello,

$_user_roles est un tableau de valeurs, donc la syntaxe serait plutôt

<?php
 
if (isset($_user_roles[4])) $_REQUEST['destination'] = 'priveCU';
?>

Par contre comment gères-tu le cas où un utilisateur fait à la fois partie du rôle 4 et 5, par exemple ?

Hum j'ai fait les modifications mais là le site plante, j'ai une page blanche qui s'affiche, j'ai du faire une erreur dans le programme ...

Et je n'ai pas trouvé le module login redirection.

Je viens d'essayer de faire ça autrement. Et maintenant le site ne plante plus, seulement, je peux me logguer avec n'importe quel utilisateur, le résultat est toujours le même : j'arrive sur l'accueil. Je pense qu'il y a un problème du côté de $user->roles

<?php
function redirec_user($op, &$edit, &$account, $category = NULL)
{

switch(
$op)
{
case
'login' :
global
$user;
$Role1= array('Admin');
$Role2 = array('CentraleU');
$Role3 = array('SystemeU');
$Role4 = array('Client');

$check1 = array_intersect($Role1, array_values($user->roles));
$check2 = array_intersect($Role2, array_values($user->roles));
$check3 = array_intersect($Role3, array_values($user->roles));
$check4 = array_intersect($Role4, array_values($user->roles));

if(isset(
$check1)) $_REQUEST['destination'] = 'accueil';
elseif(isset(
$check2)) $_REQUEST['destination'] = 'priveCU';
elseif(isset(
$check3)) $_REQUEST['destination'] = 'priveMU';
elseif(isset(
$check4)) $_REQUEST['destination'] = 'priveClient';
else
$_REQUEST['destination'] = 'accueil';

break;
}
}
?>

normal

tu fais

<?php
$check1
= array_intersect($Role1, array_values($user->roles));
?>

c'est a dire que tu "set" la variable check1 avec quelque-chose

et ensuite tu fais

<?php
if(isset($check1)) $_REQUEST['destination'] = 'accueil';
?>

c'est comme si tu marquais if ( 1 == 1 ). Si tu set ta variable juste avant, quelque soit ce qu'il y a dedans elle est "setée" ^^
array_intersect() renvoi un tableau. Donc s'il ne match rien il devrait logiquement te renvoyer un tableau vide

Je te propose :

<?php
function redirec_user($op, &$edit, &$account, $category = NULL)
{

  switch(
$op) {
    case
'login' :
      global
$user;

     
$roles = array_keys($user->roles);

      foreach (
$roles as $role_id) {
        switch (
$role_id) {
          case
'4': // Role ID pour 'Admin'
           
$_REQUEST['destination'] = 'accueil';
            break;
          case
'5': // Role ID pour 'CentraleU'
           
$_REQUEST['destination'] = 'priveCU';
            break;
          case
'6': // Role ID pour 'SystemeU'
           
$_REQUEST['destination'] = 'priveMU';
            break;
          case
'7': // Role ID pour 'Client'
           
$_REQUEST['destination'] = 'priveClient';
            break;
          default:
           
$_REQUEST['destination'] = 'accueil';
        }
      }
      break;
  }
}
?>