web-dev-qa-db-ja.com

作成者としてのユーザーを使用して、ユーザー登録時にノードをプログラムで作成する方法は?

登録時にユーザーごとにコンテンツタイプ[〜#〜] xyz [〜#〜]の単一ノードを作成したい。

hook_user_insert()hook_entity_insert())を使用しようとしましたが、nidをuidに設定すると、uidがまだ0(匿名ユーザー)であり、ノードが機能しないため、これは機能しません新しく作成したアカウントに割り当てる必要があります。 (注:これは私の誤解でした。以下を参照してください。

各ユーザーはこのコンテンツタイプのノードを1つだけ持つ必要があるため、アカウントの作成時にノードを作成します。

Drupal 7では、ユーザーアカウントを保存してから新しいノードを作成したルールセットを使用して、ルールでこれをなんとか実現しました。ルールはまだDrupal 8のベータ版ではないため、プログラムでこれを実行しようとしています。

これが私が使用しているコードです:

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();

4k4の回答で述べたように、$ entityにはすでにUIDがあります。問題は、現在のユーザーである0(匿名)を誤って紹介したことです。

6
Patrick Kenny

挿入フックでは、ユーザーは既に保存されており、ユーザーIDが必要です。したがって、ノードを作成し、それを作成者として新しいユーザーに割り当てることは問題ありません。

/**
 * 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