У меня есть полевой объект со ссылкой на абзацы 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 отображаются все программно добавленные события, как их отобразить в первую очередь?