Відповіді:
Ви повинні використовувати triggering_element
від $form_state['triggering_element']
.
Найкраща практика - визначити #name
атрибут для вашої кнопки, щоб ви могли мати це значення у triggering_element
.
Наприклад:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
Якщо ви не визначите цей атрибут, triggering_element
буде утримуватися кнопка #value
(текст, який користувач може прочитати), але це не рекомендується, оскільки інші модулі можуть змінити це значення або змінитись локалізацією).
Ви також можете використовувати $form_state['clicked_button']
, але це застаріло .
Детальну інформацію можна прочитати на сторінці документації щодо функцій drupal_build_form .
$form_state['clicked_button']['#value']
підкаже, яка кнопка була натиснута на форму.
$form_state['clicked_button']['#value']
:)
Порівняйте ці значення, які $form_state
я робив у Drupal 6, і були б однакові в 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
}
Назвіть кнопки з #name
атрибутом, як це:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
а потім скористайтеся:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
Для тих, хто все ще намагається з'ясувати, як отримати доступ до викликаної події, тут є рішення Drupal 8.
$form_state->getTriggeringElement()
Це повертає масив запускаючого елемента подання. Якщо ви додасте розмічену назву, #name
ви отримаєте доступ до неї наступним чином.
$button_clicked = $form_state->getTriggeringElement()['#name']
Причиною цієї зміни є те, що FormStateInterface
зараз readOnly
файл, у якому лише класи, що розширюють, FormStateInterface
можуть отримати доступ до змінних. Тож вам доведеться використовувати методи доступу, як getTriggeringElement()
для доступу до змінної.
У Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];
надається значення op
. Коли ви шукаєте цей ключ у масиві значень стану форми, ви отримуєте #value
ключ елемента елемента форми - іншими словами, рядок, який бачать кінцеві користувачі на кнопці на сторінці.
Я не знаю, чи $form_state->getValues()['op']
є універсальним для всіх форм, але я важко кодую це у формі свого модуля.
Друпал 8.6.7
Створіть кнопку як-небудь нижче.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
У функції подання отримайте назву кнопки, як наведено нижче коду.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
Порівняння можна зробити так
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()
чи обробник форми подання форми? Обробник подання форми не є реалізацієюhook_submit()
.