Tôi có thể sử dụng ajax để nhắm mục tiêu nhiều yếu tố hình thức từ một đầu vào không?


8

Tôi đang cố gắng sử dụng ajax để cập nhật hai phần khác nhau của biểu mẫu drupal chỉ từ một hình mờ đầu vào.

Tôi có công cụ ajax tiêu chuẩn trên đầu vào của mình:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

Điều này đang hoạt động tốt, hoán đổi div của tôi khi đầu vào được cập nhật ... tuy nhiên tôi cũng muốn cập nhật một hình thức nhập khác ở dạng khác với mã khác do kết quả mờ trên đầu vào ban đầu của tôi.

Điều này có thể, bất kỳ ý tưởng?

Chỉnh sửa: Để rõ ràng, đây là ví dụ thế giới thực của tôi:

  • Loại nội dung 'phim'
  • Đã thêm trường 'chính_title'
  • Khi 'sơ cấp' được cập nhật, kiểm tra gọi lại ajax của tôi cho các chuỗi tương tự và trả về html.
  • Html từ cuộc gọi lại được chèn vào một div trống.

    Phần đó đang hoạt động rất tốt!

Tôi cũng đang cố gắng sửa đổi đầu vào 'tiêu đề' của nút tiêu chuẩn, cung cấp cho nó giá trị của 'primary_title' sau khi tôi đã thực hiện một số biểu thức chính để dọn dẹp chuỗi (loại bỏ "The" hoặc "A" khỏi đầu, v.v.) sẽ là hai trường tiêu đề, một trường có tiêu đề hoàn chỉnh 'sơ cấp' và một 'tiêu đề' được cắt xén sẽ hữu ích cho việc sắp xếp và hiển thị các bản ghi.


Câu trả lời:


13

Dường như bạn có thể nhắm mục tiêu các phần khác nhau của biểu mẫu bằng các lệnh ajax, tuy nhiên bạn phải chọn chỉ trả về một trong hai:

  • HTML hoặc

  • Một mảng có thể kết xuất hoặc

  • Một mảng các lệnh AJAX

Trong tình huống ban đầu tôi đã viết, tôi đã cố gắng trả về cả một mảng các lệnh AJAX một mảng có thể kết xuất, điều này dường như không thể.

Mã trong mô-đun ví dụ thể hiện việc nhắm mục tiêu các phần khác nhau của biểu mẫu bằng cách sử dụng một mảng các lệnh AJAX:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

Trong mẫu mã này, #html_div đang nhận $ text và riêng #html_status sẽ nhận được "Cập nhật html_command_example với text = $ text;". ngày ('r'). ""

Hai vị trí khác nhau trên một biểu mẫu với hai mẩu thông tin khác nhau từ một cuộc gọi lại ajax!

Nhìn lại những gì tôi đang làm, tôi nhận ra rằng tôi không cần phải trả lại trường tiêu đề nút. Nó sẽ chỉ là một trường tiện ích, được sử dụng để sắp xếp dữ liệu trong danh sách.

Tôi đã ẩn trường trên biểu mẫu nút và nó được điền vào lần thứ hai biểu mẫu của tôi được tạo khi gọi lại ajax ban đầu của tôi được kích hoạt.


0

Tôi còn khá mới với Drupal nhưng cho đến nay tôi thấy khung công tác Ajax khá không linh hoạt. Nó hoạt động tuyệt vời miễn là bạn sử dụng nó như dự định. Vì vậy, trong trường hợp của bạn, nếu bạn biết một số JS, điều tốt nhất sẽ là làm cho kịch bản đó trở thành chính nó, nó sẽ rất nhẹ.

Chúc may mắn!


Cảm ơn lời đề nghị :) Tôi đã nhận ra rằng tôi hoàn toàn không cần phải trả về trường tiêu đề nút vì đơn giản là nó được sử dụng như một trường tiện ích để sắp xếp danh sách. Nó được điền khi biểu mẫu của tôi được xây dựng lại do kết quả của cuộc gọi lại ajax hiện tại của tôi.
Rick

0

Một lựa chọn khác, từ drupal.org :

Bạn có thể dễ dàng thay thế toàn bộ biểu mẫu nếu điều đó là dễ nhất. Chỉ cần thêm #prefix và #suffix vào toàn bộ mảng biểu mẫu, sau đó đặt đó là #ajax ['Wrapper']. (Điều này sẽ cho phép bạn thay đổi nhiều thành phần biểu mẫu thông qua một lệnh gọi ajax duy nhất.) Lý do duy nhất để không làm điều này là quá trình này nhanh hơn nếu truyền ít thông tin hơn.

Funciton gọi lại của bạn có thể đơn giản như:

function _callback($form, $form_state) {
  return $form;
}

Điều đó nên được gọi từ một #ajaxmảng trên một phần tử biểu mẫu ( field_whateverví dụ bên dưới) được xác định trong một hook_form_FORM_ID_alter()(hoặc một loại móc thay đổi biểu mẫu) trong đó bạn cũng kiểm tra $form_statevà thực hiện các thay đổi cho $formmảng, như:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.