Risposte:
È necessario utilizzare il triggering_elementda $form_state['triggering_element'].
La migliore pratica è definire un #nameattributo per il tuo pulsante, in modo da poter avere questo valore in triggering_element.
Per esempio:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
Se non si definisce questo attributo triggering_elementconterrà il pulsante #value(il testo che l'utente può leggere), ma questo è sconsigliato in quanto altri moduli possono cambiare questo valore o essere modificati dalla localizzazione).
Puoi $form_state['clicked_button']anche usare , ma questo è deprecato .
Puoi leggere maggiori informazioni nella pagina di documentazione della funzione drupal_build_form .
$form_state['clicked_button']['#value'] ti dirà quale pulsante è stato fatto clic sul modulo.
$form_state['clicked_button']['#value']:)
Confronta questi valori in $form_stateHo fatto in Drupal 6 e sarebbe lo stesso in 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
}
Assegna un nome ai pulsanti con l' #nameattributo, in questo modo:
$form['delete'] = array(
'#type' => 'submit',
'#value' => t('Delete'),
'#name' => 'delete',
);
e quindi usa:
$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
Per coloro che stanno ancora cercando di capire come accedere all'evento attivato, ecco la soluzione Drupal 8.
$form_state->getTriggeringElement()
Ciò restituisce l'array dell'elemento di invio del trigger. Se aggiungi un markup chiamato, accederai #namenel modo seguente.
$button_clicked = $form_state->getTriggeringElement()['#name']
Il motivo dietro questa modifica è che FormStateInterfaceora è un readOnlyfile in cui solo le classi estese FormStateInterfacepossono accedere alle variabili. Quindi devi usare metodi getTriggeringElement()di accesso come per accedere alla variabile.
In Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];ti dà il valore di op. Quando cerchi quella chiave nell'array dei valori dello stato del modulo, ottieni la #valuechiave dell'elemento del modulo pulsante, in altre parole, la stringa che gli utenti finali vedono sul pulsante nella pagina.
Non so se $form_state->getValues()['op']sia universale per tutti i moduli, ma lo sto codificando nella forma del mio modulo.
Drupal 8.6.7
Pulsante Crea qualcosa di simile al di sotto.
$form['my_button'] = [
'#type' => 'button',
'#value' => t('Custom Button'),
'#name' => t('customButton'),
'#weight' => 0,
'#attributes' => [
'class' => ['populate-bib-button', 'btn', 'btn-primary'],
],
];
Nella tua funzione di invio ottieni il nome del pulsante come sotto il codice.
$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton
Il confronto può essere fatto come
if ($input['_triggering_element_name'] == 'customButton') {
// Do something.
}
# Drupal8
hook_submit()un gestore di invio moduli? Un gestore di invio di moduli non è l'implementazione dihook_submit().