只有一个自定义属性导致商品保存失败,错误却只有“输入值无效”。我先复制商品并逐项移除字段,确定问题属性 code 为 external_codes。

数据库显示它的 backend_model 指向多年前扩展中的类。这个类在 beforeSave 中假定输入永远是逗号字符串,但新后台组件提交的是数组,于是把合法值当成非法。

SELECT attribute_id, attribute_code, backend_type,
       backend_model, source_model, frontend_input
FROM eav_attribute
WHERE attribute_code='external_codes';

排查顺序:

  1. 保存请求里的原始类型;
  2. UI组件是否把空值传成 []、null 或空字符串;
  3. backend_type能否容纳转换后的值;
  4. backend model是否仍存在且兼容当前PHP;
  5. Store View保存时是否错误覆盖默认值。

不要直接在数据库里删除 backend_model 名称。它可能还负责序列化、唯一性或同步副表。应先为旧数据建立测试样本,再修改模型兼容数组/字符串并给出明确异常消息;如果确实不再需要,通过 Data Patch 安全迁移配置与现有值。

修复后测试新商品、已有商品、空值、多个值和 Store View 覆盖。再跑一次批量导入,因为导入调用同一属性后端模型,却不经过后台 UI 的数据整理。