Respostas:
Você deve usar o triggering_element
de $form_state['triggering_element']
.
A melhor prática é definir um #name
atributo para o seu botão, para que você possa ter esse valor no triggering_element
.
Por exemplo:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
Se você não definir esse atributo triggering_element
, os botões serão pressionados #value
(o texto que o usuário pode ler), mas isso é desencorajado, pois outros módulos podem alterar esse valor ou serem alterados pela localização.
Você também pode usar $form_state['clicked_button']
, mas isso foi preterido .
Você pode ler mais informações na página de documentação da função drupal_build_form .
$form_state['clicked_button']['#value']
dirá qual botão foi clicado no formulário.
$form_state['clicked_button']['#value']
:)
Compare esses valores no que $form_state
venho fazendo no Drupal 6 e seria o mesmo no 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
}
Nomeie os botões com o #name
atributo, assim:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
e então use:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
Para aqueles que ainda estão tentando descobrir como acessar o evento acionado, aqui está a solução Drupal 8.
$form_state->getTriggeringElement()
Isso retorna a matriz do elemento de envio acionador. Se você adicionar uma marcação chamada #name
, poderá acessá-la da seguinte maneira.
$button_clicked = $form_state->getTriggeringElement()['#name']
A razão por trás dessa alteração é que FormStateInterface
agora é um readOnly
arquivo no qual apenas as classes que se estendem FormStateInterface
podem acessar as variáveis. Então você tem que usar métodos acessadores como getTriggeringElement()
para acessar a variável.
No Drupal 8.4.4, $form_state->getTriggeringElement()['#name'];
você obtém o valor de op
. Ao procurar essa chave na matriz de valores do estado do formulário, você obtém a #value
chave do elemento de formulário do botão - em outras palavras, a sequência que os usuários finais veem no botão da página.
Não sei se $form_state->getValues()['op']
é universal para todos os formulários, mas estou codificando-o no formulário do meu módulo.
Drupal 8.6.7
Botão Criar algo como abaixo.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
Na sua função de envio, obtenha o nome do botão como no código abaixo.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
A comparação pode ser feita como
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()
ou é um manipulador de envio de formulários? Um manipulador de envio de formulário não é a implementação dehook_submit()
.