Risposte:
È necessario utilizzare il triggering_element
da $form_state['triggering_element']
.
La migliore pratica è definire un #name
attributo 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_element
conterrà 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_state
Ho 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' #name
attributo, 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 #name
nel modo seguente.
$button_clicked = $form_state->getTriggeringElement()['#name']
Il motivo dietro questa modifica è che FormStateInterface
ora è un readOnly
file in cui solo le classi estese FormStateInterface
possono 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 #value
chiave 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()
.