Как я могу узнать, какая кнопка была нажата?
У меня есть форма с кнопками "Отправить" и "Отменить". В hook_submit()
, как я узнаю, какая кнопка была нажата?
7 answers
Вы должны использовать $form_state->getTriggeringElement()
.
Лучше всего определить атрибут #name
для вашей кнопки, чтобы вы могли иметь это значение в triggering_element
.
Например:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
В этом примере:
$form_state->getTriggeringElement()['#name']
вернет "удалить" при вызове внутри public function submitForm(&$form, $form_state)
Если вы не определяете этот атрибут, triggering_element
будет удерживать кнопку #value
(текст, который пользователь может прочитать), но это не рекомендуется, так как другие модули могут изменить это значение или быть изменены локализацией).
Вы можете используйте $form_state['clicked_button']
тоже, но это устарело.
Вы можете прочитать дополнительную информацию на странице документации по функциям drupal_build_form.
$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.
ОБНОВЛЕНИЕ 2016 Drupal 8
Для тех, кто все еще пытается понять, как получить доступ к инициированному событию, вот решение 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