Drupal AJAX chỉ bắn một lần


7

Trong Drupal 7, tôi có một hình thức mà tôi muốn làm như sau:

  • Hiển thị danh sách các tùy chọn trong bảng hai cột đơn giản
  • Chọn một hành động từ danh sách thả xuống sẽ kích hoạt AJAX và thay thế các tùy chọn trong bảng

Tôi có mã được viết và Drupal chỉ đăng các giá trị lên AJAX vào lần đầu tiên bạn chọn. Điều này chỉ không hoạt động trên các loại 'mặt hàng'? Lưu ý, cũng có các biểu mẫu khác trên trang, nhưng ID biểu mẫu là duy nhất như các trường biểu mẫu.

$form['new_date'] = array(
            '#type' => 'select',
            '#title' => 'Delivery Date',
            '#options' => $date,
            '#ajax' => array(
                'callback' => 'delivery_date_weekends',
                'wrapper' => 'dates-ajax',
                'method' => 'replace',
                'effect' => 'fade',
            ),
        );

$form['date_weekend'] = array(
                '#type' => 'item',
                '#prefix' => '<div id="dates-ajax">',
                '#suffix' => '</div>',
                '#markup' => '',
          );

Sau đó, trong cuộc gọi lại AJAX, dữ liệu được trả về với #markup được đặt thành chủ đề ('bảng') của kết quả. Nó chỉ hoạt động lần đầu tiên, tôi thấy dữ liệu POST trong bảng điều khiển Fireorms. Chọn một tùy chọn thả xuống khác, bảng của tôi không cập nhật.

Tôi đã làm điều gì sai ở đây?

Chỉnh sửa: có vẻ như POST đang thực hiện, nhưng phản hồi trống, nhưng không nên.

Chỉnh sửa 2: Gọi lại Ajax:

function delivery_date_weekends($form, $form_state) {

    $query = new EntityFieldQuery();
    $result = $query->entityCondition('entity_type', 'field_collection_item')
        ->propertyCondition('item_id', $form_state['values']['rates'])
        ->fieldCondition('field_delivery_basis', 'value', 'Weekly', '=');

    $startmonth = strtotime(date('m', $form_state['values']['new_date']).'/01/'.date('Y'));
    $endmonth = strtotime('+1 month', $startmonth);

    $query->fieldCondition('field_delivery_date_period', 'value', $startmonth, '>=')
                ->fieldCondition('field_delivery_date_period', 'value', $endmonth, '<=');

    $result = $query->execute();

    if ($result) {
        $headers = array(
            array('data' => 'Weekend', 'class' => 'tableHeader-processed'),
            array('data' => '', 'class' => 'tableHeader-processed'),
        );

        $rates = entity_load('field_collection_item', array_keys($result['field_collection_item']));

        foreach ($rates as $key => $rate) {
            if ($rate->field_delivery_available['und'][0]['value']) {
                $rows[] = array('data' => array(date('M j, Y', $rate->field_delivery_date_period['und'][0]['value']), array('data' => 'delivery link', 'class' => array('fee'))));
            } else {
                $rows[] = array('data' => array(date('M j, Y', $rate->field_delivery_date_period['und'][0]['value']), array('data' => 'Not Available!')));
            }
        }

        $form['booking_weekend']['#markup'] = theme('table', array('header' => $headers, 'rows' => $rows, 'sticky' => FALSE));
    } else {
        $form['booking_weekend']['#markup'] = 'No delivery weekends exist for this month. Please select another date.';
    }

    return $form['booking_weekend'];
}

Về cơ bản khi một tháng / năm được chọn, tôi đang truy vấn ngày (bên trong bộ sưu tập trường).


Bạn có thể cập nhật câu hỏi của bạn với mã delivery_date_weekends()không?
Clive

Đã thêm cuộc gọi lại
Kevin

Câu trả lời:


5

