如果产品数量仍处于"过程"并在订单发货或交付时更新?
我已在orderdetail.php
中编辑了这部分代码,并在if语句中添加了此$id_order_state != Configuration::get('PS_OS_PREPARATION')
。是的,数量在处理时不会减少,但在发货时数量也不会减少。请帮助我被困在这里。
protected function checkProductStock($product, $id_order_state)
{
if ($id_order_state != Configuration::get('PS_OS_CANCELED') && $id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_PREPARATION')) {
$update_quantity = true;
if (!StockAvailable::dependsOnStock($product['id_product'])) {
$update_quantity = StockAvailable::updateQuantity($product['id_product'], $product['id_product_attribute'], -(int)$product['cart_quantity']);
}
if ($update_quantity) {
$product['stock_quantity'] -= $product['cart_quantity'];
}
if ($product['stock_quantity'] < 0 && Configuration::get('PS_STOCK_MANAGEMENT')) {
$this->outOfStock = true;
}
Product::updateDefaultAttribute($product['id_product']);
}
}
答案 0 :(得分:0)
OrderDetail对象仅为每个订单创建一次,即使您更改订单状态,也不会在此之后更新。因此,当您创建OrderDetail对象时,如果您修改了它,它将不会更新股票,因为它没有正确的状态。当您稍后更改订单状态时,将永远不会再次调用方法checkProductStock
。
您可以创建一个挂钩actionOrderStatusPostUpdate
的自定义模块(在changeIdOrderState()
类的OrderHistory()
方法中触发。在您的模块中,您将复制checkProductStock()
方法并调用如果状态是&#34;运送&#34;。
修改强>
如果您想直接在核心中添加它:
修改classes/order/OrderHistory.php
在方法changeIdOrderState()
中更改最后一行:
// executes hook
Hook::exec('actionOrderStatusPostUpdate', array('newOrderStatus' => $new_os, 'id_order' => (int)$order->id, ), null, false, true, false, $order->id_shop);
// Here change 4 to the desired id_order_state
if ($new_order_state == 4)
{
$virtual_products = $order->getVirtualProducts();
foreach ($virtual_products as $virtual_product)
{
$this->checkProductStock($virtual_product['product_id'], $new_order_state);
}
}
ShopUrl::resetMainDomainCache();
}
之后在此类中添加一个新方法:
protected function checkProductStock($product, $id_order_state)
{
$update_quantity = true;
if (!StockAvailable::dependsOnStock($product['product_id']))
{
StockAvailable::updateQuantity($product['product_id'], $product['product_attribute_id'], -(int)$product['product_quantity']);
}
Product::updateDefaultAttribute($product['product_id']);
}
此代码尚未经过测试。
我建议你以覆盖方式进行:
在/overrides/classes/order/OrderHistory.php
中创建一个包含这两种方法的新文件并将类定义更改为class OrderHistory extends OrderHistoryCore {
,您必须在添加此文件后删除/cache/class_index.php
。