Hình thức xây dựng lại SAU cuộc gọi lại ajax đã chạy


7

Tôi có một biểu mẫu với một nút mà khi nhấn sẽ xây dựng lại một phần khác của biểu mẫu thông qua yêu cầu ajax.

Khi nhấp vào nút, biểu mẫu được xây dựng lại, sau đó cuộc gọi lại ajax của tôi được gọi để lưu các giá trị từ biểu mẫu và sau đó trả về một phần của biểu mẫu.

Vấn đề là biểu mẫu được xây dựng lại TRƯỚC KHI gọi lại của tôi để lưu các giá trị và thay đổi cách thức biểu mẫu được tạo.

Nếu tôi nhấp vào nút ajax lần thứ hai thì nó hoạt động chính xác như có các giá trị từ yêu cầu ajax trước đó khi biểu mẫu được xây dựng.

Làm cách nào để chức năng gọi lại của tôi chạy trước khi biểu mẫu được xây dựng lại?

function emtr_shift_plan_form($form, &$form_state) {

    ddl('build'); // log that this function is being called

    $form['save'] = array(
        '#type' => 'button',
        '#submit' => array('emtr_shift_plan_form_ajax_submit'),
        '#value' => 'Save',
        '#ajax' => array(
            'callback' => 'emtr_shift_plan_form_ajax_submit',
            'wrapper' => 'postions',
        ),
        '#id' => 'ajax-save-form-values',
    );

    $form['postions'] = array(
        '#type' => ' container',
        '#prefix' => '<div id="postions">',
        '#suffix' => '</div>',
    );

    // code here to populate the positions container

}

function emtr_shift_plan_form_ajax_submit($form, &$form_state) {

    ddl('ajax submit'); // log the ajax callback is being called

    $form_state['rebuild'] = TRUE; // As the form has already been rebuilt at this point what effect can this have?!?

    emtr_shift_plan_form_save($form, $form_state); // save the values

    // This is the point at which I want the form to be rebuilt

    return $form['positions'];

}

BIÊN TẬP:

Như một giải pháp thay thế, tôi thấy có thể tự xây dựng lại biểu mẫu lần thứ hai trong cuộc gọi lại ajax với $form = drupal_rebuild_form('emtr_shift_plan_form', $form_state);, nhưng dường như không hiệu quả khi xây dựng biểu mẫu hai lần. Tôi có thể trao đổi thứ tự của các sự kiện này thay vì có biểu mẫu xây dựng hai lần cho mỗi yêu cầu ajax không?


2
Bạn nên thực hiện 'tiết kiệm' trong chức năng gửi. Các cuộc gọi lại Ajax thường chỉ trả về phần tử biểu mẫu. Có thể điều này cũng sẽ khắc phục vấn đề của bạn.
2pha

Câu trả lời:


2

Tôi biết câu hỏi này đã 3 tuổi, nhưng tôi đã gặp nó trong khi tìm kiếm một vấn đề tương tự.

Bạn sẽ cần phải sửa đổi cách tiếp cận của bạn để làm việc này. Thứ tự các hoạt động khi bạn gửi yêu cầu AJAX là:

  1. Gọi lại AJAX bị sa thải. Trong AJAX, bạn sẽ muốn lưu lại dữ liệu. Đánh dấu nó trong $form_statebiến của bạn .
  2. Hình thức được xây dựng lại.
  3. Gọi lại AJAX bị sa thải.

Tôi đã làm việc lại mã của bạn một chút để chứng minh.

// AJAX FLOW: 2. Form rebuild is fired.
function emtr_shift_plan_form($form, &$form_state) {

    ddl('build'); // log that this function is being called

    $form['save'] = array(
        '#type' => 'button',
        '#submit' => array('emtr_shift_plan_form_button_submit'),
        '#value' => 'Save',
        '#ajax' => array(
            'callback' => 'emtr_shift_plan_form_ajax',
            'wrapper' => 'postions',
        ),
        '#id' => 'ajax-save-form-values',
    );

    $form['postions'] = array(
        '#type' => ' container',
        '#prefix' => '<div id="postions">',
        '#suffix' => '</div>',
    );

    // code here to populate the positions container
    if (isset($form_state['saved_values'])) {
      // do stuff.
    }
}

// AJAX FLOW: 1. Button submit is fired.
function emtr_shift_plan_form_button_submit($form, &$form_state) {

  // log the ajax callback is being called
  ddl('ajax submit');

  // save the values. Make sure the data is stored somehow so your form can get at it.
  $form_state['saved_values'] = emtr_shift_plan_form_save($form, $form_state);

  // rebuild flag here will trigger emtr_shift_plan_form() to be run
  $form_state['rebuild'] = TRUE;
}

// AJAX FLOW: 3. Button callback is fired.
function emtr_shift_plan_form_ajax($form, &$form_state) {
    return $form['positions'];
}

Hy vọng rằng sẽ làm sáng tỏ một số người.


2

Bạn có thể thử như thế này làm cho trình khác nhau và gọi lại khác nhau và xem nếu nó giúp.

$form['save'] = array(
    '#type' => 'button',
    '#submit' => array('emtr_shift_plan_form_ajax_submit'),
    '#value' => 'Save',
    '#ajax' => array(
        'callback' => 'emtr_shift_plan_form_ajax',
        'wrapper' => 'postions',
    ),
    '#id' => 'ajax-save-form-values',
);

function emtr_shift_plan_form_ajax($form, &$form_state){
  return $form['positions'];
}
function emtr_shift_plan_form_ajax_submit($form, &$form_state) {

    ddl('ajax submit'); // log the ajax callback is being called

    $form_state['rebuild'] = TRUE; // As the form has already been rebuilt at this point what effect can this have?!?

    emtr_shift_plan_form_save($form, $form_state); // save the values

    // This is the point at which I want the form to be rebuilt
}

Cảm ơn lời đề nghị của bạn nhưng dường như không có sự khác biệt nào. Nút đó thực sự không cần một trình xử lý trình nếu nó có một cuộc gọi lại ajax được xác định.
Đêm giao thừa

Đây thực sự là câu trả lời đúng cùng với nhận xét 2pha: các hàm gọi lại ajax chỉ trả về đầu ra. Bất kỳ hành động nào khác phải được thực hiện trong một hàm gửi (nếu phần tử là nút hoặc tương đương) hoặc trong các hàm trả về biểu mẫu (hoặc bất kỳ hàm thay đổi nào). Vì vậy, câu hỏi không phải là làm thế nào để xây dựng lại sau khi gọi lại, là làm thế nào để thực hiện bất kỳ tính toán nào trước chức năng gọi lại ajax. Giả định sai ở đây là nghĩ rằng hàm gọi lại ajax là hàm gửi: chỉ là một hàm trả về đầu ra: một đoạn mẫu hoặc các lệnh AJAX.
sanzante
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.