You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:06:03