Prestashop 1.7在最终订单步骤检查可用库存

时间:2017-10-23 17:04:22

标签: prestashop cart prestashop-1.7

我在Prestashop 1.6上有一些工作要检查购物车数量,然后才能购买。这是我在Prestashop 1.7上的问题: 如果顾客今天在他的购物车中放了一件物品,他会在2天内回来并且他仍然登录。当实际上,该产品缺货时,购物车仍然可用。 客户可以下订单,我的库存数量为-1。自从我升级到prestashop 1.7以来,这是一场灾难,我的数量为-5,-10 ......因为如果这个未经检查的情况。

abstract class PaymentModule extends PaymentModuleCore
{
    public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown',
        $message = null, $extra_vars = array(), $currency_special = null, $dont_touch_amount = false,
        $secure_key = false, Shop $shop = null)
    {

        if (!isset($this->context))
            $this->context = Context::getContext();
        $this->context->cart = new Cart($id_cart);

        if (!$this->context->cart->checkQuantities()){
            Tools::redirect(__PS_BASE_URI__.'order.php?step=0');
        }
        return parent::validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method, $message, 
            $extra_vars, $currency_special, $dont_touch_amount, $secure_key, $shop);
    }
}

1 个答案:

答案 0 :(得分:1)

实际上,最好的解决方案是使用此插件:https://addons.prestashop.com/en/stock-supplier-management/21707-temporary-product-reservation-lonely-stock.html

Prestashop处理真正糟糕的购物车库存。

无论如何,如果您想自己动手并检查库存,这很简单:

<?php

    $cart = $this->context->cart;
    $cart_products = $cart->getProducts();

    if (!empty($cart_products)) {

        $db = Db::getInstance();

        foreach ($cart_products as $key => $cart_product) {

            $real_quantity = StockAvailable::getQuantityAvailableByProduct($cart_product['id_product'], $cart_product['id_product_attribute']);

            if ( (int) $real_quantity < (int) $cart_product['quantity'] ) {

                // If negative
                $real_quantity = (int) $real_quantity < 0 ? 0 : $real_quantity;

                $sql = '
                        UPDATE `'._DB_PREFIX_.'cart_product`
                        SET quantity = '.(int) $real_quantity.',`date_add` = NOW()
                        WHERE `id_product` = '.(int) $cart_product['id_product'].
                        (!empty($cart_product['id_product_attribute']) ? ' AND `id_product_attribute` = '.(int) $cart_product['id_product_attribute'] : '').'
                        AND `id_cart` = '.(int) $cart->id;

                    $db->execute($sql);
            }

        }

        // Garbage collector
        $db->execute('DELETE FROM '._DB_PREFIX_.'cart_product WHERE quantity < 1 ');

    }