Woher kann ich wissen, auf welche Schaltfläche geklickt wurde?

12

Ich habe ein Formular mit den Schaltflächen "Senden" und "Abbrechen". In hook_submit(), wie kann ich wissen , welche Schaltfläche geklickt wurde?

user1359
quelle
Sprechen Sie von hook_submit()einem Formularübermittlungs-Handler? Ein Formularübergabehandler ist nicht die Implementierung von hook_submit().
kiamlaluno

Antworten:

23

Sie müssen die triggering_elementvon der verwenden $form_state['triggering_element'].

Es wird empfohlen, ein #nameAttribut für Ihre Schaltfläche zu definieren , damit Sie diesen Wert in der Liste haben triggering_element.

Beispielsweise:

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

Wenn Sie dieses Attribut nicht definieren, triggering_elementwerden die Schaltflächen #value(der Text, den der Benutzer lesen kann) beibehalten. Dies wird jedoch nicht empfohlen, da andere Module diesen Wert möglicherweise ändern oder von der Lokalisierung geändert werden.

Sie können auch verwenden $form_state['clicked_button'], dies ist jedoch veraltet .

Weitere Informationen finden Sie auf der Dokumentationsseite für die Funktion drupal_build_form .

sanzante
quelle
7

$form_state['clicked_button']['#value'] Hier erfahren Sie, welche Schaltfläche im Formular angeklickt wurde.

iStryker
quelle
$form_state['clicked_button']['#value']:)
user1359
1
Ich möchte hinzufügen, wenn Sie Felder in Ihrem Formular benötigt haben und diese nicht ausgefüllt sind, dann wird Ihnen von Drupal ein Fehler bei der Formularüberprüfung gemeldet (form_submit wird nach form_validate aufgerufen). Sie müssen so etwas tun devengineering.com/best-practices/drupal/…
iStryker
Das ist ein guter Punkt!
user1359
5
Während "clicked_button" noch funktioniert, wurde es in D7 als veraltet eingestuft und es wird empfohlen, stattdessen "triggering_element" zu verwenden. Ich erinnere mich, dass es einige #ajax-Bugs gab (ich glaube), die nur Code betrafen, der "clicked_button" verwendete, also ist das ein Grund mehr, "triggering_element" zu verwenden. Und schließlich ist es nur ein anderer Schlüssel in $ form_state.
Bojan Zivanovic
1
Während dieser Ansatz funktioniert, ist er veraltet und anfällig für Probleme. In der Antwort der Tunika finden Sie die richtige Vorgehensweise für Drupal 7.
Alice Heaton
3

Vergleichen Sie diese Werte mit $form_statedenen, die ich in Drupal 6 gemacht habe und die in Drupal7 gleich wären

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
}
Shoaib Nawaz
quelle
Wenn ich mich erinnere, dass Drupal 6 korrekt ist, ist $ form_state] ['X'] jetzt $ form_state ['X'] in Drupal 7
iStryker 20.07.11
Warum müssen Sie diese beiden Werte vergleichen?
iStryker
Wenn das Formular mehrere Senden-Schaltflächen enthält. Dieser Vergleich hilft zu unterscheiden, welche Schaltfläche zum Senden des Formulars in einem einzelnen Submit-Handler verwendet wurde. $ form_state ['clicked_button'] ['# value'] = t ('Yes') führt bei mehrsprachiger Einrichtung zu unterschiedlichen Werten.
Shoaib Nawaz
Ein einzelner Vergleich ist am besten, um alle Sprachvergleiche bei mehrsprachigem Setup zu vermeiden. :)
Shoaib Nawaz
1
@iStryker Ich bin mir nicht sicher, was du mit deinem ersten Kommentar meinst.
kiamlaluno
3

Benennen Sie die Schaltflächen mit dem #nameAttribut wie folgt:

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

und dann benutze:

$values = $form_state['input'];
if (isset($values['delete'])) // 'delete' button was pressed.
user13097
quelle
Also für ein Formular mit zwei Senden-Schaltflächen wie folgt: $ form ['submit'] = array ('#type' => 'submit', '#name' => 'submit-1', '#value' => t ('Submit1'),); $ form ['submit2'] = array ('#type' => 'submit', '#name' => 'submit-2', '#value' => t ('Submit2'),); Wir müssen nur $ form_state-> getTriggeringElement () ['# name'] in der submitForm () Funktion überprüfen.
Gaius
3

UPDATE 2016 Drupal 8

Für diejenigen, die immer noch herausfinden möchten, wie sie auf das ausgelöste Ereignis zugreifen können, ist hier die Drupal 8-Lösung.

$form_state->getTriggeringElement()

Dies gibt das Array des auslösenden Submit-Elements zurück. Wenn Sie ein aufgerufenes Markup hinzufügen, können #nameSie folgendermaßen darauf zugreifen.

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

Der Grund für diese Änderung ist, dass FormStateInterfacees sich nun um eine readOnlyDatei handelt, in der nur Klassen, die sich erweitern, FormStateInterfaceauf die Variablen zugreifen können. Sie müssen also getTriggeringElement()Zugriffsmethoden wie verwenden, um auf die Variable zuzugreifen.

Neoaptt
quelle
Ich habe ein Update für Drupal 8.4.4 im Jahr 2018: drupal.stackexchange.com/a/256112/1441
user1359
0

In Drupal 8.4.4 $form_state->getTriggeringElement()['#name'];gibt Ihnen der Wert von op. Wenn Sie im #valueWertearray des Formularstatus nach diesem Schlüssel suchen, erhalten Sie den Schlüssel des Formularelements button - mit anderen Worten, die Zeichenfolge, die der Endbenutzer auf der Schaltfläche auf der Seite sieht.

Ich weiß nicht, ob $form_state->getValues()['op']es für alle Formen universell ist, aber ich codiere es fest in der Form meines Moduls.

user1359
quelle
0

Drupal 8.6.7

Erstellen Sie eine Schaltfläche wie unten.

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

In Ihrer Submit-Funktion erhalten Sie den Namen der Schaltfläche wie unten angegeben.

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

Vergleiche können gerne gemacht werden

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

# Drupal8

Yogesh Kushwaha
quelle