即使键具有ID和串联值,也仅根据ID限制添加到购物车的项目数

时间:2018-07-04 19:02:00

标签: php

客户在将商品添加到购物车时可以选择出口。即使一个产品可能与多个出口关联,该产品也只有1个ID。如果用户要向购物车添加相同的产品,但选择3个单独的分支,则购物车中的行数仅为3,数量为3。这不是应该的工作方式,因此我将ID与出口ID串联在一起因此,即使是同一产品,在购物车中也会出现3个单独的项目。效果很好,但是当没有足够的库存时,我的问题就来了。

比方说库存中只有1件。如果我将其添加到购物车并选择特定的插座,则它将添加到购物车。如果再次执行此操作并选择另一个分支,则该分支不应添加到购物车,因为只有一个分支。但是,让我为每个选择的不同分支添加1。无论我尝试选择多少个不同的网点,它都只能让我加1。

   $key = "{$prod_id}.{$outlet_id}";
       if (empty($_SESSION['cart_array'][$key])) {
         $_SESSION['cart_array'][$key] = array(
            'prod_id'    => $prod_id,
            'outlet_id'  => $outlet_id,
            'quantity'   => $quantity,
            'prod_name'  => $data['prod_name'],
            'sale_price' => $data['sale_price'],
            'sp_name'    => $data['sp_name'],
            'outlet_name' => $data['outlet_name']

         );

           $response['success'] = true;
           $response['message'] = 'Product added to cart.';
       }

       elseif($_SESSION['cart_array'][$key]['quantity'] >= $data['numVouchersLeft']) {

           $response['success'] = false;
           $response['message'] = 'Insufficient stock. Cannot add to cart.';

       } else {

             $_SESSION['cart_array'][$key]['quantity'] += $quantity;
             $response['success'] = true;
             $response['message'] = 'Product added to cart.';
       }

也许这是需要更改的行?

elseif($_SESSION['cart_array'][$key]['quantity'] >= $data['numVouchersLeft']) {

更新:

我尝试过这种方法,但是由于某些原因,如果我从2个不同的商店添加相同的产品,则$ _SESSION ['cart_array_products]的数量会回到1

 $key = "{$prod_id}.{$outlet_id}";
$keytwo = $prod_id;


           if (empty($_SESSION['cart_array'][$key])) {
             $_SESSION['cart_array'][$key] = array(
                'prod_id'    => $prod_id,
                'outlet_id'  => $outlet_id,
                'quantity'   => $quantity,
                'prod_name'  => $data['prod_name'],
                'sale_price' => $data['sale_price'],
                'sp_name'    => $data['sp_name'],
                'outlet_name' => $data['outlet_name']

             );

             $_SESSION['cart_array_products'][$keytwo] = array(
                 'prod_id' => $prod_id,
                 'quantity2' => $quantity
             );



               $response['success'] = true;
               $response['message'] = 'Product added to cart.';
           }

           elseif($_SESSION['cart_array'][$key]['quantity'] >= $data['numVouchersLeft'] || $_SESSION['cart_array_products'][$keytwo]['quantity2'] >= $data['numVouchersLeft']) {

               $response['success'] = false;
               $response['message'] = 'Insufficient stock. Cannot add to cart.';

           } else {

                 $_SESSION['cart_array'][$key]['quantity'] += $quantity;
                 $_SESSION['cart_array_products'][$keytwo]['quantity2'] += $quantity;
                 $response['success'] = true;
                 $response['message'] = 'Product added to cart.';
           }

3 个答案:

答案 0 :(得分:0)

我设法解决了这个问题,但是如果有人有更好或更优雅的方式,请告诉我

return "shop/index";

答案 1 :(得分:0)

从解决方案的代码开始,我只是对其进行了简化,因此它只检查一次$ keytwo数量是否> = $data['numVouchersLeft']

if(empty($_SESSION['cart_array'][$key])) {
     $_SESSION['cart_array'][$key] = array(
        'prod_id'     => $prod_id,
        'outlet_id'   => $outlet_id,
        'quantity'    => $quantity,
        'prod_name'   => $data['prod_name'],
        'sale_price'  => $data['sale_price'],
        'sp_name'     => $data['sp_name'],
        'outlet_name' => $data['outlet_name']
     );
} else {
  $_SESSION['cart_array'][$key]['quantity'] += $quantity;
}

if (empty($_SESSION['cart_array_products'][$keytwo])){
  $_SESSION['cart_array_products'][$keytwo] = array(
   'prod_id'  => $prod_id,
   'quantity' => $quantity
  );
} else {
  $_SESSION['cart_array_products'][$keytwo]['quantity'] += $quantity;
}

if($_SESSION['cart_array_products'][$keytwo]['quantity'] >= $data['numVouchersLeft']) {
    $response['success'] = false;
    $response['message'] = 'Not enough stock to add item to cart.';
} else {
    $response['success'] = true;
    $response['message'] = 'Product added to cart.';
}

可能值得将$keytwo重命名为更直观的名称:$simpleKey$productKey?但是,也许也值得研究一下我们可以称为$key的东西。

希望这会有所帮助!

答案 2 :(得分:0)

我相信if ( empty( $_SESSION['cart_array'][ $key ] ) )内的代码应更改为此:

if ( empty( $_SESSION['cart_array'][ $key ] ) ) {
    $array_column = array_column( $_SESSION['cart_array'], 'quantity', 'prod_id' );
    if ( array_key_exists( $prod_id, $array_column ) ) {
        // product is already inside the cart so check quantity
        if ( $array_column[ $prod_id ] >= $data['numVouchersLeft'] ) {
            // Insufficient stock 
            $response['success'] = false;
            $response['message'] = 'Insufficient stock. Cannot add to cart.';
        } else {
            // product has some stock so add it
            $_SESSION['cart_array'][ $key ] = array(
                'prod_id'     => $prod_id,
                'outlet_id'   => $outlet_id,
                'quantity'    => $quantity,
                'prod_name'   => $data['prod_name'],
                'sale_price'  => $data['sale_price'],
                'sp_name'     => $data['sp_name'],
                'outlet_name' => $data['outlet_name']
            );
            $response['success']            = true;
            $response['message']            = 'Product added to cart.';
        }
    } else {
        // product is not in the cart so add it
        $_SESSION['cart_array'][ $key ] = array(
            'prod_id'     => $prod_id,
            'outlet_id'   => $outlet_id,
            'quantity'    => $quantity,
            'prod_name'   => $data['prod_name'],
            'sale_price'  => $data['sale_price'],
            'sp_name'     => $data['sp_name'],
            'outlet_name' => $data['outlet_name']
        );
        $response['success']            = true;
        $response['message']            = 'Product added to cart.';
    }
}

我相信,当您添加一个项目并检查关系键时,即使该项目存在,最终也会在if语句if ( empty( $_SESSION['cart_array'][ $key ] ) )内。那是您要保留的功能,因此您要做的就是检查该特定点的库存。首先,我检查购物车内是否有商品产品。如果没有,您只需继续并添加项目。但是,如果需要,则需要检查库存。此时,$array_column应该看起来像这样:

Array
(
    [{product id}] => { quantity }
    [{product id}] => { quantity }
    [{product id}] => { quantity }
    etc.
)

通过使用这些数据,您可以检查$array_column[ $prod_id ](由于我们之前的检查,我们知道 $pro_id在此$array_column内是密钥)< / p>

最后,如果返回true,则表示“库存不足。无法添加到购物车。”

我认为应该是有关我的思考过程的足够信息。应该没有理由更改其他任何东西。

注意:我是看您共享的第一个代码,而不是更新的代码。