如何让Prestashop自定义类在WebService触发库存变更时运行
问题根因
你当前的自定义逻辑绑定在AdminProductsControllerCore上,仅适用于后台手动操作、前端订单走默认控制器流程的场景,WebService调用库存更新时不会走这个控制器流程,因此同步逻辑不会触发。
解决方案
方案1:使用原生钩子实现(推荐,兼容性最优)
Prestashop所有库存变更场景都会触发actionUpdateQuantity钩子,你只需要把现有同步逻辑迁移到自定义模块的钩子回调中即可:
- 在自定义模块的
install()方法中注册actionUpdateQuantity钩子 - 在模块内新增钩子回调方法:
public function hookActionUpdateQuantity($params) { // $params核心参数说明: // $params['id_product']:触发库存变更的商品ID // $params['id_product_attribute']:商品规格ID,无规格时为0 // $params['quantity']:变更后的最新库存值 // 在此处复制你原有AdminProductsController中的关联商品同步逻辑即可 }
该钩子覆盖所有库存变更场景:后台手动修改、前端订单生成、WebService调用更新库存完全适配。
方案2:重写StockAvailable类(无需模块时可选)
所有库存更新最终都会调用StockAvailable::setQuantity方法,你可以重写该方法追加同步逻辑:
- 在
override/classes/stock/目录下新建StockAvailable.php文件 - 写入代码结构:
class StockAvailable extends StockAvailableCore { public static function setQuantity($id_product, $id_product_attribute, $quantity, $id_shop = null, $id_order = null, $id_stock_mvt_reason = null, $save = true) { // 执行原生库存更新逻辑 parent::setQuantity($id_product, $id_product_attribute, $quantity, $id_shop, $id_order, $id_stock_mvt_reason, $save); // 在此处追加关联商品同步逻辑 // 注意增加循环更新防护:同步关联商品库存时不要重复触发同步逻辑,可通过静态标记变量实现 } }
- 保存后删除Prestashop根目录下
var/cache/prod/class_index.php文件让重写生效。
注意事项
两种方案都需要添加循环更新防护,避免更新关联商品库存时再次触发同步逻辑导致死循环,可通过添加静态变量标记实现:同步逻辑执行前先判断标记是否为更新中,是则直接返回,否则标记为更新中后执行同步,同步完成后重置标记。
内容的提问来源于stack exchange,提问作者Bogdan90i
相关产品推荐
相关产品推荐

