You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal Commerce结账页计算运费时Google Captcha消失问题求助

解决方案

你的问题核心是运费计算的AJAX表单重建时,Captcha元素未被重新添加。可以通过以下两种方式修复:

方法1:使用表单Base ID钩子确保AJAX重建时触发

将原有的hook_form_alter替换为针对结账流程Base ID的钩子,确保所有结账表单(包括AJAX重建场景)都能触发Captcha添加逻辑:

function beyond_shipping_form_commerce_checkout_flow_alter(&$form, FormStateInterface $form_state, $form_id) {
  // 仅针对默认多步骤结账流程
  if ($form_id === 'commerce_checkout_flow_multistep_default') {
    $default_challenge = \Drupal::service('config.factory')
      ->get('captcha.settings')
      ->get('default_challenge');
    $form['captcha'] = [
      '#type' => 'captcha',
      '#captcha_type' => $default_challenge,
      '#weight' => 100, // 调整权重将Captcha放在合适位置
    ];
  }
}

方法2:使用#after_build回调强制添加Captcha

如果方法1无效,可通过表单的#after_build回调在表单构建的最后阶段添加Captcha,确保无论表单如何重建(包括AJAX)都能生效:

function beyond_shipping_form_commerce_checkout_flow_multistep_default_alter(&$form, FormStateInterface $form_state, $form_id) {
  // 添加after_build回调
  $form['#after_build'][] = 'beyond_shipping_add_captcha_after_build';
}

/**
 * 表单after_build回调:添加Captcha元素
 */
function beyond_shipping_add_captcha_after_build(array $form, FormStateInterface $form_state) {
  $default_challenge = \Drupal::service('config.factory')
    ->get('captcha.settings')
    ->get('default_challenge');
  $form['captcha'] = [
    '#type' => 'captcha',
    '#captcha_type' => $default_challenge,
    '#weight' => 100,
  ];
  return $form;
}

原理说明

运费计算触发AJAX时,Drupal会重新构建表单,但常规hook_form_alter可能因表单构建顺序或模块优先级问题,在AJAX场景下未被执行。使用Base ID钩子或#after_build回调,能确保Captcha元素在表单每次构建完成后都被添加,避免AJAX刷新后丢失。

内容的提问来源于stack exchange,提问作者perpetual_dream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:19:53