在 Drupal Commerce 结账表单中计算运费时,Google 验证码被隐藏

问题描述 投票:0回答:1

我有以下表格

function beyond_shipping_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'commerce_checkout_flow_multistep_default') {
    $default_challenge = \Drupal::service('config.manager')
      ->getConfigFactory()
      ->get('captcha.settings')
      ->get('default_challenge');
    $form['captcha'] = [
      '#type' => 'captcha',
      '#captcha_type' => $default_challenge,
    ];
  }

}

谷歌验证码在页面加载时完美显示,但在计算运费时消失。

根据我的理解,运费计算器会重新加载整个表单,而无需谷歌验证码。因此,重新计算费用后,Google 验证码验证将失效,并且不会在页面上呈现 Google 验证码。

问题是我不知道应该在模块中进行更改以“挂钩”更改并再次重新渲染谷歌验证码。我一直在努力寻找有关此的信息,但没有成功。

感谢您的帮助。

drupal-8 drupal-commerce drupal-ajax
1个回答
0
投票

在 Drupal 中,当由于 AJAX 调用(例如重新计算运费)而重建表单时,任何动态添加的元素都需要在 buildForm 函数或相应的表单 alter hook 中再次添加。由于您使用的是 hook_form_alter,因此您需要确保在重建表单时将验证码添加回表单中。为此,您可以实现 hook_form_alter 并检查 AJAX 回调期间是否正在重建表单。

function beyond_shipping_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'commerce_checkout_flow_multistep_default') {
    // Add CAPTCHA to the form
    $default_challenge = \Drupal::service('config.manager')
      ->getConfigFactory()
      ->get('captcha.settings')
      ->get('default_challenge');

    // Always set the CAPTCHA in the form
    $form['captcha'] = [
      '#type' => 'captcha',
      '#captcha_type' => $default_challenge,
    ];

    // Check if the form is being rebuilt during an AJAX callback
    if ($form_state->getTriggeringElement()['#ajax']) {
      // If it's an AJAX request, we can optionally add any necessary logic here
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.