Làm cách nào để xác thực và gửi biểu mẫu bằng AJAX?


11

Tôi đã tạo một biểu mẫu web bằng API Mẫu. Tôi đang sử dụng #AJAXtùy chọn trường để thêm xác thực AJAX cho từng trường.

Có thể xác thực và gửi biểu mẫu bằng AJAX mà không cần tải lại trang. Nếu xác thực thất bại, tôi muốn hiển thị thông báo lỗi và nếu xác thực thành công thì tôi muốn hiển thị một thông báo (lý tưởng là trong hộp đèn) và đặt lại các trường mẫu.

Mã của tôi cho đến nay:

$form['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#default_value' => '',
    '#maxlength' => '128',
    '#required' => TRUE,
    '#ajax' => array(
        'callback' => '_validate_name',
        'wrapper' => 'name-error-icon-container',
        'method' => 'html',
        'effect' => 'none',
        'progress' => array(
            'message' => NULL,
        ),
    ),
);

$form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Submit',
    '#ajax' => array(
        'callback' => '_handle_form_submit',
        'effect' => 'fade',
    ),
);

chức năng gọi lại trông như thế này:

function _validate_name($form, $form_state) {

    if ($form_state['values']['name'] != '') {
    $output = 'OK';
    }
    else {
      $output = 'Enter a value';
    }

   return $output;

}

function _handle_form_submit($form, $form_state) {
}

Nhưng tôi không chắc chắn những gì cần có trong _handle_form_submitchức năng để xác thực và sau đó trả về một tin nhắn hoặc gửi biểu mẫu và đặt lại các trường?

Câu trả lời:


-2

Các mô-đun ví dụ có một hình thức ajax mà bạn có thể tham khảo cũng như nhiều người khác. Dưới đây là một liên kết đến ví dụ biểu mẫu ajax trong kho lưu trữ mã, nhưng tôi khuyên bạn nên tải xuống để tự mình xem xét việc thực hiện.


1
xin lỗi - tôi không thể tìm thấy bất kỳ ví dụ nào về tính hợp lệ của aj Wax trong mô-đun ví dụ
ErichBSchulz

Vâng, đó là một câu trả lời cồng kềnh ngay tại đó. Tôi thực sự không thấy bất kỳ xác nhận ở đó. Mỗi cuộc gọi lại chỉ đơn giản là trả về mẫu.
AlxVallejo

2
Làm thế nào đây là câu trả lời được chấp nhận? Nó thậm chí không nói nơi tìm trong liên kết được cung cấp (và dù sao liên kết không có ví dụ xác nhận).
robinmitra

Liên kết mới cho ví dụ về mẫu ajax: cgit.drupalcode.org/examples/tree/ajax_example/ chủ
Brentg

Tôi đã đưa ra câu trả lời của mình trên wiki, vì nó được chấp nhận nhưng chất lượng kém
rocketeerbkw

11

Tôi biết rằng đây là câu hỏi đã được đặt ra trong một vài năm nay, nhưng tôi không cảm thấy bất kỳ câu trả lời nào khác thực sự có ý nghĩa của việc nộp mẫu đơn aupax của Drupal 7, vì vậy tôi sẽ cố gắng giải thích nó.

Sinve biểu mẫu của bạn sẽ hoạt động tốt mà không có ajax vì theo thông lệ tốt, trình xử lý ajax của bạn sẽ không làm gì ngoài việc trả lại biểu mẫu. Mọi thứ khác nên có trong chức năng xác nhận và gửi của bạn.

function ex_form($form, $form_state) {
  $form['name'] = array(
    '#type' => 'textfield',
     '#title' => t('Name'),
     '#default_value' => '',
     '#maxlength' => '128',
     '#required' => TRUE,
  );

  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => 'Submit',
   '#ajax' => array(
     'callback' => 'ex_form_ajax_handler',
     'effect' => 'fade',
   ),
  );
}

function ex_form_submit(&$form, &$form_state) {
  // Submit logic - runs when validation is ok
  // You can alter the form here to be just a markup field if you want.
}

function ex_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function ex_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

có lẽ câu trả lời hay nhất
Andrew Kozoriz

Bạn có nói rằng các phương thức xác thực và gửi sẽ tự động được gọi cho một cuộc gọi lại AJAX trên nút gửi không? Theo thứ tự các phương thức được gọi là gì?
Jeff

3

Tôi nghĩ rằng bài đăng của maxtorete vào ngày 17 tháng 10 năm 2011 dường như đưa ra một ví dụ đầy đủ hơn bằng cách sử dụng cả hai form_validate()form_submit()

(Tôi chưa thử nó.)

Ngoài ra câu trả lời của Joshua Stewardson tại stack overflow có một ví dụ hoạt động tốt:

function dr_search_test_form($form, &$fstate) {

  $form['wrapper'] = [
    '#markup' => '<div id="test-ajax"></div>',
  ];

  $form['name'] = [
    '#type'     => 'textfield',
    '#required' => TRUE,
    '#title'    => 'Name',
  ];

  $form['submit'] = [
    '#type'  => 'submit',
    '#value' => 'Send',
    '#ajax'  => [
      'callback' => 'dr_search_test_form_callback',
      'wrapper'  => 'test-ajax',
      'effect'   => 'fade',
    ],
  ];

  return $form;
}

