web-dev-qa-db-fra.com

Comment créer par programmation un nœud lors de l'inscription de l'utilisateur avec l'utilisateur comme auteur?

Je veux créer un seul nœud de type de contenu XYZ pour chaque utilisateur lors de l'inscription.

J'ai essayé d'utiliser hook_user_insert() (hook_entity_insert()), mais cela ne fonctionne pas car lorsque je mets le nid à l'uid, l'uid est toujours 0 (utilisateur anonyme) et le nœud doit être affecté au compte nouvellement créé. (REMARQUE: c'était mon malentendu, voir ci-dessous.)

Je souhaite créer les nœuds lors de la création du compte, car chaque utilisateur ne doit avoir qu'un seul nœud de ce type de contenu.

Dans Drupal 7, j'ai réussi à le faire dans Rules en utilisant un ensemble de règles dans lequel j'ai enregistré le compte d'utilisateur, puis créé le nouveau nœud. Puisque Rules n'est pas en version bêta pour Drupal 8 pour l'instant, j'essaie de le faire par programme.

Voici le code que j'utilise:

function MYMODULE_user_insert(Drupal\Core\Entity\EntityInterface $entity) {
  $user = \Drupal::currentUser();
  $profile = Node::create(['type' => 'userprofilenode']);
  $profile->set('uid', $user->id());
  $profile->enforceIsNew();
  $profile->save();

Comme indiqué dans la réponse de 4k4, $ entity possède déjà un UID. Le problème est que j'ai introduit par erreur l'utilisateur actuel, qui est 0 (anonyme).

6
Patrick Kenny

Dans un crochet d'insertion, l'utilisateur est déjà enregistré et doit avoir un ID utilisateur. La création d'un nœud et son affectation au nouvel utilisateur en tant qu'auteur ne devrait donc pas poser de problème:

/**
 * Implements hook_ENTITY_TYPE_insert() for user entities.
 *
 * Adds a first node for a new user
 */
function mymodule_user_insert(\Drupal\user\UserInterface $user) {
  \Drupal\node\Entity\Node::create([
    'type' => 'XYZ',
    'title' => 'First node for user #' . $user->id(),
    'uid' => $user->id(),
  ])->save();
}
9
4k4