web-dev-qa-db-ja.com

ノードの追加中に複数の段落を事前に埋める

ユーザーが特定のコンテンツタイプの[ノードを追加]をクリックしたときに複数の段落を事前に入力したい。これを行うための良い方法は何でしょうか?

1
j2r

既存の段落を再利用することはできません。ノードごとに新しい段落を作成する必要があります。

$paragraph1 = Paragraph::create([
  'title' => 'Paragraph 1',
  'type' => 'paragraph_type1',
]);
$paragraph1->save();

$paragraph2 = Paragraph::create([
  'title' => 'Paragraph 2',
  'type' => 'paragraph_type2',
]);
$paragraph2->save();

$node = Node::create([
  'title' => 'Node with two paragraphs',
  'type' => 'article',
  'field_paragraph' => [$paragraph1, $paragraph2],
  ]);
$node->save();

このコードをカスタムコントローラーに配置できます。

  public function addCustomContentType() {
    $node = $this->entityTypeManager()->getStorage('node')->create([
      'type' => 'custom_content_type',
    ]);

    // create paragraphs, don't save them yet, in case the node is not submitted

    $paragraph1 = $this->entityTypeManager()->getStorage('paragraph')->create([
      'title' => 'Paragraph 1',
      'type' => 'paragraph_type1',
       // more field data
    ]);

    $paragraph2 = $this->entityTypeManager()->getStorage('paragraph')->create([
      'title' => 'Paragraph 2',
      'type' => 'paragraph_type2',
      // more field data
    ]);

    // prefill the paragraph field in the node with the paragraphs
    $node->field_paragraph = [$paragraph1, $paragraph2];

    $form = $this->entityFormBuilder()->getForm($node);

    return $form;
5
4k4

hook_form_alter()の実行中に単純なフィールドをハックできますが、段落の構造が複雑すぎます。これは、フォームが作成される前の、新しいノードの作成中の早い段階で行う必要があります。

function MY_MODULE_node_create(Drupal\Core\Entity\EntityInterface $entity) {

  $bundle = $entity->bundle();
  if ($bundle != 'MY_CONTENT_TYPE') {
    return;
  }

  // you may add here additional checks
  // to make sure node creation happens
  // on node add page

  $pg = Paragraph::create([
    'type' => 'MY_PG_MACHINE_NAME',
    'field_reference' => ['target_id' => 111],
    'field_integer' => 2222,
  ]);

  // Insert here as many paragraphs as you need.
  $entity->field_paragraphs = [$pg];

}

参照: hook_entity_create()

2
Rax