web-dev-qa-db-fra.com

Comment obtenir l'élément déclencheur

Je veux obtenir triggering_element élément sur form_alter après la reconstruction du formulaire, je sais également que cela pourrait être utilisé sur le gestionnaire de soumission sur le contrôleur Ajax pour savoir quel élément cause la soumission du formulaire ou Ajax déclenché.

Alors, comment puis-je obtenir triggering_element après un appel Ajax ou des soumissions de formulaire?

6
Yusef

Eyal a raison. FormState a une méthode getTriggeringElement . Voir enregistrement de modification d'origine pour plus de détails.

$form_state->getTriggeringElement();

et si vous voulez vous identifier, essayez

$triggerdElement = $form_state->getTriggeringElement();
$htmlIdofTriggeredElement = $triggerdElement['#id'];
7
cilefen

Ma méthode préférée est:

$triggering_element = $form_state->getTriggeringElement();
$button_name = $triggering_element['#name'];
if ($button_name === 'button1') {
  // ...
}

Fonctionne à la fois pour validateForm () et submitForm ().

Assurez-vous d'avoir #nom pour tous vos boutons. Par exemple.:

$form['button1'] = [
  '#type' => 'submit',
  '#name' => 'button1',
  '#value' => $this->t('Button 1'),
];

Comparé à $ triggering_element ['# id'], il est plus stable car #id est généré automatiquement et peut changer implicitement.

Comparé à $ triggering_element ['# value'], c'est mieux parce que:
- #value peut ne pas être unique;
- #value est une interface utilisateur de partie (étiquette de bouton) et change fréquemment.

4
Ruslan Isay

3

$triggering_element = $form_state->getTriggeringElement();
$button_name = $triggering_element['#name'];
if ($button_name === 'button1') {
  // ...
}

Fonctionne à la fois pour validateForm () et submitForm ().

Assurez-vous d'avoir #nom pour tous vos boutons. Par exemple.:

$form['button1'] = [
  '#type' => 'submit',
  '#name' => 'button1',
  '#value' => $this->t('Button 1'),
];

Ceci est la bonne réponse.

1
user2376625