Tôi đã tạo một tiện ích con "tạo" các trường dựa trên tùy chọn đã chọn của một trường được chọn.
Tôi đã hoàn thành hầu hết logic:
1- Một tùy chọn được chọn từ trường này:
$element['value'] = [
'#type' => 'chọn',
'#options' => $this->getBreakpointsGroups(),
'#default_value' => $value,
'#ajax' => [
'callback' => [$this,'updateBreakpoint'], // đừng quên :: khi gọi một phương thức của lớp.
'sự kiện' => 'thay đổi',
'wrapper' => $wrapper_id, // Phần tử này được cập nhật với lệnh gọi lại AJAX này.
'phương thức' => 'html',
]
];
2-Sau đó, hàm updateBreakpoint được thực thi và nó tiến hành cập nhật biểu mẫu. Trước tiên, tôi trích xuất giá trị trình bao bọc trong trường hợp có nhiều biểu mẫu tiện ích để nó không nhắm mục tiêu một phiên bản khác có cùng biểu mẫu.
$state = $form_state->getTriggeringElement();
$wrapper_id = $state['#ajax']['wrapper'];
3- Sau khi thực hiện một số thay đổi đối với biểu mẫu, tôi trả lại các thay đổi và sử dụng lệnh AJAX
$ajax_response = AjaxResponse mới();
$ajax_response->addCommand(new HtmlCommand("div#{$wrapper_id}", $form['image_fieldset']));
trả về $ajax_response;
Trình bao bọc được xác định bên trong hàm formElement theo cách sau:
$wrapper_id = Html::getUniqueId('trình bao bọc');
Vấn đề là không có thay đổi nào được thực hiện. Khi tôi xác định $wrapper_id là một chuỗi không có bất kỳ hàm id duy nhất nào (ví dụ: 'trình bao bọc'), các thay đổi sẽ được thực hiện.Tôi bối rối không biết tại sao. Tôi đảm bảo kiểm tra giá trị của trình bao bọc vẫn tồn tại ở tất cả các biểu mẫu.