Mehrere Senden-Schaltflächen: Welche wurde gedrückt?

7

Dies kann ein Duplikat der folgenden sein: Mehrere Formulare senden , aber ich kann nicht herausfinden, wie die Antwort auf meine Situation zutrifft. Hier ist meine Aufgabe, diese (ich gebe zu) ziemlich ähnliche Frage zu stellen:

Ich habe eine Tabelle mit einer Datenzeile, jede Zeile hat eine Senden-Schaltfläche. Es könnte ungefähr so ​​aussehen:

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#submit' =>  array('f_submit'),
  );
}

Das heißt, das Formular besteht aus einer Folge von Zeilen, die aus der Datenbank extrahiert wurden. Ich möchte einen Submit-Rückruf erstellen, der den Wert des entsprechenden nidFelds aufnimmt und dessen Wert ausgibt. Ich denke, ich frage, was ich setzen soll, wo der Kommentar unten ist.

function f_submit($form, &$form_state) {
  // Here I want to print the value of the relevant nid field
}
Freie Radikale
quelle
1
Verwandte Drupal.org Problem . Die letzten beiden Kommentare sind besonders interessant
Clive

Antworten:

6

Daten über die angeklickte Schaltfläche werden in gespeichert $form_state['triggering_element']. Sie können die Knoten-ID erhalten, indem Sie auf schauen $form_state['triggering_element']['#parents']. In Ihrem Fall wäre die Knoten-ID das zweite Element im übergeordneten Array. Bitte beachten Sie, dass das Namensattribut der Felddefinition definiert und eindeutig sein muss. Andernfalls zeigt das auslösende Element auf die letzte Schaltfläche zum Senden im Formular. Ich würde Ihren Code wie folgt ändern:

$form['f'] = array();
foreach ($rows as $row) {
  $form['f'][$row['nid']] = array();
  $form['f'][$row['nid']]['nid'] = array(
    '#markup' => $row['nid'],
  );
  $form['f'][$row['nid']]['submit'] = array(
    '#type' => 'submit',
    '#value' => t('sumbit'),
    '#name' => 'submit-' . $row['nid'],
    '#submit' =>  array('f_submit'),
  );
}

Eine gute Möglichkeit zum Anzeigen $form_statebesteht darin, das Devel-Modul (für krumo()) zu installieren und dann krumo($form_state);drupal_exit();oben auf den Submit- Handler zu setzen. Dadurch wird ein schön strukturierter Datenbaum ausgedruckt.

Lauri
quelle
1
Guter Aufruf zur Verwendung von Devel, $form_state['clicked_button']enthält jedoch immer die letzte NID als zweites übergeordnetes Element, nicht diejenige, die sich auf die angeklickte Schaltfläche bezieht (ich habe es gerade versucht). Dasselbe gilt für $form_state['triggering_element'], was meiner Meinung nach in Drupal 7 bevorzugt wird (aber ich kann derzeit keinen Hinweis darauf finden)
Clive
2
Ich habe vergessen zu sagen, dass #name auf der Senden-Schaltfläche definiert und eindeutig sein muss. Andernfalls verhält es sich wie von Ihnen beschrieben. Sie haben Recht mit der Verwendung von triggering_element, clicked_button ist veraltet. Infos dazu unter api.drupal.org/api/drupal/includes%21form.inc/function/… . Ich habe die Antwort aktualisiert.
Lauri
1

Setzen Sie die #nameEigenschaft jedes Submit-Elements auf einen eindeutigen Wert wie Ihren $row['nid']. Auf diesen eindeutigen Wert kann über die Übermittlungsfunktion über zugegriffen werden $form_state['clicked_button']['#name'].

Bernhard Fürst
quelle
0

Ich hatte eine Weile damit zu kämpfen und fand diese Problemumgehung. Ich wollte zwei separate Senden-Schaltflächen mit leicht unterschiedlichem Verhalten haben. Ich wollte sie auch mit jQuery hinzufügen und entfernen.

Also habe ich das gemacht.

Erstellen Sie zwei Schaltflächen mit eindeutigen Namen.

    $form['edit-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Reclassify Selected'),
        '#name' => 'default-submit'
    );

    $form['classify-submit'] = array(
        '#type' => 'submit',
        '#value' => t('Re-classify'),
        '#name' => 'classify-submit'
    );

Blenden Sie die Schaltfläche aus, die ich dynamisch verwenden möchte.

    $(document).ready(function() {
        // Hide the classify button
        $('#edit-classify-submit').css('display', 'none');
    });

Klonen Sie diese Schaltfläche nach Bedarf an andere Stellen im Formular und auf der Seite.

    $('#edit-classify-submit').clone().appendTo('.my-form').css('display', 'inline-block')

Es scheint, dass wenn Sie die Schaltflächendefinition nicht über die Drupal-Formulardeklaration hinzufügen, diese nicht in $ form ['triggering_element'] vorliegt.

Jason Yarrington
quelle