当订单状态仍然是&#34时,避免减少产品数量"过程"

时间:2016-04-28 02:18:19

标签: php prestashop inventory product-quantity

如果产品数量仍处于"过程"并在订单发货或交付时更新?

我已在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']);
    }
}

1 个答案:

答案 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