it-swarm-vi.com

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

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 cách nào để biết nút nào được nhấp?

12
user1359

Bạn phải sử dụng $form_state->getTriggeringElement().

Cách thực hành tốt nhất là xác định thuộc tính #name Cho nút của bạn, để bạn có thể có giá trị này trong triggering_element.

Ví dụ:

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

Trong ví dụ này: $form_state->getTriggeringElement()['#name'] sẽ trả về "xóa" khi được gọi trong public function submitForm(&$form, $form_state)

Nếu bạn không xác định thuộc tính này triggering_element 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ũng có thể sử dụng $form_state['clicked_button'], Nhưng đây là không dùng nữa .

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

23
sanzante

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

7
iStryker

So sánh các giá trị này trong $form_state Tôi đã làm trong Drupal 6 và sẽ giống như vậy 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
}
3
Shoaib Nawaz

Đặt tên cho các nút bằng #name thuộ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.
3
user13097

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 là #name Thì 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 là FormStateInterface hiện là tệp readOnly trong đó chỉ các lớp mở rộng FormStateInterface có thể truy cập các biến. Vì vậy, bạn phải sử dụng các phương thức truy cập như getTriggeringElement() để truy cập biến.

3
Neoaptt

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

0
Yogesh Kushwaha

Trong Drupal 8.4.4 $form_state->getTriggeringElement()['#name']; cung cấp cho bạn giá trị của op. 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 #value phím của phần tử dạng 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ạng mô-đun của mình.

0
user1359