2016-05-13 21 views
0

私はDrupal 8 Mailchimp SignUp Blockをajaxifyしようとしましたが、私はAjaxResponseで立ち往生しました。Drupal 8 Mailchimp Ajaxサインアップブロック

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...') 
    ) 
    ]; 

} 

これは私のコールバック関数です:

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


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

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

しかし、クロームコンソールでのみエラーがあります:

これは私のフォームは、フックを変えている

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

申し込み私の質問はどのように私はmailchimp応答を取得し、有効なAjaxResponseに入れることができますか?

答えて

0

私の「作業」ソリューションは今です。

/** 
* 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...') 
    ) 
    ]; 

} 

これはAjaxのコールバックです:

私はdrupal_get_messages()経由で新しいAjaxResponseオブジェクトとDrupalのメッセージの配列を作成します。次に、適切なメッセージを得るための何らかの種類のハック。

を追加し、ReplaceCommandオブジェクトを追加して、フォームをMailchimpメッセージに置き換えます。

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


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

    $messages = drupal_get_messages(); 

    $message = $messages['status'][0]; 

    if(!$message){ 
    $message = $messages['warning'][0]; 
    } 

    $response->addCommand(new \Drupal\Core\Ajax\ReplaceCommand('#mailchimp-signup-subscribe-block-form', $message)); 

    return $response; 
} 

私はこれを得るためにはるかにエレガントな方法があると思います。 私は依然としてsubmitForm Mailchimpフォームのメソッドがまだ呼び出されている理由をまだ知りません...

1

最初に、AjaxResponseオブジェクトのsetData()メソッドはsetContent()ではありません。

Drupalモジュールを使用してmailchimpに実際に加入するには、メインのmailchimpモジュールでmailchimp_subscribe()関数を使用できます。

は、フォームブロックを変更AJAXコールバック関数を追加し、クリックを防止し、いくつかのAJAX進捗の可視化を追加します。

+0

setContentをsetDataに変更すると、次のエラーが発生します: 'Uncaught SyntaxError:Unexpected token R'です。サブスクリプションは、質問に書いたように動作しますが、コールバック関数のMailchimp Serverからクライアントに返すことができるレスポンスはどのようにして得られますか? – bambamboole

+0

'setData'メソッドに'配列 'を与えないと 'SyntaxError'が来ます。今、私ははい、にsetData()はJSONとしてエンコードされ、バックに要求をトリガあなたのJavaScriptに渡される配列を期待 'MailchimpSignupPageForm' – bambamboole

+0

の' submitForm'法で呼び出したmailchimp_subscribe機能からの応答を必要とします最初の場所。そしてあなたは直接subscribe関数を呼び出すことができるはずです。あなたはフォームのハンドラを試すことができますが、私はそれがあなたの言いたいことや反応をしてくれるかどうかはわかりません。 – acrosman