Presta 1.7 Product类update方法中parent::update作用及多语言异常咨询
PrestaShop 1.7 Product::update() 问题解析
一、$return = parent::update($null_values); 的作用
Product类继承自PrestaShop核心的ObjectModel基类,这行代码就是调用父类的通用更新方法,核心职责包括:
- 校验模型字段的合法性
- 更新商品主表(
ps_product)的记录 - 处理多语言关联表(
ps_product_lang)和多店铺关联数据的同步更新 $null_values参数的作用:控制是否允许用对象中值为null的字段覆盖数据库中的现有值——设为true时,null值会直接写入数据库;设为false时,会跳过所有值为null的字段,不修改对应数据库记录。
二、多语言描述消失的原因及解决办法
原因
你的_updateProduct方法仅给product对象赋值了box_quantity、id_shop_list、active这几个非语言字段,未加载或设置任何多语言字段(如name、description等),这些字段在product实例中默认是null。
当parent::update($null_values)执行时,ObjectModel的通用更新逻辑会遍历所有定义的语言字段,由于这些字段值为null,且默认$null_values为true,所以会把ps_product_lang表中对应商品的所有语言字段强制更新为null,直接清空原有描述。
注释掉这行代码后,仅执行Product类自身重写的update逻辑(通常只处理主表特定字段,不触碰多语言表),因此原有多语言数据得以保留。
解决办法
推荐两种可行方案:
- 提前加载完整商品数据
在修改字段前,调用load()方法把数据库中已有的多语言字段值加载到product对象中,避免null值覆盖:private function _updateProduct($product, array $productData) { $product->load(); // 加载完整数据,包含所有多语言字段 $product->box_quantity = $productData['product_data']['quantity'] == 0 ? 30 : $productData['product_data']['quantity']; $product->id_shop_list = $productData['shops']; $product->active = 1; $product->update(); } - 禁止null值覆盖更新
调用update()时传入$null_values=false,跳过所有值为null的字段更新:
同时要确保Product类的update方法正确传递该参数给父类,比如:$product->update(false);public function update($null_values = true) { // 自定义逻辑 $return = parent::update($null_values); // 其他逻辑 return $return; }
内容的提问来源于stack exchange,提问作者ButcherFromHell
相关产品推荐
相关产品推荐

