2010-12-21 5 views
25

Ich habe 2 Senden-Schaltflächen und möchte verschiedene Aktionen für jede Schaltfläche senden. Hier möchte ich die Formularfelder einstellen, die nur in form_alter() ausgeführt werden können. Kann jemand vorschlagen, wie man in der Funktion form_alter() nach mehreren Senden-Buttons sucht?Handle mehrere Übermittlungsschaltflächen in Drupal-Formular API

ich verwendet habe

function myform_form_submit($formID, &$form_state) { 
if($form_state['clicked_button']['#value'] == $form_state['values']['submit_one']) //if button 1  is clicked 
    $form_state['redirect'] = 'mypath/page_one'; //redirect to whatever page you want 
else if($form_state['clicked_button']['#value'] == $form_state['values']['submit_two']) /if button  2 is clicked 
    $form_state['redirect'] = 'mypath/page_two'; 
} 

aber das funktioniert nicht

+0

Haben Sie einen Submit-Hook in Ihrem Formular? $ form ['# submit'] [] = 'myform_form_submit'; ? – Kevin

+0

ja, aber soll drupal nicht die Submit-Funktion auch ohne den obigen Haken übernehmen? – user550265

Antwort

49

Das Beste, was zu tun ist, wenn Sie zwei Tasten auf einem Formular haben und wollen, dass sie verschiedene Dinge zu tun, ist eine andere zu schaffen Sende die Funktion für jede Taste und verbinde sie. Eines der schönen Dinge an der FormAPI ist, dass das Formular automatisch mit dem Submit-Handler für Sie verknüpft wird. Wenn Sie jedoch zwei Übergabeschaltflächen haben, möchten Sie an eine neue Stelle wechseln.

Also Ihr Formularcode enthält wahrscheinlich:

$form['submit_one'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit One'), 
    '#submit' => array('my_module_form_submit_one'), 
); 
$form['submit_two'] = array(
    '#type' => 'submit', 
    '#value' => t('Submit Two'), 
    '#submit' => array('my_module_form_submit_two'), 
); 

Aber ich weiß nicht, was Sie von form_alter bedeuten() - es gibt keinen Grund, ein Formular zu verwenden, jede Art zu verändern, von.

Edit: Wie in den Kommentaren erwähnt - wenn Sie verschiedene Validierungsfunktionen für die beiden Schaltflächen benötigen, können Sie auch '#validate' => array('my module_form_validate_one') und '#validate' => array('my module_form_validate_two') in die entsprechenden Schaltflächen-Arrays aufnehmen. Aber es ist nicht erforderlich, und wenn die Standard-Formularüberprüfungsfunktion gut funktioniert, dann gehen Sie damit.

+0

Mit zwei verschiedenen Submit-Funktionen klingt wie eine ziemlich gute Lösung, aber was passiert mit der Validierungsfunktion? Hast du auch zwei davon? – Shawn

+0

Um meine eigene Frage zu beantworten, wird die Validierungsfunktion für beide Senden-Schaltflächen aufgerufen, keine Notwendigkeit, sie zu duplizieren (obwohl es möglich ist, zwei verschiedene Validierungsfunktionen zu haben, weiß ich nicht) – Shawn

+0

Und was, wenn Sie andere Validierung benötigen Schaltflächen für die zwei Senden-Schaltflächen? Nehmen wir an, wir möchten eine Abbrechen-Schaltfläche in einem Formular hinzufügen, in dem einige Felder erforderlich sind. Wenn Sie auf Abbrechen klicken, wird ein Fehler ausgegeben, da mit derselben Validierungsfunktion überprüft wird, ob ein erforderliches Feld leer ist. – jjei

14

Wenn Sie andere behandeln möchten Submit-Button klicken, innerhalb einer Funktion einreichen, können Sie überprüfen:

if($form_state['values']['op'] == BUTTON_ONE_VALUE){ 
} else if($form_state['values']['op'] == BUTTON_TWO_VALUE){ 
} 

Oder können Sie bestimmte Eigenschaft auf die Schaltfläche zuerst zuweisen, dann überprüfen:

$form_state['triggering_element']['#attributes'][YOUR_PROPERTY] == VALUE 

Ich benutze Drupal 7 ... Hoffe, das hilft

+0

Das ist aber nicht gut ... was wäre wenn die Zeichenfolge ändert sich? WENN es in einer anderen Sprache ist? – pandaPowder

+0

@pandaPowder Die Änderung der Zeichenfolge spielt keine Rolle, solange Sie 'YOUR_PROPERTY' gesetzt haben – songyy

+0

Mehrere Senden-Buttons haben #name als 'op'. Sie müssen es manuell überschreiben und einen eindeutigen Wert für jede Schaltfläche festlegen, damit $ form_state ['trigging_element'] ordnungsgemäß funktioniert – Varshith

2

Während die angenommene Antwort korrekt ist, sollte beachtet werden, dass Sie verschiedene Werte mit jedem Ihrer Submit-Schaltflächen oder das Untergeben müssen Mit der verwendeten Funktion wird die letzte Übergabeschaltfläche definiert.

Mit anderen Worten, wenn der Wert beider Submit-Buttons 'Submit' ist, wird nur die zweite Submit-Funktion aufgerufen, unabhängig davon, welche Taste gedrückt wurde.