我需要以编程方式将段落字段添加到 AJAX 处理程序中的实体。
这是我的 AJAX 回调:
function myAjaxCallback(array &$form, \Drupal\Core\Form\FormState $form_state) {
$paragraph3 = \Drupal\paragraphs\Entity\Paragraph::create([
'type' => 'media',
'field_caption' => 'Apart from the included Paragraph types, you can create your own simply by going to Structure -> Paragraphs types.',
]);
$paragraph3->save();
// Now I need to add $paragraph3 to $form['field_gallery_items']['widget']
return $form;
}
我需要将我创建的新段落添加到小部件中,以便在返回 $form 时我添加了一个段落。
我怎样才能做到这一点?
尝试将段落附加到表单字段
$form['field_gallery_items']['widget']->appendItem($paragraph3);
我知道这个问题太老了,但是很难找到有效的例子 我已经根据 2 个链接创建了可行的解决方案
将此代码放入 buildForm 函数中
$form = parent::buildForm($form, $form_state);
$entity = $form_state->get('entity') ?? $this->entityTypeManager->getStorage('node')->create([
'type' => 'entity_type'
]);
$form_state->set('entity', $entity);
$form_display = EntityFormDisplay::collectRenderDisplay($entity, 'default');
$entity_form = [];
$form_display->buildForm($entity, $entity_form, $form_state);
$form_state->set('form_display', $form_display);
$paragraph_module_display = $this->entityTypeManager1->getStorage('entity_form_display')->load('paragraph.module.default');
$widget = $form_display->getRenderer('field_gallery_items');
$widget_state = $widget->getWidgetState([], 'field_gallery_items', $form_state);
$widget->getWidgetState([], 'field_gallery_items', $form_state);
$items = $entity->get('field_gallery_items');
// Remove existing items.
while ($items->count()) {
$items->removeItem($items->count() - 1);
}
$widget_state['paragraphs'] = [];
$data = $this->getDataForCreatingParagraphs();
foreach ($data as $data_item) {
$paragraph = $this->entityTypeManager->getStorage('paragraph')->create([
'type' => 'media',
'field_caption' => $data_item->get('field_xxx')->value,
]);
$paragraph->save();
$widget_state['paragraphs'][] = [
'entity' => $paragraph,
'display' => $paragraph_module_display,
'mode' => 'edit',
];
$items->appendItem($paragraph);
}
$widget_state['items_count'] = count($widget_state['paragraphs']);
$widget_state['real_item_count'] = count($widget_state['paragraphs']);
$widget->setWidgetState([], 'field_gallery_items', $form_state, $widget_state);
$form['#parents'] = [];
$form['field_gallery_items'] = $widget->form($items, $form, $form_state);