Am o entitate fieldable cu un câmp de referință la paragrafe field_paragraphs
și un paragraph_type cu un câmp de referință la evenimentul content_type field_events
.
Ceea ce încerc în formularul de entitate este să am un buton în subformularul de eveniment paragraph_type, care la clic precompletează field_events
de tip_paragraf cu conținut. Afișarea formularului de field_events
folosește un entity_browser pentru a permite utilizatorului să aleagă și să deselecteze manual evenimentele adăugate programatic și cred că aici sunt blocat.
Cred că sunt destul de aproape de soluție, lasă-mă să încerc să descriu:
Când dau clic pe butonul, evenimentele adăugate nu sunt vizibile, dacă folosesc entity_browser acum pentru a insera un eveniment, toate evenimentele pe care le-am adăugat programatic sunt afișate.
Așa că, cumva, trebuie să spun entity_browser din apel invers să returneze lista actualizată, cred (sunt un începător Drupal, așa că vă rog să mă ușurezi) Dar nu am nicio idee cum să fac acest lucru, de asemenea, cred că ar trebui să fie posibil fara a face asta? Adică doar adăugați referințele și lăsați „reconstruirea formularului independent de afișarea formularului”... Nu știu, aici este codul de până acum:
/**
* Implementează hook_field_widget_WIDGET_TYPE_form_alter().
*/
funcția module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {
comutator ($element['#paragraph_type']) {
caz „evenimente”:
$replace_id = $element['subform']['field_events']['widget']['#id'];
$element["subform"]['add_tomorrows_events_button'] = [
'#type' => 'buton',
'#attributes' => [
'name' => 'add_tomorrows_events',
],
'#value' => t('Adăugați evenimente de mâine'),
'#ajax' => [
'callback' => 'module_insert_tomorrows_events_into_paragraph_events',
'wrapper' => $replace_id,
'method' => 'înlocuiește',
'eveniment' => 'clic',
]
];
pauză;
Mod implicit:
// cod...
pauză;
}
}
/**
* apel invers Ajax.
*/
funcția module_insert_tomorrows_events_into_paragraph_events( &$form, FormStateInterface &$form_state) {
/* Obține indexul paragrafului în field_paragraphs */
$triggering_element = $form_state->getTriggeringElement();
$paragraph_index = $triggering_element["#parinti"][1];
/* Momentan, încearcă să adaugi 10 evenimente */
$rezultate = \Drupal::entityQuery('nod')
->condition('tip', 'eveniment')
->interval(0, 10)
->execute();
/* Aici încerc să construiesc șirul așa cum este în cheia target_id a widget-ului
de ex. „nod:3213 nod:54354 nod:432423”
*/
$target_ids = "";
foreach ($rezultate ca $res) {
$target_ids .= " nod:".$res;
}
$form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;
/* doar alte lucruri pe care le-am încercat */
/*$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);
*/
/* am încercat să actualizez EB, dar `current` nu este actualizat :/
$t = EntityReferenceBrowserWidget::updateWidgetCallback($form, $form_state);
returnează $t["field_paragraphs"]["widget"][$paragraph_index]["subform"]["field_events"]["widget"];
*/
returnează $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"];
}
TL;DR: Evenimentele sunt adăugate, dar entity_form/entity_browser nu este actualizat vizual, după folosirea entity_browser toate evenimentele adăugate programatic sunt afișate, cum să le afișați în primul rând?