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
相关产品推荐
相关产品推荐

