Рейтинг:0

entity_form как программно добавлять ссылки и визуально обновлять форму (entity_browser)

флаг gr

У меня есть полевой объект со ссылкой на абзацы field_paragraphs и параграф_тип со ссылкой на событие content_type field_events.

То, что я пытаюсь в форме объекта, - это иметь кнопку в подформе события para_type, которая при нажатии предварительно заполняет field_events параграфа_типа с содержимым. Отображение формы field_events использует entity_browser, чтобы позволить пользователю также вручную выбирать или отменять выбор программно добавленных событий, и я предполагаю, что именно здесь я застрял.

Я думаю, что я довольно близок к решению, позвольте мне попытаться описать:

При нажатии кнопки добавленные события не отображаются, если я сейчас использую entity_browser для вставки события, отображаются все события, которые я добавил программно.

Так что мне как-то нужно сказать entity_browser в моем обратном вызове, чтобы он вернул обновленный список, я думаю (я новичок в Drupal, поэтому, пожалуйста, будьте со мной полегче). Но я понятия не имею, как это сделать, и я думаю, что это должно быть возможно без этого? Я имею в виду просто добавить ссылки и позволить «форме перестраиваться независимо от отображения формы»… Я не знаю, вот код:

/**
 * Реализует hook_field_widget_WIDGET_TYPE_form_alter().
 */
function module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {

  переключатель ($элемент['#paragraph_type']) {
   дело «события»:

      $replace_id = $element['subform']['field_events']['widget']['#id'];

      $element["subform"]['add_tomorrows_events_button'] = [
        '#type' => 'кнопка',
        '#атрибуты' => [
          'имя' => 'add_tomorrows_events',
        ],
        '#value' => t('Добавить завтрашние события'),
        '#ajax' => [
          'обратный вызов' => 'module_insert_tomorrows_events_into_paragraph_events',
          'обертка' => $replace_id,
          'метод' => 'заменить',
          'событие' => 'щелчок',
        ]
      ];

     сломать;

   По умолчанию:
     // код...
     сломать;
 }

}

/**
 * Обратный вызов Ajax.
 */
function module_insert_tomorrows_events_into_paragraph_events(&$form, FormStateInterface &$form_state) {

  /* Получить индекс абзаца в field_paragraphs */
  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parents"][1];


  /* Пока просто попробуйте добавить 10 событий */
  $results = \Drupal::entityQuery('узел')
  ->условие('тип', 'событие')
  -> диапазон (0, 10)
  ->выполнить();

  /* Здесь я пытаюсь построить строку, как в ключе target_id виджета 
     например "узел: 3213 узел: 54354 узел: 432423"
  */
  $target_ids = "";
  foreach ($ результаты как $ res) {
    $target_ids .= "узел:".$res;
  }


  

  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;

  /* просто другие вещи, которые я пробовал */
  /*$form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#default_value'] = $target_ids;*/
  /* $form_state->setValue(['field_paragraphs', $paragraph_index, 'subform', 'field_events', 'target_id'], $target_ids);
  $form_state->setRebuild(true);
    */
/* пытался обновить EB, но `current` не обновляется :/
   $t = EntityReferenceBrowserWidget::updateWidgetCallback($form, $form_state); 
   return $t["field_paragraphs"]["виджет"][$paragraph_index]["подформа"]["field_events"]["виджет"];
*/




  return $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"];
}

TL;DR: события добавляются, но entity_form/entity_browser визуально не обновляется, после использования entity_browser отображаются все программно добавленные события, как их отобразить в первую очередь?

Рейтинг:0
флаг gr

I got it working, i´m sharing this if anybody stumbles across the same, in the end it was trivial with using ReplaceCommand and InvokeCommand

function module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {
  switch ($element['#paragraph_type']) {
    case 'paragraph_events':

      // Add the button only if the paragraph-subform is expanded.
      if ($element['top']['summary']['fields_info']['#expanded']) {
        $element["subform"]['add_tomorrows_events_button'] = [
          '#type' => 'button',
          '#attributes' => [
            'name' => 'add_tomorrows_events',
          ],
          '#value' => t('insert tomorrows events'),
          '#ajax' => [
            'callback' => '_module_insert_tomorrows_events_into_paragraph_events',
            'event' => 'click',
          ],
        ];
      }

      break;


      ...

and the callback

function _module_insert_tomorrows_events_into_paragraph_events(&$form, FormStateInterface $form_state): AjaxResponse {

  $triggering_element = $form_state->getTriggeringElement();
  $paragraph_index = $triggering_element["#parents"][1];


  // Load results from view.
  $view = Views::getView('events');
  if (!$view || !array_key_exists('tomorrows_events', $view->storage->get('display'))) {
    return "view \"events\" or display \"tomorrows_events\" is missing";
  }

  $view->setDisplay('tomorrows_events');
  $view->execute();
  $results = $view->result;

  $target_ids = "";
  foreach ($results as $res) {
    $target_ids .= " node:" . $res->nid;
  }


  $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;
  $response = new AjaxResponse();

  $sel = '#' . $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id']["#id"];
  $response->addCommand(new ReplaceCommand($sel, $form["field_paragraphs"]["widget"][$paragraph_index]["subform"]['field_events']['widget']['target_id']));
  $response->addCommand(new InvokeCommand($sel, 'trigger', ['entity_browser_value_updated']));

  return $response;

}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.