function dr_search_test_form_callback($form, &$fstate) {

  return '<div id="test-ajax">Wrapper Div</div>';
}

function dr_search_test_form_validate($form, &$fstate) {

  form_set_error('name', 'Some error to display.');
}

Joshua đưa ra quan điểm rằng các thông báo lỗi xác thực thay thế #ajax['wrapper']hoàn toàn phần tử để cuộc gọi lại của bạn cần cung cấp lại phần tử này khi bạn thay thế nó.


khi liên kết đó vô hiệu thì đó là một dấu hiệu câu hỏi không còn phù hợp nữa!
ErichBSchulz

2
bỏ phiếu là một chút khắc nghiệt - ngay cả khi đó chỉ là một liên kết - đó là một liên kết đến câu trả lời - không chỉ là một liên kết đến một mô-đun không có câu trả lời - không giống như câu trả lời được chấp nhận !! dù sao tôi đã cung cấp một số mã làm việc trong khi tôi đang bị hạ cấp.
ErichBSchulz

cảm ơn @ mbomb007 - đã sửa ngay bây giờ
ErichBSchulz

2

Nói chung, việc xác thực và xử lý gửi biểu mẫu nên diễn ra trong các cuộc gọi lại _validate () và _submit () thông thường. Ý tưởng là các hình thức vẫn nên hoạt động mà không có ajax.

Khá nhiều điều duy nhất mà các cuộc gọi lại #ajax nên làm là trả về phần của biểu mẫu cần được thay thế, theo trình bao bọc được xác định.


2
Hãy cẩn thận với từ ngữ của bạn. Cuộc gọi lại sẽ trả về MẪU WHOLE, được xây dựng lại từ form_state. Trả lại một phần của mẫu đơn là quan niệm sai lầm lớn nhất về Drupal / AHAH. Xem katbailey.net/blog/ahah-drupal-may-it-one-day-live-its-acronym .

7
Câu hỏi này là về Drupal 7 ... AHAH không còn tồn tại trong Drupal. Trong #ajaxchức năng gọi lại trong Drupal 7, bạn chỉ trả lại phần của biểu mẫu mà bạn muốn thay thế.
Clive

1
@ChrisD. Như Clive đã đề cập, Đây là Drupal 7 và hiện tại chúng ta có một khung ajax khá đẹp, cho phép thực hiện tất cả các loại công cụ ưa thích như trả lại nhiều phần biểu mẫu riêng biệt, v.v.
Berdir

@Clive Tôi tình cờ gặp một vấn đề khác liên quan đến ajax drupal.stackexchange.com/a/142316/19205 trong đó tác giả đã đề cập "hình thức cần phải được xây dựng lại sau khi mục_count được thay đổi" cũng dành cho d7. Tôi đã nhầm lẫn với, tuyên bố nào là đúng (mà không tranh luận ai đúng :-)). Bạn có thể vui lòng chia sẻ một số thông tin về điều này?
kiranking

0

Có hai cách

1)

function abc_form_validate(&$form, &$form_state) {
  // Validation logic - invalidate using form_set_error() or form_error()
}

function abc_form_ajax_handler(&$form, &$form_state) {
  return $form;
}

2) Mô-đun ví dụ http://cgit.drupalcode.org/examples/tree/ajax_example/ajax_example.module?id=refs/heads;id2=7.x-1.x#l402


Bây giờ tôi không biết câu trả lời của bạn chính xác đến mức nào, nhưng định dạng của nó chắc chắn cần được cải thiện (nếu bạn không muốn nó bị xóa bởi người kiểm duyệt). Kiểm tra trang trợ giúp nếu cần hoặc chỉ sử dụng một số nút soạn thảo wysiwyg để ít nhất đánh dấu mã của bạn là ... mã.
Pierre.Vriens

Mã không được định dạng chính xác không phải là một lý do để xóa một câu trả lời. Nó chỉ yêu cầu người dùng có đặc quyền chỉnh sửa để sửa nó.
kiamlaluno

Tôi đến đây, tuyệt vọng, tìm kiếm một giải pháp, chỉ 2 năm sau câu trả lời này, đã nhấp vào một liên kết dẫn tôi đến một cây / nhánh không tồn tại. Vui lòng không sử dụng các liên kết trên các câu trả lời hoặc nếu bạn dán nội dung tại thời điểm viết.
MacK

0

Trong trường hợp của tôi, việc sử dụng một submitloại khiến biểu mẫu luôn được gửi, vì vậy tôi đã thay đổi nó thành một buttonvới #ajaxchỉ định. Sau đó, tôi phải thực hiện xác nhận của mình trong cuộc gọi lại ajax.

Tôi đã làm một khung ctools; Tôi không biết nếu nó chơi vào nó.

function mymodule_form($form, &$form_state) {
  ...
  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Subscribe'),
    '#ajax' => array(
      'callback' => '_mymodule_ajax',
    ),
  );
  return $form;
}

function _mymodule_ajax($form, &$form_state) {
  if ( ! valid_email_address($form_state['values']['email']) ) {
    form_set_error($form, t('Please enter a valid email address.'));
  } else {
    $form = array(
      '#markup' => t('You have subscribed.'),
    );
  }
  return $form;
}
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.