ユーザーが特定のコンテンツタイプの[ノードを追加]をクリックしたときに複数の段落を事前に入力したい。これを行うための良い方法は何でしょうか?
既存の段落を再利用することはできません。ノードごとに新しい段落を作成する必要があります。
$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;
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];
}