后台已经把 Enable Terms and Conditions 设为Yes,但结账页付款按钮上方什么都没有。这个功能有两层开关:全局配置允许显示,具体协议还必须启用并分配给当前Store View。
先看数据,不猜前端
bin/magento config:show checkout/options/enable_agreements SELECT agreement_id,name,is_active,mode FROM checkout_agreement; SELECT * FROM checkout_agreement_store ORDER BY agreement_id,store_id;
当前Store ID不在checkout_agreement_store时,协议不会进入checkoutConfig。到 Stores > Terms and Conditions 编辑协议,勾选正确的Store View,状态设为Enabled,内容不能为空。
页面配置里到底有没有协议
打开结账页控制台:
console.log(window.checkoutConfig && window.checkoutConfig.checkoutAgreements);
数组为空:继续查Store关联与配置缓存。数组有数据但页面不显示:问题在jsLayout或模板覆盖。
自定义主题最容易漏掉的节点
搜索 before-place-order、agreements 和 Magento_CheckoutAgreements。某些一步结账模块重写payment组件时,没有保留agreements子节点。
grep -R "checkout-agreements|before-place-order|Magento_CheckoutAgreements" app/design app/code -n bin/magento cache:clean config layout block_html full_page
把自定义布局与vendor/magento/module-checkout-agreements/view/frontend/layout/checkout_index_index.xml对照,恢复组件节点,不要直接把复选框HTML硬编码到模板,因为提交时还要传agreement_ids并由后端验证。
验收要覆盖两种模式
- Mode为Manually时必须勾选才能下单;
- Mode为Automatically时应展示内容但无需复选;
- 游客和登录客户都测试;
- 每种支付方式各下单一次,尤其是重写Place Order按钮的钱包支付;
- 切换到未分配协议的Store View,确认不会误显示。
若业务要求强制同意,不能只做前端required校验;必须保留后端agreement validator,防止直接调用REST绕过。

