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?
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?
Câu trả lời:
Bạn phải sử dụng triggering_element
từ $form_state['triggering_element']
.
Thực hành tốt nhất là xác định một #name
thuộ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_element
nà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 .
$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']
:)
So sánh các giá trị này trong $form_state
Tô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
}
Đặt tên cho các nút với #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.
Đố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 #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 FormStateInterface
là bây giờ là một readOnly
tệp 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 accessor như getTriggeringElement()
để truy cập vào biến.
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 #value
khó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.
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
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ệnhook_submit()
.