Drupal 8 Mailchimp Ajax 注册块

Drupal 8 Mailchimp Ajax Signup Block

我尝试对 Drupal 8 Mailchimp 注册块进行 ajax 化,但我坚持使用 AjaxResponse。

这是我的表单修改挂钩:

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;
}

但是在Chrome控制台中只有一个错误:

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 中?

首先,AjaxResponse 对象有一个 setData() 方法而不是 setContent()

要通过 Drupal 模块实际订阅 mailchimp,您可以使用主 mailchimp 模块中的 mailchimp_subscribe() 功能。

我现在的 "working" 解决方案是:

更改表单块,添加一个 ajax 回调函数,防止点击并添加一些 ajax 进度可视化。

/**
 * 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;
}

我认为有更优雅的方式来获得它。 我仍然不知道为什么仍然调用 Mailchimp 表单的 submitForm 方法...

AJAX 选项已提交给模块,您可以在这里找到它:https://www.drupal.org/project/mailchimp/issues/2721249

应用补丁或使用包含它的版本后,您会在表单配置中找到一个复选框以启用其中的 AJAX。