给结账地址加了一个门牌号字段,页面能输入,点“下一步”却一直报 This is a required field。这类问题我不会先改 validation 规则,因为 input 里看得到文字,不等于 Knockout 正在校验的那份数据里也有值。
先在Console里看checkoutProvider有没有值
打开浏览器开发者工具,找到这个 UI Component 的 dataScope 和 provider。字段如果声明在 shippingAddress.custom_attributes.house_number,就检查 checkoutProvider 的同一路径,不要只看 DOM 的 value。
常见情况是 LayoutProcessor 注入时用了 customAttributes,mixin 读取时却写成 custom_attributes;页面显示组件和校验组件实际绑定了两个对象。还有一种是同名字段被注入两次,用户填了可见的那个,隐藏的副本仍为空。
点下一步,直接看shipping-information请求
Network 里找到保存配送信息的请求,搜索字段代码。请求里没有值,问题还在前端数据转换;请求里有值而接口报必填,再查后端 extension attribute 或地址属性声明。
{
"shipping_address": {
"custom_attributes": [
{"attribute_code": "house_number", "value": "8-2"}
]
}
}
项目有时把字段放在 extension_attributes,有时使用 customer address EAV 的 custom_attributes。两种方式都能做,但前端 payload、extension_attributes.xml、接口和保存插件必须选同一条路径。字段代码差一个下划线也不会自动映射。
值传到了,就查quote_address有没有落库
在测试环境对照请求和 quote_address。接口返回成功但数据库没有值,检查保存插件是否执行、数据库列是否存在、setter 是否写到正确对象。quote 有值而 order_address 没值,则漏了 quote 转 order 的字段复制。
修复后我会测四条路径:游客新地址、登录用户新地址、从地址簿选择旧地址、账单地址与配送地址不同。最后下一个测试订单,后台订单地址必须看到该字段。只让红色必填提示消失不算修好,发货环节真正拿得到值才算。

