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 .
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}elseif($form_state['values']['cancel']== $form_state]['clicked_button']['#value']){//Process if Cancel is pressed}
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:
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.
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.
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.
hook_submit()
einem Formularübermittlungs-Handler? Ein Formularübergabehandler ist nicht die Implementierung vonhook_submit()
.Antworten:
Sie müssen die
triggering_element
von der verwenden$form_state['triggering_element']
.Es wird empfohlen, ein
#name
Attribut für Ihre Schaltfläche zu definieren , damit Sie diesen Wert in der Liste habentriggering_element
.Beispielsweise:
Wenn Sie dieses Attribut nicht definieren,
triggering_element
werden 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 .
quelle
$form_state['clicked_button']['#value']
Hier erfahren Sie, welche Schaltfläche im Formular angeklickt wurde.quelle
$form_state['clicked_button']['#value']
:)Vergleichen Sie diese Werte mit
$form_state
denen, die ich in Drupal 6 gemacht habe und die in Drupal7 gleich wärenquelle
Benennen Sie die Schaltflächen mit dem
#name
Attribut wie folgt:und dann benutze:
quelle
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
#name
Sie folgendermaßen darauf zugreifen.$button_clicked = $form_state->getTriggeringElement()['#name']
Der Grund für diese Änderung ist, dass
FormStateInterface
es sich nun um einereadOnly
Datei handelt, in der nur Klassen, die sich erweitern,FormStateInterface
auf die Variablen zugreifen können. Sie müssen alsogetTriggeringElement()
Zugriffsmethoden wie verwenden, um auf die Variable zuzugreifen.quelle
In Drupal 8.4.4
$form_state->getTriggeringElement()['#name'];
gibt Ihnen der Wert vonop
. Wenn Sie im#value
Wertearray 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.quelle
Drupal 8.6.7
Erstellen Sie eine Schaltfläche wie unten.
In Ihrer Submit-Funktion erhalten Sie den Namen der Schaltfläche wie unten angegeben.
Vergleiche können gerne gemacht werden
# Drupal8
quelle