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。
我尝试对 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。