Tóm lại, tôi sử dụng ajax trên một trường biểu mẫu, được thiết kế với giao diện người dùng drupal. Nó được khai báo như thế này:
$form['field_unite_de_recherche']['widget']['#ajax'] = mảng(
'gọi lại' => 'ajax_equipes_from_unites_callback',
'sự kiện' => 'thay đổi',
'phương pháp' => 'thay thế',
'trình bao bọc' => 'chỉnh sửa trường-thiết bị-membre2',
);
Trong chức năng gọi lại, tôi truy xuất một số giá trị trong cơ sở dữ liệu từ giá trị đã chọn trong field_unite_de_recherche :
$đã chọn = $form_state->getValue('field_unite_de_recherche');
$query = \Drupal::database()->select(...);
$result = $query->execute();
trong khi ($row = $result->fetchAssoc()) {
$options[] = $row['title'];
}
Sau đó, trong chức năng gọi lại này, tôi xây dựng phiên bản mới của tiện ích con:
$form['field_equipe_membre2'] = [
'#type' => 'chọn',
'#title' => 'Trang bị membre2',
'#options' => $options,
];
trả về $form['field_equipe_membre2'];
Lần đầu tiên tôi chọn một giá trị trong trường "field_unite_de_recherche", trường "field_equipe_membre2" được xây dựng lại với các giá trị phù hợp từ cơ sở dữ liệu.
Với một lựa chọn mới trong trường "field_unite_de_recherche", các giá trị được truy xuất tốt từ cơ sở dữ liệu, nhưng trường "field_equipe_membre2" không được cập nhật với các giá trị mới.
Tôi chắc chắn rằng các giá trị được lấy tốt từ lựa chọn thứ hai này vì tôi ghi chúng vào một tệp như sau
$handle = fopen('debug.txt','w');
trong khi ($row = $result->fetchAssoc()) {
$options[] = $row['title'];
fputs($handle, $row['title']."\n");
}
fclose($xử lý);
Câu hỏi đặt ra là: tại sao "field_equipe_membre2" chỉ được xây dựng lại lần đầu tiên?
Tôi đỏ một số tin nhắn trên diễn đàn này:
- Lệnh "xây dựng lại" là không cần thiết vì nó được "bao gồm" trong ajax
chỉ huy
- không có bộ đệm cho ajax
Tôi cũng xem xét mô-đun ví dụ ajax, nhưng chúng không liên quan đến cách hook
Ai đó có thể cho tôi một lời khuyên?
Ngoài ra, ngay cả với
'phương pháp' => 'thay thế',
trong khai báo ajax, tôi đã không thành công trong việc tránh tạo trường "field_equipe_membre2" mới trong biểu mẫu. tôi đã cố gắng trở lại
$form['field_equipe_membre2']['#options']
mà không có bất kỳ thành công.Làm thế nào để thay thế cái hiện có, không tạo cái mới?