Nhiều nút gửi: Cái nào được nhấn?


7

Đây có thể là một bản sao của những điều sau đây: Gửi nhiều hình thức , nhưng tôi không thể tìm ra câu trả lời áp dụng cho tình huống của tôi như thế nào. Vì vậy, đây là câu hỏi của tôi (tôi thừa nhận) câu hỏi khá giống nhau:

Tôi có một bảng với một hàng dữ liệu, mỗi hàng có một nút gửi. Nó có thể trông giống như thế này:

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#submit' =>  array('f_submit'),
  );
}

Tức là biểu mẫu bao gồm một chuỗi các hàng, được trích xuất từ ​​cơ sở dữ liệu, tôi muốn tạo một cuộc gọi lại gửi lên giá trị của trường tương ứng nidvà in ra giá trị của nó. Tôi đoán tôi đang hỏi những gì để đặt bình luận dưới đây là gì.

function f_submit($form, &$form_state) {
  // Here I want to print the value of the relevant nid field
}

1
Vấn đề liên quan đến Drupal.org . Hai bình luận cuối cùng đặc biệt thú vị
Clive

Câu trả lời:


6

Dữ liệu về nút bấm được lưu trữ trong $form_state['triggering_element']. Bạn có thể lấy ID nút bằng cách nhìn vào $form_state['triggering_element']['#parents']. Trong trường hợp của bạn, ID nút sẽ là mục thứ hai trong mảng cha. Xin lưu ý rằng thuộc tính tên của định nghĩa trường cần được xác định và duy nhất. Nếu không, phần tử kích hoạt sẽ trỏ đến nút gửi cuối cùng trên biểu mẫu. Tôi sẽ thay đổi mã của bạn như sau:

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#name' => 'submit-' . $row['nid'],
    '#submit' =>  array('f_submit'),
  );
}

Cách tốt để xem $form_statelà cài đặt mô-đun Devel (cho krumo()) và sau đó đặt krumo($form_state);drupal_exit();lên trên trình xử lý trình. Điều này sẽ in ra một cây dữ liệu có cấu trúc đẹp.


1
Gọi tốt khi sử dụng Devel, nhưng $form_state['clicked_button']luôn chứa nid cuối cùng là phần tử cha thứ 2, không phải là phần tử liên quan đến nút được nhấp (tôi vừa thử nó). Điều tương tự với $form_state['triggering_element'], mà tôi nghĩ là được ưu tiên trong Drupal 7 (nhưng không thể tìm thấy tài liệu tham khảo để sao lưu ngay bây giờ)
Clive

2
Quên nói rằng #name cần được xác định và duy nhất trên nút gửi. Nếu không nó sẽ hành xử như bạn mô tả. Bạn đã đúng về việc sử dụng kích hoạt_element, clicked_button không được dùng nữa. Thông tin về điều đó tại api.drupal.org/api/drupal/includes%21form.inc/feft/ . Tôi cập nhật câu trả lời.
Lauri

1

Đặt thuộc #nametính của từng thành phần gửi thành một giá trị duy nhất như của bạn $row['nid']. Giá trị duy nhất này có thể được truy cập từ chức năng gửi thông qua $form_state['clicked_button']['#name'].


0

Tôi đã vật lộn với điều này trong một thời gian và đưa ra cách giải quyết này. Tôi muốn có hai nút gửi riêng biệt với hành vi hơi khác nhau. Tôi cũng muốn thêm và xóa chúng bằng jQuery.

Vì vậy, tôi đã làm điều này.

Tạo hai nút với tên duy nhất.

    $form['edit-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Reclassify Selected'),
        '#name' => 'default-submit'
    );

    $form['classify-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Re-classify'),
        '#name' => 'classify-submit'
    );

Ẩn nút mà tôi muốn sử dụng động.

    $(document).ready(function() {
        // Hide the classify button
        $('#edit-classify-submit').css('display', 'none');
    });

Sao chép nút đó khi cần vào các vị trí khác trong biểu mẫu và trang.

    $('#edit-classify-submit').clone().appendTo('.my-form').css('display', 'inline-block')

Có vẻ như nếu bạn không thêm định nghĩa nút thông qua khai báo biểu mẫu drupal thì nó sẽ không ở dạng $ ['trigger_element'].

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.