Увеличение количества при добавлении того же параметра - PullRequest
1 голос
/ 29 сентября 2011

Мне удалось реализовать ООП Cart Корзина

Предмет содержит 1 или более вариантов.

Если я снова добавлю тот же OptionID, то количество будет увеличиваться, а не создавать еще один Option Объект. Как это можно сделать?

Если я снова добавлю тот же ItemID, он должен отказаться от создания другого Item объекта.

Также мой ООП хорош?

<code>    class Cart {

        public $item = array();

        public function addItem($id) {
            $item = new Item();
            $item->setItem($id);
            $this->item[] = $item;
            return $item;
        }

    }

    class Item {

        private $id = array();
        private $option = array();

        public function setItem($id) {
            $this->id = $id;
            return $this;
        }

        public function addOption($id) {
            $option = new Option();
            $option->setOption($id);
            $this->option[] = $option;
        }

    }

    class Option {

        private $quantity;
        private $id;

        public function setOption($id) {
            $this->quantity = 1;
            $this->id = $id;
            return $this;
        }

    }
    $cart = new Cart();

    //ItemID 10
    $item = $cart->addItem(10);

    //OptionID
    $item->addOption(11);
    $item->addOption(22);
    $item->addOption(22); //should increase quantity

   //It should not create another object because we already have Item Object of ItemID10
   $item = $cart->addItem(10); 

    $Shop = $cart;

    echo "<pre>";
    print_r($Shop);
    echo "
";

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Если вы можете иметь только один элемент с уникальным идентификатором в корзине - переписать метод addItem () следующим образом:

 public function addItem($id) {
        $result = false;

        if (empty($this->item[$id])) {
            $item = new Item();
            $item->setItem($id);
            $this->item[$id] = $item;

            $result = $item;
        }

        return $result;
    }

То же самое с методом addOption ():

public function addOption($id) {
        if (empty($this->option[$id])) {
            $option = new Option();
            $option->setOption($id);
            $this->option[$id] = $option;
        }
        else {
            $this->option[$id]->setQuantity($this->option[$id]->getQuantity() + 1);
        }
    }

И, конечно, вы должны реализовать методы setQuantity () и getQuantity () в классе Option.Надеюсь, это поможет.

0 голосов
/ 29 сентября 2011

Частично переписал код и протестировал:

<code><?php
class Cart {

        public $items = array();

        public function addItem($id) {
            if(array_key_exists($id, $this->items)){
                $item = $this->items[$id];
            }else{
                $item = new Item($id);
                $this->items[$id] = &$item;
            } 
            return $item;
        }

    }

    class Item {

        private $id;
        private $options = array();

        public function __construct($id) {
            $this->id = $id;
            return $this;
        }

        public function addOption($id) {
            if(array_key_exists($id, $this->options)){
                $this->options[$id]->addQuantity();
            }else{
                $option = new Option($id);
                $this->options[$id] = $option;
            }           
        }

    }

    class Option {

        private $quantity;
        private $id;

        public function __construct($id) {
            $this->quantity = 1;
            $this->id = $id;
            return $this;
        }

        public function addQuantity()
        {
            $this->quantity++;
        }
    }

    $cart = new Cart();

    //ItemID 10
    $item = $cart->addItem(10);

    //OptionID
    $item->addOption(11);
    $item->addOption(22);
    $item->addOption(22); //should increase quantity

   //It should not create another object because we already have Item Object of ItemID10
   $item = $cart->addItem(10); 

    $Shop = $cart;

    echo "<pre>";
    print_r($Shop);
    echo "
";?>
...