Reputation:
I am using below code to update price amount in cart session of CodeIgniter.
$vars = array('rowid' => $_POST['rowid'],'price' => $amount);
var_dump($this->cart->update($vars));
but result is not reflected. Please guide me where I am wrong.
Upvotes: 2
Views: 2628
Reputation: 1
I tried with this code, referencing it with the previous comment.
$cart_info = $_POST['cart'] ;
$this->cart->destroy();
foreach( $cart_info as $id => $cart){
$data = array(
'rowid' => $cart['rowid'],
'id' => $cart['id'],
'name' => $cart['name'],
'price' => $cart['price'],
'qty' => $cart['qty'],
'subtotal' => $cart['subtotal']
);
$this->cart->insert($data);
}
redirect('orden_compra');
Upvotes: 0
Reputation: 2876
solution by Nelson Wells from https://bitbucket.org/nelson.wells/extended-codeigniter-cart/src/b9d1601be11a7044d54243ffe9470ce4f9f42728/application/libraries/MY_Cart.php?at=default&fileviewer=file-view-default
just use this cart library to extend the core cart library, and use the method cart->update_all($data)
instead of cart->update($data)
(update will still work) tested it with CI 2.2.
it will update any item stored in an item in the cart session (i.e. price, qty, name, price, custom fields).
location :
./application/libraries/MY_Cart.php
File content
<?php
/*
* Class: Extended Cart
* Purpose: Add methods to update any item stored in an item in the
* cart session (i.e. price, qty, name, price, custom fields).
* Limitations: No support for updating array data in items (i.e. the
* options array, any custom data stored as an array)
* Author: Nelson Wells
* License: The CodeIgniter license. Read it.
*/
/**** Use: ****
*
* $data = array(
* 'rowid' => 'dhedu3k3mhdu2n',
* 'qty' => 10,
* 'name' => 'hello'
* );
*
* $this->cart->update_all($data);
*
* OR
*
* $data = array(
* array(
* 'rowid' => 'dlk2jkduvk2d',
* 'name' => 'world'
* ),
* array(
* 'rowid' => 'dklg3h211kd',
* 'price' => 25.50
* )
* );
*
* $this->cart->update_all($data);
*
*
*/
class MY_Cart extends CI_Cart
{
function __construct()
{
parent::__construct();
}
function update_all($items = array())
{
// Was any cart data passed?
if ( ! is_array($items) OR count($items) == 0)
{
return false;
}
// You can either update a single product using a one-dimensional array,
// or multiple products using a multi-dimensional one. The way we
// determine the array type is by looking for a required array key named "rowid".
// If it's not found we assume it's a multi-dimensional array
if (isset($items['rowid']))
{
$this->_update_item($items);
}
else
{
foreach($items as $item)
{
$this->_update_item($item);
}
}
$this->_save_cart();
}
/*
* Function: _update_item
* Param: Array with a rowid and information about the item to be updated
* such as qty, name, price, custom fields.
*/
function _update_item($item)
{
foreach($item as $key => $value)
{
//don't allow them to change the rowid
if($key == 'rowid')
{
continue;
}
//do some processing if qty is
//updated since it has strict requirements
if($key == "qty")
{
// Prep the quantity
$item['qty'] = preg_replace('/([^0-9])/i', '', $item['qty']);
// Is the quantity a number?
if ( ! is_numeric($item['qty']))
{
continue;
}
// Is the new quantity different than what is already saved in the cart?
// If it's the same there's nothing to do
if ($this->_cart_contents[$item['rowid']]['qty'] == $item['qty'])
{
continue;
}
// Is the quantity zero? If so we will remove the item from the cart.
// If the quantity is greater than zero we are updating
if ($item['qty'] == 0)
{
unset($this->_cart_contents[$item['rowid']]);
continue;
}
}
$this->_cart_contents[$item['rowid']][$key] = $value;
}
}
}
Upvotes: 0
Reputation: 175
I know it's been a while since the question was asked, but I had the same problem and think this may help other people in the future.
By default CodeIgniter cart doesn't allow you to update the price nor any element which is not the qty. There are two ways to handle that.
The first one is to copy the content and update the copy, then delete the original and insert again. This can be a little messy:
$data = $delete = $this->cart->contents()[0];
$data['price'] = $new_price;
$delete['qty'] = 0;
$this->cart->update($delete);
$this->cart->insert($data);
The second way is to update the cart class with this one: http://blog.thecodingbox.me/codeigniter-cart-class-extended-to-update-price/ and just update the cart as it should be. I have to say I've never tried this one.
Upvotes: 2