web-dev-qa-db-fra.com

Comment savoir quel bouton a été cliqué?

J'ai un formulaire avec un bouton "Soumettre" et un bouton "Annuler". Dans hook_submit(), comment puis-je savoir quel bouton a été cliqué?

12
user1359

Vous devez utiliser $form_state->getTriggeringElement().

La meilleure pratique consiste à définir un attribut #name Pour votre bouton, afin que vous puissiez avoir cette valeur dans le triggering_element.

Par exemple:

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

Dans cet exemple: $form_state->getTriggeringElement()['#name'] renverra "delete" lorsqu'il sera appelé dans public function submitForm(&$form, $form_state)

Si vous ne définissez pas cet attribut triggering_element Contiendra le bouton #value (Le texte que l'utilisateur peut lire), mais cela est déconseillé car d'autres modules peuvent changer cette valeur ou être modifiés par la localisation ).

Vous pouvez également utiliser $form_state['clicked_button'], Mais c'est déconseillé .

Vous pouvez lire plus d'informations sur la page de documentation de la fonction drupal_build_form .

23
sanzante

$form_state['clicked_button']['#value'] vous indiquera quel bouton a été cliqué sur le formulaire.

7
iStryker

Comparez ces valeurs dans $form_state J'ai fait en Drupal 6 et serait le même dans 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

Nommez les boutons avec le #name attribut, comme ceci:

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

puis utilisez:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
3
user13097

MISE À JOUR 2016 Drupal 8

Pour ceux qui essaient encore de comprendre comment accéder à l'événement déclenché, voici la solution Drupal 8.

$form_state->getTriggeringElement()

Cela renvoie le tableau de l'élément d'envoi de déclenchement. Si vous ajoutez un balisage appelé #name, Vous y accéderez de la manière suivante.

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

La raison de cette modification est que FormStateInterface est maintenant un fichier readOnly dans lequel seules les classes qui étendent FormStateInterface peuvent accéder aux variables. Vous devez donc utiliser des méthodes d'accesseur comme getTriggeringElement() pour accéder à la variable.

3
Neoaptt

Drupal 8.6.7

Créer un bouton quelque chose comme ci-dessous.

$form['my_button'] = [
    '#type' => 'button',
    '#value' => t('Custom Button'),
    '#name' => t('customButton'),
    '#weight' => 0,
    '#attributes' => [
      'class' => ['populate-bib-button', 'btn', 'btn-primary'],
    ],
  ];

Dans votre fonction d'envoi, obtenez le nom du bouton comme le code ci-dessous.

$input = $form_state->getUserInput();
print $input['_triggering_element_name']; // customButton

La comparaison peut se faire comme

if ($input['_triggering_element_name'] == 'customButton') {
  // Do something.
}

# Drupal8

0
Yogesh Kushwaha

Dans Drupal 8.4.4 $form_state->getTriggeringElement()['#name']; vous donne la valeur de op. Lorsque vous recherchez cette clé dans le tableau de valeurs de l'état du formulaire, vous obtenez le #value Clé de l'élément de formulaire bouton - en d'autres termes, la chaîne que les utilisateurs finaux voient sur le bouton de la page.

Je ne sais pas si $form_state->getValues()['op'] est universel pour toutes les formes, mais je le code en dur sous la forme de mon module.

0
user1359