0
votes

How to update an item quantity if the product already exists in shopping cart?

Here's my add to cart function:

public function add() {
        $product= $this->products_model->listProduct($this->input->post('id_product'));

        $data = array(
            'id' => $this->input->post('id_product'),
            'qty' => $this->input->post('qty'),
            'price' => $product->price,
            'name' => $product->title           );

        $this->cart->insert($data);
        redirect('product/'.$product->id.'/'.url_title($product->title, 'dash', TRUE));
    }

With this function, if the product exists in the cart, let's say with quantity of 8, if i add the same product with quantity of 1 it'll be 1 and not 9.

Thanks in advance.

5

5 Answers

1
votes

@AFRC you can try

 public function add() {
        $flag = TRUE;
        $dataTmp = $this->cart->contents();

        foreach ($dataTmp as $item) {
            if ($item['id'] == 'sku_123ABC') {
                echo "Found Id so updatig quantity";
                $qtyn = $item['qty'] + 1;
                $this->update($item['rowid'], $qtyn);
                $flag = FALSE;
                break;
            }
        }
        if ($flag) {
            $data = array(
                'id' => 'sku_123ABC',
                'qty' => 1,
                'price' => 39.95,
                'name' => 'T-Shirt',
            );
            $this->cart->insert($data);
            echo "Inserting as not found in the cart";
        }
        echo "Add1 called";
    }
0
votes

I don't see where $produto is defined, shouldn't it be, instead, $product->price and $product->title, respectively?

According to the docs :

Important: The first four array indexes above (id, qty, price, and name) are required. If you omit any of them the data will not be saved to the cart.

Be sure to check if they're acqually set (maybe look for spelling errors, like, I shoot in the dark, 'qtd' instead of 'qty', or something like that). Moreover, if you want to UPDATE a product already present, you need to use $this->cart->update() instead of $this->cart->insert()

0
votes

Just check with this if you have options

$rowid == md5($items['id'].implode('', $items['options']));

if not

$rowid == md5($items['id']);
0
votes

use this code for add to cart

 if (count($this->cart->contents())>0){
                    foreach ($this->cart->contents() as $item){
                        if ($item['id']==$product->id){
                            $data = array('rowid'=>$item['rowid'],'qty'=>++$item['qty']);
                            $this->cart->update($data);
                        }else{
                            $data = array('id'=>$product->id,'qty'=>1,'price'=>$product->price,'name'=>$product->id,'options'=>array('image'=>$product->thumb,'product_name'=>$product->title));
                            $this->cart->insert($data);
                        }
                    }
0
votes

I used AFRC's answer to create the code below, it may be helpful. Thanks for your reply it really helped me! You can call the cart function below if there is an id present matching in your cart update will occur, otherwise insert will. It'll also display the cart view reguardless of insert, update, or just display. Please note i have a separate function get_specific_craft that is being used to get the slug items data (such as price and name).

public function cart($slug = "")
{
    if($slug != "")
    {
        $craft = $this->crafts_model->get_specific_craft($slug);

        $flag = TRUE;

        foreach ($this->cart->contents() as $item)
        {

            if ($item['id'] == $slug) 
            {
                $qtyn = $item['qty'] + 1;

                $dat = array(
                   'rowid' => $item['rowid'],
                   'qty'   => $qtyn
                );


                $this->cart->update($dat);
                $flag = FALSE;
                break;
            }
        }

        if ($flag) 
        {
            $crt = array(
               'id'      => $craft['id'],
               'qty'     => 1,
               'price'   => $craft['price'],
               'name'    => $craft['name']
               //'options' => array('Size' => 'L', 'Color' => 'Red')
            );
            $this->cart->insert($crt);

        }       
    }
    $this->load->view('cart' , $this->data);

}