Réponses:
Vous devez utiliser le à triggering_element
partir du $form_state['triggering_element']
.
La meilleure pratique consiste à définir un #name
attribut 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',
);
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 modifier cette valeur ou être modifié par la localisation).
Vous pouvez $form_state['clicked_button']
également l' utiliser , mais cela est obsolète .
Vous pouvez lire plus d'informations sur la page de documentation de la fonction drupal_build_form .
$form_state['clicked_button']['#value']
vous dira quel bouton a été cliqué sur le formulaire.
$form_state['clicked_button']['#value']
:)
Comparer ces valeurs dans $form_state
J'ai fait dans Drupal 6 et serait la 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 l' #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 ce changement est qu'il FormStateInterface
s'agit désormais d'un readOnly
fichier dans lequel seules les classes qui s'étendent FormStateInterface
peuvent accéder aux variables. Vous devez donc utiliser des méthodes d'accesseur comme getTriggeringElement()
pour accéder à la variable.
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 la #value
clé de l' élément de formulaire du 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 dans la forme de mon module.
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
hook_submit()
ou d'un gestionnaire de soumission de formulaire? Un gestionnaire de soumission de formulaire n'est pas l'implémentation dehook_submit()
.