我有以下表格
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 中,当由于 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
}
}
}