Ответы:
Вы должны использовать 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()
Это возвращает массив инициирующего элемента submit. Если вы добавите разметку с названием, #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']
универсален ли он для всех форм, но я жестко кодирую его в форме моего модуля.
Drupal 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()
.