Как я могу узнать, какая кнопка была нажата?


У меня есть форма с кнопками "Отправить" и "Отменить". В hook_submit(), как я узнаю, какая кнопка была нажата?

 14
Author: Adrian Cid Almaguer, 2011-07-20

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.

 25
Author: sanzante, 2020-04-06 06:43:41

$form_state['clicked_button']['#value'] сообщит вам, какая кнопка была нажата в форме.

 7
Author: iStryker, 2011-07-21 08:27:21

Сравните эти значения в $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
}
 3
Author: Shoaib Nawaz, 2011-07-20 14:33:26

Назовите кнопки атрибутом #name, например так:

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

, А затем используйте:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
 3
Author: user13097, 2012-03-04 02:37:12

ОБНОВЛЕНИЕ 2016 Drupal 8

Для тех, кто все еще пытается понять, как получить доступ к инициированному событию, вот решение Drupal 8.

$form_state->getTriggeringElement()

Это возвращает массив инициирующего элемента отправки. Если вы добавите разметку с именем #name, вы получите к ней доступ следующим образом.

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

Причина этого изменения заключается в том, что FormStateInterface теперь является файлом readOnly, в котором только классы, расширяющие FormStateInterface, могут обращаться к переменным. Так вы для доступа к переменной необходимо использовать методы доступа, такие как getTriggeringElement().

 3
Author: Neoaptt, 2017-08-26 00:18:58

В Drupal 8.4.4 $form_state->getTriggeringElement()['#name']; дает вам значение op. Когда вы ищете этот ключ в массиве значений состояния формы, вы получаете ключ #value элемента формы кнопки - другими словами, строку, которую конечные пользователи видят на кнопке на странице.

Я не знаю, является ли $form_state->getValues()['op'] универсальным для всех форм, но я жестко кодирую его в форме моего модуля.

 0
Author: user1359, 2018-02-19 18:55:07

Друпал 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

 0
Author: Yogesh Kushwaha, 2019-02-14 13:24:58