Opencart自动导入产品模块调用addProduct报Illegal string offset错误
错误原因及解决方案
核心错误原因
你调用addProduct方法的入参结构不符合Opencart系统要求,触发了两个层面的错误:
- 入参层级错误:你构造的
$products_data_array是外层索引数组,每个元素才是单条产品的关联数组,但Opencart自带的addProduct方法每次仅接收单条产品的关联数组作为参数,你直接把外层数组传入后,模型无法读取到model、price等顶层键,所以触发了大量Illegal string offset警告。 - 产品描述结构错误:Opencart支持多语言,
product_description字段需要先以语言ID为第一层键,再嵌套名称、描述等字段,你当前的结构缺失了语言ID层,对应报错里第12行的product_description偏移错误。
具体修复步骤
步骤1:修正入参调用方式
如果是单条测试,直接取数组的第一个元素传入即可:
$this->model_catalog_product->addProduct($products_data_array[0]);
如果后续要批量导入多条产品,循环遍历外层数组逐条调用即可:
foreach ($products_data_array as $single_product) { $this->model_catalog_product->addProduct($single_product); }
步骤2:修正产品描述的多语言结构
先获取系统默认语言ID,再将描述字段嵌套到对应语言ID的数组下:
// 先获取后台配置的默认语言ID $language_id = (int)$this->config->get('config_language_id'); // 构造product_description字段的正确结构 'product_description' => [ $language_id => [ 'name' => strval($results['product_CODE'][$i]), 'meta_description' => strval($results['DESCR'][$i]), 'meta_keyword' => strval($results['product_CODE'][$i]), 'description' => strval($results['DESCR'][$i]), 'tag' => strval($results['CODCODE'][$i]), ] ],
步骤3:修正其他字段的赋值规则
- 品牌字段:
addProduct不会自动创建品牌,你需要先根据$brand名称查询manufacturer表获取对应ID,赋值给manufacturer_id,无对应品牌要先调用addManufacturer创建后再取值,仅传manufacturer名称无效 - 分类字段:你当前传的是分类名称,需要先查询
category_description表获取对应分类ID,将ID数组赋值给product_category字段,仅传category名称无效 - 数值型必填字段:
quantity、tax_class_id、minimum、subtract等字段不要留空字符串,需赋值为有效值,比如没有特殊需求可默认填0或1 - 日期字段:
date_available可默认赋值为date('Y-m-d'),避免日期字段格式错误
注意事项
不要修改Opencart自带的系统模型文件,不仅容易引入额外bug,后续系统升级还会被覆盖,本次问题完全是入参结构错误导致,和系统模型无关。
内容的提问来源于stack exchange,提问作者devblack.exe
相关产品推荐
相关产品推荐

