Điểm:0

Làm cách nào để bỏ qua việc gọi hàm xác thực tùy chỉnh trong biểu mẫu có menu thả xuống AJAX?

lá cờ in

Tôi đang sử dụng Drupal không đầu với phần mềm trung gian .NET. Tôi có một mẫu Drupal 9.Biểu mẫu này chứa hai phần tử thả xuống được điền tùy thuộc vào giá trị được chọn trong trình đơn thả xuống thứ ba. Tôi có trình xử lý xác thực tùy chỉnh ngay sau các phần tử thả xuống AJAX đó, nơi tôi lưu trữ một số dữ liệu trong cơ sở dữ liệu .NET.

Đây là mã của tôi cho hook_form_alter().

$form['technology_type'] = [
  '#type' => 'chọn',
  '#title' => t('Loại công nghệ'),
  '#options' => $tech_type_options,
  '#default_value' => $t_selected_option,
  '#ajax' => [
    'callback' => 'techlistDropdownCallback',
    'trình bao bọc' => 'techlist-fieldset-container',
    'sự kiện' => 'thay đổi',
  ],    
];

nếu ($t_sselected_option != '') {
  $tech_options = mảng(0 => '- Không -');
  $tech_options = custom_authorization_tech_options($t_selected_option);
}
khác {
  $tech_options = mảng(0 => '- Không -');
}

$form['techlist-select-fieldset-container']= [
  '#type' => 'thùng chứa',
  '#attribut' => ['id' => 'techlist-fieldset-container'],
];

$form['techlist-select-fieldset-container']['source_tech'] = [
  '#type' => 'chọn',
  '#title' => t('Công nghệ nguồn'),
  '#options' => $tech_options,
  '#default_value' => !empty($source_tech_value) ? $source_tech_value : $form_state->getValue('source_tech'),
  '#multiple' => đúng,
];

$form['techlist-select-fieldset-container']['target_tech'] = [
  '#type' => 'chọn',
  '#title' => t('Công nghệ mục tiêu'),
  '#options' => $tech_options,
  '#default_value' => !empty($target_tech_value) ? $target_tech_value : $form_state->getValue('target_tech'),
  '#multiple' => đúng,
];

nếu ($t_sselected_option == 0) {
  $form['techlist-select-fieldset-container']['source_tech']['#title'] = t('Nguồn Tech (Bạn phải chọn loại tech trước)');
  $form['techlist-select-fieldset-container']['source_tech']['#disabled'] = TRUE;
  $form['techlist-select-fieldset-container']['target_tech']['#title'] = t('Target Tech (Bạn phải chọn loại tech trước)');
  $form['techlist-select-fieldset-container']['target_tech']['#disabled'] = TRUE;
}

array_unshift($form['#validate'],'custom_authorization_mak_form_validate');

Bất cứ khi nào các menu thả xuống phụ thuộc này chứa đầy các giá trị, chức năng xác thực sẽ được gọi bằng cách nào đó và dữ liệu không đầy đủ sẽ tự động được lưu trữ trong cơ sở dữ liệu ngay cả khi không nhấn nút lưu của biểu mẫu.

Làm cách nào để tránh vấn đề kỳ lạ này?

Tôi chỉ muốn điền vào các phần tử thả xuống bằng AJAX, sau đó gọi trình xử lý xác thực để lưu trữ dữ liệu trong cơ sở dữ liệu.

apaderno avatar
lá cờ us
*Drupal không đầu* có nghĩa là Drupal không được sử dụng để hiển thị các trang cũng như biểu mẫu cho người dùng. Mã của bạn đang thay đổi một biểu mẫu Drupal không nên hiển thị cho người dùng. Ngoài ra, *headless Drupal* không ghi vào các bảng cơ sở dữ liệu được tạo bởi phần mềm khác.
sonfd avatar
lá cờ in
Bạn có nên ghi vào bảng sau khi biểu mẫu đã được gửi thành công không? Không phải trong quá trình xác nhận?
taggartJ avatar
lá cờ cn
Trong thực tế, xác thực được gọi mỗi khi có thay đổi ajax, bạn nên thay đổi mã xác thực tùy chỉnh của mình để kiểm tra xem các giá trị có tồn tại hay không nếu chạy xác thực nếu không
Raja Chakraborty avatar
lá cờ in
Xin chào @apaderno, Vui lòng tìm giải thích rõ ràng của tôi- 1. Drupal không đầu có nghĩa là Drupal không được sử dụng để hiển thị các trang cũng như biểu mẫu cho người dùng - Giao diện người dùng của ứng dụng của tôi chứa một menu điều hướng người dùng đến các biểu mẫu drupal. 2. Drupal không đầu không ghi vào các bảng cơ sở dữ liệu được tạo bởi phần mềm khác - Trong chức năng xác thực, tôi có một api đăng dữ liệu biểu mẫu lên cơ sở dữ liệu .net
Raja Chakraborty avatar
lá cờ in
Xin chào @taggartJ, chức năng xác thực có được gọi mọi lúc khi có lệnh gọi ajax không?
apaderno avatar
lá cờ us
Nếu người dùng tiếp xúc với các trang hoặc biểu mẫu Drupal, thì đó không phải là Drupal không đầu. Có, trình xử lý xác thực và gửi cũng được gọi khi có liên quan đến AJAX; ngay cả phương thức trình tạo biểu mẫu cũng được gọi sau sự kiện AJAX.
taggartJ avatar
lá cờ cn
vâng nó nên làm có
Điểm:0
lá cờ cn

Để ngăn việc gửi biểu mẫu khi biểu mẫu được gửi bằng AJAX (khi bạn thay đổi trạng thái của biểu mẫu bằng AJAX), trong trình xử lý xác thực, hãy sử dụng $form_state->setRebuild();

Đă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.