0

不久前我做了一个系统,其中涉及一个基本的购物车。购物车是一个非常简单的 OOP 系统,一次添加 1 个数量的商品。这是将商品添加到购物车的功能。

    function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE)
{ 

    if($this->itemqtys[$itemid] > 0)
            { // the item is already in the cart..
      // so we'll just increase the quantity

        $this->itemqtys[$itemid] = $qty + $this->itemqtys[$itemid];
        $this->_update_total();
    } else {
        $this->items[]=$itemid;
        $this->itemqtys[$itemid] = $qty;
        $this->itemprices[$itemid] = $price;
        $this->iteminfo[$itemid] = $info;
    }
    $this->_update_total();
} 

问题是一些产品有变体(尺寸、颜色等),但是当他们在同一订单中选择不同的变体时,产品没有正确添加 - 所有相同的产品都属于一个变体。

我认为使用多维数组或数组中的数组来产生类似的东西是一个想法:

$this->iteminfo[$itemid][$var];

从产品中获取 var 不是问题,我只是在苦苦思索如何将产品及其变体添加到购物车中,并且只有在再次添加变体时才更新此产品/变体组合的数量。如果添加了不同的变体,它会将产品添加到购物车的新条目中吗?

希望这是有道理的:/谢谢

4

3 回答 3

3

这对我来说似乎不是很 OOP。您应该为购物车项目创建一个类,其中包含数量、价格、变化等,然后将此类的对象添加到购物车对象中的项目数组中。

然后,您的方法将变成以下内容:

function add_item($itemid, $qty=1, $variation ="", $price = FALSE, $info = FALSE){ 

    // use itemid concatenated with variation 
    // to get a unique key for every item in your cart 
    if(array_key_exists($itemid . $variation, $this->items)){ 

        // the item is already in the cart..
        // so we'll just increase the quantity
        $item = $this->items[$itemid];

        // this assumes a method in the Item class to add to the quantity
        $item->addToQuantity($qty);

        // put the updated item in the cart
        $this->items[$itemid] = $item;
    } else {
        // create a new item object
        $item = new Item();
        $item->setId($itemid);
        $item->setQuantity($qty);
        $item->setPrice($price);
        $item->setInfo($info);
        $item->setVariation($variation);

        // add it to the items array using a unique key
        $this->items[$itemid . $variation] = $item;
    }
    $this->_update_total();
} 
于 2012-09-17T08:57:07.833 回答
2

我建议使用单维(al)数组,而不是用普通的旧整数和字符串填充它,而是在其中放置一个对象。这样会更加健壮,您可以轻松循环以获取所需的任何内容 - 以及将来能够进一步扩展对象。

这样的事情甚至会起作用:

class itemToBuy
{
    public $itemID;
    public $qty;
    public $price;
    public $info;
    public $whoKnowsWhat;
}

class yourShoppingCart
{
    function add_item($newItem)
    {
        $itemInserted==false;
        $itemsInCart=count($this->itemqtys);
        for($i=0;$i<$itemsInCart;$i++)
        {
            if($this->itemqtys[$i]->itemID==$newItem->itemID)
            {
                $this->itemqtys[$i]->qty+=$newItem->qty;
                $itemInserted=true;
            }
        }
        if(!itemInserted)
        {
            $this->itemqtys[]=$newItem;
        }
        $this->_update_total();
    } 
}

然后只传递对象实例,itemToBuy而不是你现在传递的数组。

于 2012-09-17T08:57:36.200 回答
1

您可以为每个项目的变量设置一个变化值$this->itemqtys,然后您可以检查如下:

<?php
// add a extra $var for checking the variations
function add_item($itemid,$qty=1,$price = FALSE, $info = FALSE, $var=FALSE) {
    if( ( $this->itemqtys[$itemid] > 0 ) && ( $this->itemqtys[$itemid]['var'] == $var ) ) {
          // item already in cart, update
    } else {
          // add item to the cart, along with the variation.
    }
}
?>

希望这可以帮助。

于 2012-09-17T08:59:32.660 回答