Thật khó để nói mà không thực sự chạy các truy vấn đó nhưng tôi nghĩ vấn đề chỉ là do sự chênh lệch trong tên của các thành phần biểu mẫu của bạn.

Trong biểu mẫu của bạn, phần tử được xác định là $form['date_weekend']nhưng trong phần gọi lại của bạn, bạn đặt phần tử được gọi $form['booking_weekend'].

Điều này có thể sẽ ổn trừ việc $form['booking_weekend']không có #prefix#suffixđiều đó $form['date_weekend']không xảy ra. Drupal thay thế toàn bộ phần tử trình bao bọc khi nó thay thế AJAX vì vậy nếu phần tử mới không có trình bao bọc có cùng ID xung quanh thì cuộc gọi AJAX tiếp theo sẽ không hoạt động (vì không có phần tử nào tồn tại với ID chính xác).

Tôi khuyên bạn nên thay đổi tên thành phần để khớp vì điều này sẽ giải quyết vấn đề, nhưng nếu bạn thực sự cần nó là một thành phần khác, chỉ cần thêm trình bao bọc xung quanh thành phần mới trong cuộc gọi lại của bạn:

// The rest of delivery_date_weekends() comes before this as normal...

  $form['booking_weekend']['#markup'] = theme('table', array('header' => $headers, 'rows' => $rows, 'sticky' => FALSE));
} else {
    $form['booking_weekend']['#markup'] = 'No delivery weekends exist for this month. Please select another date.';
}

$form['booking_weekend']['#prefix'] = '<div id="dates-ajax">';
$form['booking_weekend']['#suffix'] = '</div>';

return $form['booking_weekend'];

Được rồi, tôi đã sửa tất cả và chúng là nhất quán. Nó vẫn chỉ hoạt động ở lần đầu tiên, sau đó lần thứ hai trường không cập nhật và không có dữ liệu trong phản hồi (và nên có). Các truy vấn hoạt động tốt. Ngay cả khi nó không có kết quả, nó vẫn sẽ trả về đánh dấu 'Không giao hàng vào cuối tuần ...'.
Kevin

Liệu nó có cố gắng thay thế nó lần thứ hai, tức là nó có thực hiện hoạt ảnh mờ dần và chỉ thay thế nó bằng cùng một bảng không? Và nếu không bạn có nhận được bất kỳ lỗi js trong giao diện điều khiển?
Clive

Không có lỗi, không thay thế, dường như không có gì xảy ra. Dữ liệu vẫn được đăng. Phản hồi hoàn toàn trống rỗng, gần như thể Drupal biết nó nên làm gì đó, nhưng không phải là gì. Bởi 'trống rỗng' Ý tôi là tôi chỉ thấy các lệnh chung được trả về, nhưng tất cả các giá trị đều là null và nó chỉ có mục 0 (thường có 3).
Kevin

Kevin, bạn đã bao giờ làm điều này để làm việc? Tôi gặp vấn đề tương tự khi cuộc gọi ajax sẽ chỉ kích hoạt một lần. Và không bao giờ một lần nữa cho đến khi trang được tải lại.
Brandon Bearden

Có tôi đã làm. Đảm bảo bạn trả về đúng các phần tử trong hàm gọi lại AJAX để nó vẫn bị ràng buộc với phần tử biểu mẫu khi được kết xuất lại. Tôi nghĩ đó là vấn đề của tôi.
Kevin

0

Tôi đã vật lộn với vấn đề tương tự, và cuối cùng đã tìm thấy giải pháp ở đây:

Drupal thay thế toàn bộ phần tử trình bao bọc khi nó thay thế AJAX vì vậy nếu phần tử mới không có trình bao bọc có cùng ID xung quanh thì cuộc gọi AJAX tiếp theo sẽ không hoạt động (vì không có phần tử nào tồn tại với ID chính xác).

Rất đơn giản, nhưng tôi đã quên nó. Sau khi sửa lỗi div-id biến mất :) Cảm ơn, Clive!

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.