2016-05-13 13 views
0

Ich versuche den Drupal 8 Mailchimp SignUp Block zu ajaxifizieren, aber ich blieb bei der AjaxResponse.Drupal 8 Mailchimp Ajax Signup Block

Das ist mein Formular Haken ändern:

function mailchimp_ajax_form_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) { 

    if ($form_id != 'mailchimp_signup_subscribe_block_form') { 
    return; 
    } 
    $form['submit']['#ajax'] = [ 
    'callback' => 'mailchimp_ajax_form_callback', 
    'prevent' => 'click', 
    'progress' => array(
     'type' => 'throbber', 
     'message' => t('Submitting data...') 
    ) 
    ]; 

} 

Dies ist meine Callback-Funktion:

function mailchimp_ajax_form_callback(array &$form, \Drupal\Core\Form\FormStateInterface $form_state) { 


    $response = new \Drupal\Core\Ajax\AjaxResponse(); 

    $response->setContent('Response'); 
    return $response; 
} 

Aber in Chrome-Konsole gibt es nur einen Fehler:

Uncaught AjaxError: 
An AJAX HTTP error occurred. 
HTTP Result Code: 200 
Debugging information follows. 
Path: /node?ajax_form=1 
StatusText: OK 
ResponseText: Response 

Das Anmelden funktioniert, aber meine Frage ist, wie kann ich die Mailchimp Antwort erhalten und in eine gültige AjaxResponse setzen?

Antwort

0

Meine „arbeiten“ Lösung ist jetzt:

die Form Block ändern, fügen Sie einen Ajax-Callback-Funktion, verhindern klicken und fügt einige Ajax-Fortschritt Visualisierung.

/** 
* Implements hook_form_FORM_ID_alter() 
* 
* @param \Drupal\mailchimp_signup\Form\MailchimpSignupPageForm $form 
* @param \Drupal\Core\Form\FormStateInterface     $form_state 
* @param              $form_id 
*/ 
function mailchimp_ajax_form_form_alter(&$form, \Drupal\Core\Form\FormStateInterface &$form_state, $form_id) { 

    if ($form_id != 'mailchimp_signup_subscribe_block_form') { 
    return; 
    } 
    $form['submit']['#ajax'] = [ 
    'callback' => 'mailchimp_ajax_form_callback', 
    'prevent' => 'click', 
    'progress' => array(
     'type' => 'throbber', 
     'message' => t('Submitting data...') 
    ) 
    ]; 

} 

Dies ist der Ajax Rückruf:

Ich erstelle ein neues AjaxResponse Objekt und ein Array der Drupal-Nachrichten über drupal_get_messages(). Dann eine Art Hack, um die richtige Nachricht zu bekommen.

und fügen Sie ein ReplaceCommand Objekt, das das Formular mit der Mailchimp-Nachricht ersetzt.

Ich denke, es gibt viel elegantere Möglichkeiten, dies zu bekommen. Ich weiß immer noch nicht, warum die submitForm Methode des Mailchimp Formulars noch aufgerufen wird ...

1

Zuerst hat das AjaxResponse-Objekt eine setData() Methode nicht setContent().

Um jemanden wirklich per Mailchimp über das Drupal-Modul zu abonnieren, können Sie die mailchimp_subscribe()-Funktion im Mailchimp-Hauptmodul verwenden.

+0

Wenn ich SetContent zu SetData ändern, gibt es den folgenden Fehler: 'Uncaught SyntaxError: Unerwartete Token R'. Das Abonnement funktioniert, wie ich in der Frage geschrieben habe, aber wie bekomme ich die Antwort vom Mailchimp Server in der Rückruffunktion, die ich an den Client zurücksenden kann? – bambamboole

+0

Der 'SyntaxError' kommt, wenn Sie der' setData' Methode kein 'array' zur Verfügung stellen. Jetzt brauche ich nur noch die Antwort von der mailchimp_subscribe-Funktion, die durch die 'submitForm'-Methode des' MailchimpSignupPageForm' aufgerufen wird. – bambamboole

+0

Ja, setData() erwartet ein Array, das als JSON kodiert und an Ihr JavaScript zurückgegeben wird, das die Anfrage ausgelöst hat den ersten Platz. Und Sie sollten die Subscribe-Funktion direkt aufrufen können. Sie können den Handler für das Formular versuchen, aber ich weiß nicht, ob Sie das tun, was Sie wollen, in Bezug auf die Antwort. – acrosman