Блок регистрации Drupal 8 Mailchimp Ajax

Я пытаюсь адаптировать блок подписки к Drupal 8 Mailchimp, но я придерживался 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?


person bambamboole    schedule 13.05.2016    source источник


Ответы (3)


Во-первых, объект AjaxResponse имеет _ 1_ метод, а не setContent().

Чтобы фактически подписаться на mailchimp через модуль Drupal, вы можете использовать _ 3_ в основном модуле mailchimp.

person acrosman    schedule 17.05.2016
comment
Когда я меняю setContent на setData, возникает следующая ошибка: Uncaught SyntaxError: Unexpected token R. Подписка работает, как я написал в вопросе, но как мне получить ответ от сервера Mailchimp в функции обратного вызова, чтобы я мог вернуть его клиенту? - person bambamboole; 17.05.2016
comment
SyntaxError приходит, если вы не предоставили array методу setData. Теперь мне нужен только ответ от функции mailchimp_subscribe, который вызывается submitForm методом MailchimpSignupPageForm - person bambamboole; 17.05.2016
comment
Да, setData () ожидает массив, который будет закодирован как JSON и передан обратно в ваш JavaScript, который в первую очередь инициировал запрос. И вы должны иметь возможность напрямую вызывать функцию подписки. Вы можете попробовать обработчик формы, но я не знаю, что он сделает то, что вы хотите, в терминах или ответе. - person acrosman; 17.05.2016

Мое "рабочее" решение сейчас:

изменить блок формы, добавить функцию обратного вызова 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:

Я создаю новый объект AjaxResponse и массив сообщений Drupal через drupal_get_messages(). Тогда какой-то хакер, чтобы получить правильное сообщение.

и добавьте ReplaceCommandObject, который заменяет форму сообщением 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 ...

person bambamboole    schedule 21.05.2016

Параметр AJAX привязан к модулю, вы можете найти его здесь: https://www.drupal.org/project/mailchimp/issues/2721249.

После применения патча или использования версии, которая включает его, вы найдете флажок в конфигурации формы, чтобы включить в нем AJAX.

person Omar Alahmed    schedule 27.10.2019