如何防止 PrestaShop 在订单验证后更新产品数量
How prevent PrestaShop from updating product quantities after order validation
我是 prestashop 的新手,我正在尝试制作一个支付模块,我需要在其中复制订单以解决统计问题。我的问题是重复订单也会从产品库存中减去,我需要知道在订单验证后,prestashop 在哪里更新库存以避免调用相应的函数。简而言之,我调用了两次 validateOrder() 但我需要更新一次 StockAvailable。
顺便说一句,我检查了整个 validateOrder() 函数以搜索更新部分/函数,但我一直没能找到它。
我能找到的唯一相关代码是:
// updates stock in shops
if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'))
{
$product_list = $order->getProducts();
foreach ($product_list as $product)
{
// if the available quantities depends on the physical stock
if (StockAvailable::dependsOnStock($product['product_id']))
{
// synchronizes
StockAvailable::synchronize($product['product_id'], $order->id_shop);
}
}
}
但这仅在启用高级库存管理时有效。
谢谢。
您要查找的代码位于 OrderDetail::create
方法中,该方法使用 OrderDetail::checkProductStock
进而调用 StockAvailable::updateQuantity
$update_quantity = StockAvailable::updateQuantity(...
有趣的是,在更新数量之前有这个条件
if (!StockAvailable::dependsOnStock($product['id_product']))
我建议您在需要时 override this method 和 return 为真。
您可以在复制订单之前设置一个全局标志,然后检查该标志,如果它是 true return true 以防止更新库存。
override/classes/stock/StockAvailable.php
中的覆盖代码
class StockAvailable extends StockAvailableCore
{
public static function dependsOnStock($id_product, $id_shop = null)
{
$no_quantity_update = isset($GLOBALS['no_quantity_update']) && $GLOBALS['no_quantity_update'];
if ($no_quantity_update)
return true;
else return parent::dependsOnStock($id_product, $id_shop = null);
}
}
要使此覆盖生效,请删除文件 cache/class_index.php
以刷新覆盖列表
您的模块代码:
//set to false just to be sure
$GLOBALS['no_quantity_update'] = false;
$this->module->validateOrder($cart->id, Configuration...
//set to true to prevent quantity update
$GLOBALS['no_quantity_update'] = true;
$this->module->validateOrder($cart->id, Configuration...
您可以直接修改核心代码,但不推荐这样做
我是 prestashop 的新手,我正在尝试制作一个支付模块,我需要在其中复制订单以解决统计问题。我的问题是重复订单也会从产品库存中减去,我需要知道在订单验证后,prestashop 在哪里更新库存以避免调用相应的函数。简而言之,我调用了两次 validateOrder() 但我需要更新一次 StockAvailable。
顺便说一句,我检查了整个 validateOrder() 函数以搜索更新部分/函数,但我一直没能找到它。
我能找到的唯一相关代码是:
// updates stock in shops
if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT'))
{
$product_list = $order->getProducts();
foreach ($product_list as $product)
{
// if the available quantities depends on the physical stock
if (StockAvailable::dependsOnStock($product['product_id']))
{
// synchronizes
StockAvailable::synchronize($product['product_id'], $order->id_shop);
}
}
}
但这仅在启用高级库存管理时有效。
谢谢。
您要查找的代码位于 OrderDetail::create
方法中,该方法使用 OrderDetail::checkProductStock
进而调用 StockAvailable::updateQuantity
$update_quantity = StockAvailable::updateQuantity(...
有趣的是,在更新数量之前有这个条件
if (!StockAvailable::dependsOnStock($product['id_product']))
我建议您在需要时 override this method 和 return 为真。
您可以在复制订单之前设置一个全局标志,然后检查该标志,如果它是 true return true 以防止更新库存。
override/classes/stock/StockAvailable.php
class StockAvailable extends StockAvailableCore
{
public static function dependsOnStock($id_product, $id_shop = null)
{
$no_quantity_update = isset($GLOBALS['no_quantity_update']) && $GLOBALS['no_quantity_update'];
if ($no_quantity_update)
return true;
else return parent::dependsOnStock($id_product, $id_shop = null);
}
}
要使此覆盖生效,请删除文件 cache/class_index.php
以刷新覆盖列表
您的模块代码:
//set to false just to be sure
$GLOBALS['no_quantity_update'] = false;
$this->module->validateOrder($cart->id, Configuration...
//set to true to prevent quantity update
$GLOBALS['no_quantity_update'] = true;
$this->module->validateOrder($cart->id, Configuration...
您可以直接修改核心代码,但不推荐这样做