Як я можу знати, яку кнопку було натиснуто?


12

У мене є форма з кнопками «Надіслати» та «Скасувати». В hook_submit(), як я знаю , яка кнопка була натиснута?


Ви говорите hook_submit()чи обробник форми подання форми? Обробник подання форми не є реалізацією hook_submit().
kiamlaluno

Відповіді:


23

Ви повинні використовувати 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 .


7

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


$form_state['clicked_button']['#value']:)
user1359

1
Мені подобається додати, якщо у вас є потрібні поля у вашій формі, і вони не заповнені, то ви Drupal викинете помилку перевірки форми (form_submit викликається після form_validate). Вам потрібно зробити щось на кшталт цього devengineering.com/best-practices/drupal/…
iStryker

Це хороший момент!
user1359

5
Хоча "clicked_button" все ще працює, у D7 воно застаріле, і рекомендується замість цього використовувати "alarm__element". Я пам’ятаю, були деякі помилки #ajax (я думаю), які впливали лише на код, який використовував "clickked_button", тому це ще одна причина використовувати "запускати_елемент". Зрештою, це просто інший ключ у $ form_state.
Боян Живанович

1
Хоча цей підхід працює, він застарілий і схильний до проблем. Дивіться відповідь туніки щодо правильного способу виконання Drupal 7.
Аліса Хітон

3

Порівняйте ці значення, які $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
}

Якщо я пам'ятаю правильний Drupal 6 $ form_state] ['X'] зараз $ form_state ['X'] в Drupal 7
iStryker

Чому вам потрібно порівняти ці два значення?
iStryker

Якщо форма містить кілька кнопок подання Це порівняння допоможе розрізнити, яка кнопка використовується для надсилання форми в одному обробнику подання. $ form_state ['clicked_button'] ['# value'] = t ('Так') призведе до різних значень при багатомовній установці.
Shoaib Nawaz

Єдине порівняння найкраще уникати всіх мовних порівнянь у багатомовній програмі. :)
Shoaib Nawaz

1
@iStryker Я не впевнений, що ти маєш на увазі під своїм першим коментарем.
kiamlaluno

3

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

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

а потім скористайтеся:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.

Тож для форми з двома кнопками подання на зразок цієї: $ form ['submit'] = array ('#type' => 'submit', '#name' => 'submit-1', '#value' => t ('Submit1'),); $ form ['submit2'] = array ('#type' => 'submit', '#name' => 'submit-2', '#value' => t ('Submit2'),); Ми просто повинні перевірити $ form_state-> getTriggeringElement () ['# ім'я'] у функції submitForm ()?
Гай

3

ОНОВЛЕННЯ 2016 Drupal 8

Для тих, хто все ще намагається з'ясувати, як отримати доступ до викликаної події, тут є рішення Drupal 8.

$form_state->getTriggeringElement()

Це повертає масив запускаючого елемента подання. Якщо ви додасте розмічену назву, #nameви отримаєте доступ до неї наступним чином.

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

Причиною цієї зміни є те, що FormStateInterfaceзараз readOnlyфайл, у якому лише класи, що розширюють, FormStateInterfaceможуть отримати доступ до змінних. Тож вам доведеться використовувати методи доступу, як getTriggeringElement()для доступу до змінної.


У мене є оновлення для Drupal 8.4.4 в 2018 році: drupal.stackexchange.com/a/256112/1441
user1359

0

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

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


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.