2016-03-23 3 views
0

Ich bin wirklich hier ratlos. Ich habe eine Ajax-Form mit einer Schaltfläche - tatsächlich hat die eine darunter eine Schaltfläche und ein Auswahlobjekt, die beide die gleiche Callback-Funktion aufrufen.Drupal7 Forms API: Ajax-Taste nicht feuern Callback

Was ich will: die Schaltfläche, um den Rückruf aufzurufen, aber nicht das Formular abschicken.

Was ich habe: die Auswahl ruft den Rückruf in Ordnung, aber die Senden-Taste tut nichts .

Gedanken?

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) { 
    $pane_form = array(); 

    $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">', 
    '#suffix' => '</div>', 
); 

    $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios', 
    '#options' => array(1 => 'One', 2 => 'Two'), 
    '#ajax' => array(
     'callback' => 'my_module_pane_callback', 
     'wrapper' => 'codes-fieldset-wrapper', 
    ), 
    '#default_value' => 1, 
); 

    $pane_form['codes']['add_code'] = array(
    '#type' => 'submit', 
    '#value' => 'Add Code', 
    '#ajax' => array(
     'callback' => 'my_module_pane_callback', 
     'wrapper' => 'codes-fieldset-wrapper', 
    ), 
); 

    return $pane_form; 
} 

function my_module_pane_callback($form, $form_state) { 
    watchdog('php', 'inside callback'); 
    return $form['my_module']; 
} 
+0

Zu beachten: Dieses Formular sitzt auf einem Commerce-Checkout-Bereich (ah, die Freude). –

Antwort

1

Ich habe '#limit_validation_errors' => array() und änderte den submit zu einem button und habe es funktioniert, aber nicht nach einer enormen Kopfschmerzen (und die Arbeit eines ganzen Tag verloren).

Dieses Formular befindet sich in einem Commerce-Kassenbereich. Mit einem Submit Button wird das Formular immer kommentiert (in der Ajax_Form_Callback Funktion hat das $ form_state Objekt immer = 1 gesendet), ob ich 'prevent' => 'click' im #ajax Array gesetzt hatte (seit Drupal ajax feuert auf mousedown) oder hat '#executes_submit_handler' => FALSE gesetzt. Als solches war die Form immer gültig und da nicht alles ausgefüllt war, passierte es nicht.

Mit dem Button wurde das Formular noch validiert (und fehlgeschlagen), aber das Formular wurde nicht als gesendet markiert.

Daher enthielt die JSON-Nutzlast keine Befehle für die Schaltfläche, da die Validierung fehlgeschlagen ist. Da das select (oder ein anderes Objekt) das Formular nicht gesendet oder die Überprüfung nicht überprüft hat, funktionierte der Ajax-Aufruf dieses Elements.

Da wir beide Prüfungen übergeben müssen, um das Formular und das Ajax-Befehlsfeld zu erstellen, müssen wir den Elementtyp als Schaltfläche definieren und die Begrenzungsvalidierungsfehler auf ein leeres Array setzen - dann wird Drupal Führen Sie nur Überprüfungen der Elemente durch, die im Array übergeben werden - und dafür wollen wir nichts.

Noch einmal: '#type' => 'submit' zu '#type' => 'button' ändern und '#limit_validation_errors' => array() hinzufügen.

function my_module_pane_checkout_form($form, $form_state, $checkout_pane, $order) { 
    $pane_form = array(); 

    $pane_form['codes'] = array(
    '#prefix' => '<div id="codes-fieldset-wrapper">', 
    '#suffix' => '</div>', 
); 

    $pane_form['codes']['add_code_0'] = array(
    '#type' => 'radios', 
    '#options' => array(1 => 'One', 2 => 'Two'), 
    '#ajax' => array(
     'callback' => 'my_module_pane_callback', 
     'wrapper' => 'codes-fieldset-wrapper', 
    ), 
    '#default_value' => 1, 
); 

    $pane_form['codes']['add_code'] = array(
    '#type' => 'button', 
    '#value' => 'Add Code', 
    '#limit_validation_errors' => array(), 
    '#ajax' => array(
     'callback' => 'my_module_pane_callback', 
     'wrapper' => 'codes-fieldset-wrapper', 
    ), 
); 

    return $pane_form; 
} 

function my_module_pane_callback($form, $form_state) { 
    watchdog('php', 'inside callback'); 
    return $form['my_module']; 
} 
Verwandte Themen