Tôi đang có một thực thể có thể nhập trường với trường tham chiếu đến các đoạn văn trường_đoạn
và một đoạn_type có trường tham chiếu đến sự kiện content_type trường_sự kiện
.
Những gì tôi đang cố gắng trong biểu mẫu thực thể là có một nút trong biểu mẫu con sự kiện đoạn_type mà khi nhấp vào sẽ điền trước trường_sự kiện
của đoạn_kiểu có nội dung. Hình thức hiển thị của trường_sự kiện
sử dụng một entity_browser để cho phép người dùng cũng chọn hoặc bỏ chọn các sự kiện được thêm theo chương trình theo cách thủ công và tôi đoán đây là nơi tôi bị kẹt.
Tôi nghĩ rằng tôi khá gần với giải pháp, hãy để tôi thử mô tả:
Khi nhấp vào nút, các sự kiện đã thêm sẽ không hiển thị, nếu tôi sử dụng entity_browser ngay bây giờ để chèn một sự kiện, thì tất cả các sự kiện mà tôi đã thêm theo chương trình sẽ hiển thị.
Vì vậy, bằng cách nào đó, tôi cần nói với entity_browser trong cuộc gọi lại của mình để trả về danh sách đã cập nhật, tôi đoán vậy (Tôi là người mới bắt đầu sử dụng Drupal, vì vậy hãy cứ thoải mái với tôi) mà không làm như vậy? Ý tôi là chỉ cần thêm các tham chiếu và để "biểu mẫu xây dựng lại độc lập với màn hình biểu mẫu" ... Tôi không biết, đây là mã cho đến nay:
/**
* Triển khai hook_field_widget_WIDGET_TYPE_form_alter().
*/
chức năng module_field_widget_paragraphs_form_alter(&$element, &$form_state, $context) {
switch ($element['#paragraph_type']) {
trường hợp 'sự kiện':
$replace_id = $element['subform']['field_events']['widget']['#id'];
$element["subform"]['add_tomorrows_events_button'] = [
'#type' => 'nút',
'#thuộc tính' => [
'name' => 'add_tomorrows_events',
],
'#value' => t('Thêm sự kiện ngày mai'),
'#ajax' => [
'gọi lại' => 'module_insert_tomorrows_events_into_paragraph_events',
'trình bao bọc' => $replace_id,
'phương pháp' => 'thay thế',
'sự kiện' => 'nhấp chuột',
]
];
nghỉ;
mặc định:
// mã số...
nghỉ;
}
}
/**
* Gọi lại Ajax.
*/
chức năng module_insert_tomorrows_events_into_paragraph_events( &$form, FormStateInterface &$form_state) {
/* Lấy chỉ mục của đoạn văn trong field_paragraphs */
$triggering_element = $form_state->getTriggeringElement();
$paragraph_index = $triggering_element["#parents"][1];
/* Hiện tại chỉ cần thử thêm 10 sự kiện */
$results = \Drupal::entityQuery('nút')
->điều kiện('loại', 'sự kiện')
-> phạm vi (0, 10)
->thực thi();
/* Ở đây, tôi đang cố tạo chuỗi giống như trong khóa target_id của tiện ích con
e.G "nút:3213 nút:54354 nút:432423"
*/
$ target_ids = "";
foreach ($kết quả là $res) {
$target_ids .= " nút:".$res;
}
$form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"]["target_id"]['#value'] = $target_ids;
/* chỉ những thứ khác tôi đã thử */
/*$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);
*/
/* đã cố cập nhật EB nhưng `hiện tại` không được cập nhật :/
$t = EntityReferenceBrowserWidget::updateWidgetCallback($form, $form_state);
return $t["field_paragraphs"]["widget"][$paragraph_index]["subform"]["field_events"]["widget"];
*/
return $form["field_paragraphs"]['widget'][$paragraph_index]["subform"]["field_events"]["widget"];
}
TL; DR: Các sự kiện được thêm vào nhưng entity_form/entity_browser không được cập nhật trực quan, sau khi sử dụng entity_browser, tất cả các sự kiện được thêm theo chương trình sẽ được hiển thị, làm cách nào để hiển thị chúng ở vị trí đầu tiên?