J'ai un formulaire avec un bouton "Soumettre" et un bouton "Annuler". Dans hook_submit()
, comment puis-je savoir quel bouton a été cliqué?
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 .
$form_state['clicked_button']['#value']
vous indiquera quel bouton a été cliqué sur le formulaire.
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
}
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.
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.
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
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.