Điểm:0

xây dựng lại một biểu mẫu với ajax (đã giải quyết)

lá cờ gb

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?

cocq avatar
lá cờ gb
Tôi đã giải quyết được hai vấn đề. Để thay thế tiện ích hiện có (tức là : để tránh tạo tiện ích mới): hãy sử dụng id của div của tiện ích, không phải id của chính tiện ích đó. Để thay thế mảng tùy chọn: chọn "html" làm phương thức thay vì "thay thế".

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.