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();
} 

これに関する問題は、一部の製品にバリエーション (サイズ、色など) があるが、同じ注文で別のバリエーションを選択した場合、製品が正しく追加されないことです。同じ製品のすべてが 1 つのバリエーションに分類されます。

多次元配列、または配列内の配列を使用して、次のようなものを生成するのはアイデアだと思いました。

$this->iteminfo[$itemid][$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) 配列を使用することをお勧めしますが、単純な古い int と文字列で埋めるのではなく、その中にオブジェクトを配置します。その方がはるかに堅牢であり、必要なものを取得するために簡単に循環でき、将来的にオブジェクトをさらに拡張することもできます.

このようなものも機能します:

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 に答える