Làm cách nào để mô phỏng tất cả các chức năng AJAX khi biểu mẫu được hiển thị sau khi gọi lại AJAX?


7

Tôi có một hình thức Drupal, nhưng tôi đang thêm nó vào trang như là kết quả của một cuộc gọi lại AJAX.

Tôi cần hình thức này để kích hoạt một cuộc gọi lại mới. Mã của tôi dưới đây:

      $form['#suffix'] = '<div id="form-return-message-box">this is the return box</div>';
  $form['#attached']['js'] = array('misc/ajax.js');

  $form['markup'] = array(
    '#type' => 'markup',
    '#markup' => '<h2>This is a form</h2>'
  );


  $form['button'] = array(
    '#type' => 'button',
    '#value' => t('Submit'),
    '#ajax' => array(
      'callback' => 'module_myform_callback',
      'wrapper' => 'form-return-message-box',
      'method' => 'replace',
      'effect' => 'fade',
    ),
  );

  $replace_layer = '#somelayer';

  $commands = array();
  $commands[] = ajax_command_replace($replace_layer, drupal_render($form));
  $page = array(
    '#type' => 'ajax',
    '#commands' => $commands,
  );

  ajax_deliver($page);

Vì vậy, đây là những gì xảy ra: biểu mẫu này đang được thêm vào một thùng chứa có tên là 'somelayer' đã tồn tại trên trang (Tôi đã không thêm phần mã đó vì tôi nghĩ rằng nó sẽ không cần thiết). Nó được gọi từ một liên kết với lớp 'use-ajax'.

Vì vậy, biểu mẫu hiển thị trên trang như mong muốn sau khi gọi lại AJAX được kích hoạt bởi liên kết. Phần này hoạt động ổn.

Nhưng đây là phần (rất) khó khăn: Tôi cũng muốn duy trì chức năng AJAX mẫu mới (kiểm tra phần '#ajax' của mảng), điều này không xảy ra. Sau khi biểu mẫu được hiển thị, nút sẽ không kích hoạt bất kỳ mã AJAX nào. Bằng cách nhấp vào nó, trang sẽ làm mới, không kích hoạt chức năng gọi lại (không được thêm vào đây để bảo toàn không gian).

Bằng cách xem xét mã nguồn của trang biểu mẫu thông thường với AJAX, bạn sẽ thấy mã như thế này cho phép chức năng AJAX:

"ajax":{"edit-something":{"callback":"module_formname_callback","wrapper":"wrapper-name","method":"replaceWith","effect":"fade","event":"change","url":"\/spabear\/system\/ajax" ...

Bằng cách xem mã nguồn của biểu mẫu được thêm vào trang của tôi, tôi có thể thấy không có đoạn <script></script>mã nào có thể kích hoạt cuộc gọi lại AJAX ở dạng được tải động của tôi. Làm cách nào tôi có thể mô phỏng tất cả các chức năng AJAX khi biểu mẫu được hiển thị sau khi gọi lại AJAX?


1
Bạn đã giải quyết điều này? Tôi đang gặp một vấn đề rất giống nhau: drupal.stackexchange.com/questions/155527/iêu
cambraca

Có lẽ liên quan đến drupal.org/node/1781242 ?
berbler

1
Đây có phải là 8 drupal?
Matt

Câu trả lời:



0

Hãy thử thêm 'ngăn' => 'nhấp' vào #ajax của bạn. Điều này sẽ ngăn biểu mẫu gửi và làm mới trang. Sau đó, nó sẽ dễ dàng hơn một chút để gỡ lỗi vấn đề.

    $ form ['button'] = mảng (
      '#type' => 'nút',
      '#value' => t ('Gửi'),
      '#ajax' => mảng (
        'gọi lại' => 'module_myform_callback',
        'trình bao bọc' => 'biểu mẫu trả về hộp thư',
        'phương thức' => 'thay thế',
        'hiệu ứng' => 'mờ dần',
        'ngăn chặn' => 'nhấp chuột',
      ),
    );

0

Kiểm tra xem biểu mẫu của bạn có thư viện phù hợp kèm theo. Vì vậy, khi nó đang được tải vào một trang, nó sẽ đảm bảo các thư viện đó có thể truy cập được cho các hành vi được xác định của nó.

Tôi giả sử theo câu hỏi ban đầu của bạn rằng bạn đang ở D7:

  $form['#attached']['library'][] = array('system', 'drupal.ajax');
  $form['#attached']['library'][] = array('system', 'jquery.form');

Tôi không chắc chắn với ví dụ mã của bạn, nhưng bạn cũng nên cố gắng nhiều nhất có thể để phân tách trách nhiệm. Bạn nên có một chức năng để tạo biểu mẫu của mình, một chức năng để gửi biểu mẫu của bạn, một chức năng để tải và gửi biểu mẫu của bạn thông qua ajax, v.v ...

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.