web-dev-qa-db-fra.com

Comment attribuer un rôle spécifique à chaque nouvel utilisateur enregistré?

Est-il possible dans Drupal 8 d'attribuer un rôle spécifique à chaque utilisateur nouvellement enregistré?

5
BOES

J'ai dû implémenter une fonctionnalité similaire dans un site, où:

  • Les utilisateurs ne sont pas tenus de vérifier leur adresse e-mail
  • Lorsque les utilisateurs créent un compte, ils obtiennent le rôle compte non vérifié
  • Une fois que les utilisateurs ont vérifié leur adresse e-mail, le rôle compte non vérifié est supprimé et ils obtiennent un rôle utilisateur confirmé

C'est assez similaire à ce que fait drupal.org de nos jours; J'utilise simplement différents rôles et un code personnalisé différent de celui utilisé par drupal.org.

Je n'ai pas utilisé le module Auto Assign Role , car il n'y a pas de version de travail pour Drupal 8. Je n'ai pas utilisé le Inscription Rôle module, car il ajoute les rôles à chaque compte en cours de modification, y compris les comptes avec le rôle administrateur.

J'ai utilisé un module personnalisé (que j'utilisais déjà à d'autres fins), où j'ai implémenté hook_ENTITY_TYPE_presave() avec un code similaire au suivant.

function mymodule_user_presave(UserInterface $user) {
  if ($user->isNew() && !$user->hasRole('unverified account')) {
    $admin = FALSE;

    foreach ($user->getRoles(TRUE) as $id) {
      $role = Role::load($id);
      if ($role->isAdmin()) {
        $admin = TRUE;
        break;
      }
    }

    if (!$admin) {
      $user->addRole('unverified account');
    }
  }
}

hook_ENTITY_TYPE_insert() et hook_entity_insert() sont les mauvais crochets à utiliser, car ils sont invoqués lorsque l'entité est déjà enregistrée dans la base de données. L'appel de la méthode save() sur l'entité passée à ces hooks provoquera l'invocation à nouveau de tous les hooks invoqués lorsqu'une entité est enregistrée, provoquant une boucle infinie.

5
kiamlaluno

Vous pouvez implémenter hook_ENTITY_TYPE_presave() .

Il agira avant la création de l'entité, vous n'avez donc pas à enregistrer l'entité une deuxième fois à vos risques et périls, la sauvegarde sera manipulée par le noyau lui-même, il suffit de l'ajouter dans le crochet de pré-enregistrement comme mentionné.

function modulename_user_presave(Drupal\Core\Entity\EntityInterface $entity) {
 if($entity->isNew()) {
   $entity->addRole('rolename');
 }
}

Vous pouvez également utiliser le module Registration Role .

Le rôle d'enregistrement permet à un administrateur de sélectionner un rôle à attribuer automatiquement aux nouveaux utilisateurs. Le rôle sélectionné sera attribué aux nouveaux inscrits.

L'attribution d'un rôle aux nouveaux utilisateurs enregistrés permet d'avoir des caractéristiques, des fonctions, etc., qui seraient spécifiques aux utilisateurs nouvellement enregistrés. Comme des liens vers des sujets de "démarrage" (par exemple dans un bloc ou certains liens de menu), que vous ne voulez plus montrer (par exemple) aux utilisateurs qui ont été enregistrés il y a X mois, non?

OMI, il y a au moins 2 façons de le faire, comme détaillé ci-dessous.

Attribuer un rôle automatiquement

C'est ce que vous pourriez faire en utilisant le module Auto Assign Role ... Depuis sa page de projet:

Le rôle d'attribution automatique sert trois objectifs principaux. La première consiste à fournir une attribution automatique des rôles lorsqu'un nouveau compte est créé ...

Ce module est disponible pour D6 et D7, pour D8, vous devrez attendre problème # 222065 , qui comprend un lien vers un projet sandbox à ce sujet que vous pourriez souhaiter regarder ...

Règles

Il est assez intéressant d'implémenter cette fonctionnalité en utilisant le module Rules, au moins en D7.

Ce serait mon approche recommandée. Parce que si vous avez installé des règles pour d'autres modules, vous n'avez pas besoin d'ajouter un autre module, donc cela réduit le risque de modulitis (= beaucoup trop de modules activés)

Bien que pour utiliser Règles en D8 c'est aussi trop tôt (travail en cours). Mais, les modules avec " de nombreuses installations signalées", reçoivent souvent plus d'attention (et les ressources affectées) à mettre à niveau.

3
Pierre.Vriens

Vous pouvez utiliser hook_ENTITY_TYPE_insert() , qui est appelé après l'enregistrement des données dans la base de données.

function MY_MODULE_user_insert(Drupal\Core\Entity\EntityInterface $entity) {
  $entity->addRole('myrolestring'); //no rid!
  $entity->save();
}

Vous pourriez probablement aussi utiliser hook_entity_presave() au lieu de hook_ENTITY_TYPE_insert(). Mais je n'ai pas testé ça.

1
Setaloro