Làm thế nào tôi có thể biết nút nào được nhấp?


12

Tôi có một biểu mẫu với nút "Gửi" và nút "Hủy". Trong hook_submit(), làm thế nào để tôi biết nút nào được nhấp?


Bạn đang nói về hook_submit()hoặc một trình xử lý biểu mẫu? Một trình xử lý biểu mẫu không phải là việc thực hiện hook_submit().
kiamlaluno

Câu trả lời:


23

Bạn phải sử dụng triggering_elementtừ $form_state['triggering_element'].

Thực hành tốt nhất là xác định một #namethuộc tính cho nút của bạn, vì vậy bạn có thể có giá trị này trong triggering_element.

Ví dụ:

$form['delete'] = array(
  '#type' => 'submit',
  '#value' => t('Delete'),
  '#name' => 'delete',
);

Nếu bạn không xác định thuộc tính triggering_elementnày sẽ giữ nút #value(văn bản mà người dùng có thể đọc), nhưng điều này không được khuyến khích vì các mô-đun khác có thể thay đổi giá trị này hoặc bị thay đổi bởi nội địa hóa).

Bạn có thể sử dụng $form_state['clicked_button']quá, nhưng điều này không được chấp nhận .

Bạn có thể đọc thêm thông tin tại trang tài liệu chức năng drupal_build_form .


7

$form_state['clicked_button']['#value'] sẽ cho bạn biết nút nào đã được bấm vào biểu mẫu.


$form_state['clicked_button']['#value']:)
dùng1359

1
Tôi muốn thêm, nếu bạn có (các) trường bắt buộc trên biểu mẫu của bạn và chúng không được điền vào, thì Drupal sẽ đưa ra lỗi xác thực mẫu (form_submit được gọi sau form_validate). Bạn cần phải làm một cái gì đó như devengineering.com/best-practices/drupal/ triệt
iStryker

Đó là một điểm hay!
dùng1359

5
Mặc dù "clicked_button" vẫn hoạt động, nhưng nó đã bị phản đối trong D7 và đề xuất là sử dụng "triggerering_element" để thay thế. Tôi nhớ có một số lỗi #ajax (tôi nghĩ) chỉ ảnh hưởng đến mã đã sử dụng "clicked_button", vì vậy đó là một lý do nữa để sử dụng "triggerering_element". Và sau tất cả, nó chỉ là một khóa khác trong $ form_state.
Bojan Zivanovic

1
Trong khi phương pháp này hoạt động, nó không được chấp nhận và dễ gặp vấn đề. Xem câu trả lời của áo dài cho cách chính xác 7 Drupal để làm điều này.
Alice Heaton

3

So sánh các giá trị này trong $form_stateTôi đã và đang làm trong Drupal 6 và sẽ giống nhau trong Drupal7

if($form_state['values']['ok'] == $form_state]['clicked_button']['#value']){
    //Process if OK is pressed
}else if($form_state['values']['cancel'] == $form_state]['clicked_button']['#value']) {
    //Process if Cancel is pressed
}

Nếu tôi nhớ chính xác Drupal 6 $ form_state] ['X'] bây giờ là $ form_state ['X'] trong Drupal 7
iStryker

Tại sao bạn cần so sánh hai giá trị này?
iStryker

Nếu hình thức chứa nhiều nút gửi. So sánh này sẽ giúp khác nhau nút nào được sử dụng để gửi biểu mẫu trong một trình xử lý gửi duy nhất. $ form_state ['clicked_button'] ['# value'] = t ('Có') sẽ dẫn đến các giá trị khác nhau khi thiết lập đa ngôn ngữ.
Shoaib Nawaz

Một so sánh duy nhất là tốt nhất để tránh tất cả các so sánh ngôn ngữ trong thiết lập đa ngôn ngữ. :)
Shoaib Nawaz

1
@iStryker Tôi không chắc ý của bạn với bình luận đầu tiên của bạn.
kiamlaluno

3

Đặt tên cho các nút với #namethuộc tính, như thế này:

$form['delete'] = array(
    '#type' => 'submit',
    '#value' => t('Delete'),
    '#name' => 'delete',
);

và sau đó sử dụng:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

Vì vậy, đối với một biểu mẫu có hai nút gửi như thế này: $ form ['submit'] = mảng ('#type' => 'submit', '#name' => 'submit-1', '#value' => t ('Gửi1'),); $ form ['submit2'] = mảng ('#type' => 'submit', '#name' => 'submit-2', '#value' => t ('submit2'),); Chúng ta chỉ cần kiểm tra $ form_state-> getTriggeringEuity () ['# name'] trong hàm submitForm ()?
Gaius

3

CẬP NHẬT 2016 Drupal 8

Đối với những người vẫn đang cố gắng tìm ra cách truy cập sự kiện được kích hoạt ở đây là giải pháp Drupal 8.

$form_state->getTriggeringElement()

Điều này trả về mảng của phần tử trình kích hoạt. Nếu bạn thêm một đánh dấu được gọi #namethì bạn sẽ truy cập nó theo cách sau.

$button_clicked = $form_state->getTriggeringElement()['#name']

Lý do đằng sau sự thay đổi này FormStateInterfacelà bây giờ là một readOnlytệp trong đó chỉ các lớp mở rộng FormStateInterfacecó thể truy cập các biến. Vì vậy, bạn phải sử dụng các phương thức accessor như getTriggeringElement()để truy cập vào biến.


Tôi có một bản cập nhật cho Drupal 8.4.4 vào năm 2018: drupal.stackexchange.com/a/256112/1441
user1359

0

Trong Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];cung cấp cho bạn giá trị củaop . Khi bạn tìm khóa đó trong mảng giá trị của trạng thái biểu mẫu, bạn sẽ nhận được #valuekhóa của phần tử biểu mẫu nút - nói cách khác, chuỗi mà người dùng cuối nhìn thấy trên nút trên trang.

Tôi không biết nếu $form_state->getValues()['op']là phổ quát cho tất cả các hình thức, nhưng tôi khó mã hóa nó dưới dạng mô-đun của mình.


0

Drupal 8.6.7

Tạo nút một cái gì đó như dưới đây.

$form['my_button'] = [
    '#type' => 'button',
    '#value' => t('Custom Button'),
    '#name' => t('customButton'),
    '#weight' => 0,
    '#attributes' => [
      'class' => ['populate-bib-button', 'btn', 'btn-primary'],
    ],
  ];

Trong chức năng gửi của bạn có được tên nút như dưới đây mã.

$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton

So sánh có thể được thực hiện như thế nào

if ($input['_triggering_element_name'] == 'customButton') {
  // Do something.
}

# Drupal8

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.