如何在 AJAX 处理程序 Drupal 8 中以编程方式为段落字段创建新小部件

问题描述 投票:0回答:2

我需要以编程方式将段落字段添加到 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 时我添加了一个段落。

我怎样才能做到这一点?

php ajax drupal drupal-8
2个回答
0
投票

尝试将段落附加到表单字段

$form['field_gallery_items']['widget']->appendItem($paragraph3);


0
投票

我知道这个问题太老了,但是很难找到有效的例子 我已经根据 2 个链接创建了可行的解决方案

  1. https://www.drupal.org/forum/support/module-development-and-code-questions/2021-01-06/adding-empty-items-to-a-paragraphs

  2. https://www.drupal.org/forum/support/module-development-and-code-questions/2015-09-05/drupal-8-equivalent-to-field_attach#comment-14580016

将此代码放入 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);
© www.soinside.com 2019 - 2024. All rights reserved.