it-swarm.it

Come posso sapere quale pulsante è stato cliccato?

Ho un modulo con i pulsanti "Invia" e "Annulla". In hook_submit(), come faccio a sapere quale pulsante è stato cliccato?

12
user1359

È necessario utilizzare $form_state->getTriggeringElement().

La migliore pratica è definire un attributo #name Per il tuo pulsante, quindi puoi avere questo valore in triggering_element.

Per esempio:

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

In questo esempio: $form_state->getTriggeringElement()['#name'] restituirà "delete" quando viene chiamato all'interno di public function submitForm(&$form, $form_state)

Se non si definisce questo attributo triggering_element Conterrà il pulsante #value (Il testo che l'utente può leggere), ma questo è sconsigliato poiché altri moduli possono cambiare questo valore o essere modificati dalla localizzazione ).

Puoi anche usare $form_state['clicked_button'], Ma questo è deprecato .

Puoi leggere maggiori informazioni nella pagina della documentazione della funzione drupal_build_form .

23
sanzante

$form_state['clicked_button']['#value'] ti dirà quale pulsante è stato fatto clic sul modulo.

7
iStryker

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
}
3
Shoaib Nawaz

Assegna un nome ai pulsanti con il #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.
3
user13097

AGGIORNAMENTO 2016 Drupal 8

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 #name, Accedi ad esso nel modo seguente.

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

Il motivo dietro questa modifica è che FormStateInterface ora è un file readOnly in cui solo le classi che estendono FormStateInterface possono accedere alle variabili. Quindi devi usare metodi di accesso come getTriggeringElement() per accedere alla variabile.

3
Neoaptt

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

0
Yogesh Kushwaha

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 il #value Dell'elemento forma 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 nel modulo del mio modulo.

0
user1359