blob: d4b17fa362576d4a8a4deb406f3723353b12959e [file] [log] [blame]
Andrey Andreevbb248832011-12-21 16:42:51 +02001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Rick Ellis98783322009-02-17 02:29:44 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Rick Ellis98783322009-02-17 02:29:44 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreevbb248832011-12-21 16:42:51 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreevbb248832011-12-21 16:42:51 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Rick Ellis98783322009-02-17 02:29:44 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Greg Aker0defe5d2012-01-01 18:46:41 -060021 * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Rick Ellis98783322009-02-17 02:29:44 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
27
Rick Ellis98783322009-02-17 02:29:44 +000028/**
29 * Shopping Cart Class
30 *
31 * @package CodeIgniter
32 * @subpackage Libraries
33 * @category Shopping Cart
Derek Jonesf4a4bd82011-10-20 12:18:42 -050034 * @author EllisLab Dev Team
Rick Ellis98783322009-02-17 02:29:44 +000035 * @link http://codeigniter.com/user_guide/libraries/cart.html
36 */
37class CI_Cart {
38
Timothy Warren86611db2012-04-27 10:06:25 -040039 /**
40 * These are the regular expression rules that we use to validate the product ID and product name
41 * alpha-numeric, dashes, underscores, or periods
Andrey Andreev56454792012-05-17 14:32:19 +030042 *
Timothy Warren86611db2012-04-27 10:06:25 -040043 * @var string
44 */
45 public $product_id_rules = '\.a-z0-9_-';
Andrey Andreev56454792012-05-17 14:32:19 +030046
Timothy Warren86611db2012-04-27 10:06:25 -040047 /**
48 * These are the regular expression rules that we use to validate the product ID and product name
49 * alpha-numeric, dashes, underscores, colons or periods
50 *
51 * @var string
52 */
53 public $product_name_rules = '\.\:\-_ a-z0-9';
Andrey Andreev56454792012-05-17 14:32:19 +030054
Timothy Warren86611db2012-04-27 10:06:25 -040055 /**
56 * only allow safe product names
57 *
58 * @var bool
59 */
60 public $product_name_safe = TRUE;
Barry Mienydd671972010-10-04 16:33:58 +020061
Timothy Warren86611db2012-04-27 10:06:25 -040062 // --------------------------------------------------------------------------
Andrey Andreev6f042cc2012-03-26 14:58:33 +030063 // Protected variables. Do not change!
Timothy Warren86611db2012-04-27 10:06:25 -040064 // --------------------------------------------------------------------------
Andrey Andreev56454792012-05-17 14:32:19 +030065
Timothy Warren86611db2012-04-27 10:06:25 -040066 /**
67 * Reference to CodeIgniter instance
68 *
69 * @var object
70 */
Andrey Andreev6f042cc2012-03-26 14:58:33 +030071 protected $CI;
Andrey Andreev56454792012-05-17 14:32:19 +030072
Timothy Warren86611db2012-04-27 10:06:25 -040073 /**
74 * Contents of the cart
75 *
76 * @var array
77 */
Andrey Andreev6f042cc2012-03-26 14:58:33 +030078 protected $_cart_contents = array();
Rick Ellis98783322009-02-17 02:29:44 +000079
80 /**
81 * Shopping Class Constructor
82 *
83 * The constructor loads the Session class, used to store the shopping cart contents.
Timothy Warren86611db2012-04-27 10:06:25 -040084 *
85 * @param array
Andrey Andreev56454792012-05-17 14:32:19 +030086 * @return void
Barry Mienydd671972010-10-04 16:33:58 +020087 */
Greg Akera9263282010-11-10 15:26:43 -060088 public function __construct($params = array())
Barry Mienydd671972010-10-04 16:33:58 +020089 {
Rick Ellis98783322009-02-17 02:29:44 +000090 // Set the super object to a local variable for use later
91 $this->CI =& get_instance();
Barry Mienydd671972010-10-04 16:33:58 +020092
Derek Jones37f4b9c2011-07-01 17:56:50 -050093 // Are any config settings being passed manually? If so, set them
Andrey Andreevbb248832011-12-21 16:42:51 +020094 $config = is_array($params) ? $params : array();
Barry Mienydd671972010-10-04 16:33:58 +020095
Rick Ellis98783322009-02-17 02:29:44 +000096 // Load the Sessions class
97 $this->CI->load->library('session', $config);
Barry Mienydd671972010-10-04 16:33:58 +020098
Andrey Andreevbb248832011-12-21 16:42:51 +020099 // Grab the shopping cart array from the session table
100 $this->_cart_contents = $this->CI->session->userdata('cart_contents');
101 if ($this->_cart_contents === FALSE)
Rick Ellis98783322009-02-17 02:29:44 +0000102 {
103 // No cart exists so we'll set some base values
Andrey Andreevbb248832011-12-21 16:42:51 +0200104 $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);
Rick Ellis98783322009-02-17 02:29:44 +0000105 }
Barry Mienydd671972010-10-04 16:33:58 +0200106
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300107 log_message('debug', 'Cart Class Initialized');
Rick Ellis98783322009-02-17 02:29:44 +0000108 }
109
110 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200111
Rick Ellis98783322009-02-17 02:29:44 +0000112 /**
113 * Insert items into the cart and save it to the session table
114 *
Rick Ellis98783322009-02-17 02:29:44 +0000115 * @param array
116 * @return bool
117 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200118 public function insert($items = array())
Rick Ellis98783322009-02-17 02:29:44 +0000119 {
120 // Was any cart data passed? No? Bah...
Andrey Andreevbb248832011-12-21 16:42:51 +0200121 if ( ! is_array($items) OR count($items) === 0)
Rick Ellis98783322009-02-17 02:29:44 +0000122 {
123 log_message('error', 'The insert method must be passed an array containing data.');
124 return FALSE;
125 }
Barry Mienydd671972010-10-04 16:33:58 +0200126
127 // You can either insert a single product using a one-dimensional array,
Rick Ellis98783322009-02-17 02:29:44 +0000128 // or multiple products using a multi-dimensional one. The way we
129 // determine the array type is by looking for a required array key named "id"
130 // at the top level. If it's not found, we will assume it's a multi-dimensional array.
Barry Mienydd671972010-10-04 16:33:58 +0200131
132 $save_cart = FALSE;
Rick Ellis98783322009-02-17 02:29:44 +0000133 if (isset($items['id']))
Barry Mienydd671972010-10-04 16:33:58 +0200134 {
Phil Sturgeon90910512011-07-20 10:07:40 -0600135 if (($rowid = $this->_insert($items)))
Rick Ellis98783322009-02-17 02:29:44 +0000136 {
137 $save_cart = TRUE;
138 }
139 }
140 else
141 {
142 foreach ($items as $val)
143 {
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300144 if (is_array($val) && isset($val['id']))
Rick Ellis98783322009-02-17 02:29:44 +0000145 {
Phil Sturgeon90910512011-07-20 10:07:40 -0600146 if ($this->_insert($val))
Rick Ellis98783322009-02-17 02:29:44 +0000147 {
148 $save_cart = TRUE;
149 }
Barry Mienydd671972010-10-04 16:33:58 +0200150 }
Rick Ellis98783322009-02-17 02:29:44 +0000151 }
152 }
153
154 // Save the cart data if the insert was successful
Andrey Andreevbb248832011-12-21 16:42:51 +0200155 if ($save_cart === TRUE)
Rick Ellis98783322009-02-17 02:29:44 +0000156 {
157 $this->_save_cart();
Phil Sturgeon90910512011-07-20 10:07:40 -0600158 return isset($rowid) ? $rowid : TRUE;
Rick Ellis98783322009-02-17 02:29:44 +0000159 }
160
161 return FALSE;
162 }
163
164 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200165
Rick Ellis98783322009-02-17 02:29:44 +0000166 /**
167 * Insert
168 *
Rick Ellis98783322009-02-17 02:29:44 +0000169 * @param array
170 * @return bool
171 */
Andrey Andreev74476e12012-03-26 15:03:40 +0300172 protected function _insert($items = array())
Rick Ellis98783322009-02-17 02:29:44 +0000173 {
174 // Was any cart data passed? No? Bah...
Andrey Andreevbb248832011-12-21 16:42:51 +0200175 if ( ! is_array($items) OR count($items) === 0)
Rick Ellis98783322009-02-17 02:29:44 +0000176 {
177 log_message('error', 'The insert method must be passed an array containing data.');
178 return FALSE;
179 }
Barry Mienydd671972010-10-04 16:33:58 +0200180
Rick Ellis98783322009-02-17 02:29:44 +0000181 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200182
Derek Jones37f4b9c2011-07-01 17:56:50 -0500183 // Does the $items array contain an id, quantity, price, and name? These are required
Andrey Andreev56454792012-05-17 14:32:19 +0300184 if ( ! isset($items['id'], $items['qty'], $items['price'], $items['name']))
Rick Ellis98783322009-02-17 02:29:44 +0000185 {
186 log_message('error', 'The cart array must contain a product ID, quantity, price, and name.');
187 return FALSE;
188 }
189
190 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200191
Andrey Andreevbb248832011-12-21 16:42:51 +0200192 // Prep the quantity. It can only be a number. Duh... also trim any leading zeros
Andrey Andreev17779d62011-12-22 13:21:08 +0200193 $items['qty'] = (float) $items['qty'];
Rick Ellis98783322009-02-17 02:29:44 +0000194
195 // If the quantity is zero or blank there's nothing for us to do
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300196 if ( ! is_numeric($items['qty']) OR $items['qty'] == 0)
Rick Ellis98783322009-02-17 02:29:44 +0000197 {
198 return FALSE;
199 }
Barry Mienydd671972010-10-04 16:33:58 +0200200
Rick Ellis98783322009-02-17 02:29:44 +0000201 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200202
Rick Ellis98783322009-02-17 02:29:44 +0000203 // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods
204 // Not totally sure we should impose this rule, but it seems prudent to standardize IDs.
205 // Note: These can be user-specified by setting the $this->product_id_rules variable.
Andrey Andreevbb248832011-12-21 16:42:51 +0200206 if ( ! preg_match('/^['.$this->product_id_rules.']+$/i', $items['id']))
Rick Ellis98783322009-02-17 02:29:44 +0000207 {
Derek Jones37f4b9c2011-07-01 17:56:50 -0500208 log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores');
Rick Ellis98783322009-02-17 02:29:44 +0000209 return FALSE;
210 }
211
212 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200213
Rick Ellis98783322009-02-17 02:29:44 +0000214 // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods.
215 // Note: These can be user-specified by setting the $this->product_name_rules variable.
Andrey Andreevbb248832011-12-21 16:42:51 +0200216 if ($this->product_name_safe && ! preg_match('/^['.$this->product_name_rules.']+$/i', $items['name']))
Rick Ellis98783322009-02-17 02:29:44 +0000217 {
Andrew Seymour3dd66632011-12-13 15:50:52 +0000218 log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces');
219 return FALSE;
Rick Ellis98783322009-02-17 02:29:44 +0000220 }
221
222 // --------------------------------------------------------------------
223
Andrey Andreevbb248832011-12-21 16:42:51 +0200224 // Prep the price. Remove leading zeros and anything that isn't a number or decimal point.
Andrey Andreev17779d62011-12-22 13:21:08 +0200225 $items['price'] = (float) $items['price'];
Barry Mienydd671972010-10-04 16:33:58 +0200226
Rick Ellis98783322009-02-17 02:29:44 +0000227 // Is the price a valid number?
228 if ( ! is_numeric($items['price']))
229 {
230 log_message('error', 'An invalid price was submitted for product ID: '.$items['id']);
231 return FALSE;
232 }
233
234 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200235
Rick Ellis98783322009-02-17 02:29:44 +0000236 // We now need to create a unique identifier for the item being inserted into the cart.
Barry Mienydd671972010-10-04 16:33:58 +0200237 // Every time something is added to the cart it is stored in the master cart array.
238 // Each row in the cart array, however, must have a unique index that identifies not only
239 // a particular product, but makes it possible to store identical products with different options.
240 // For example, what if someone buys two identical t-shirts (same product ID), but in
Derek Jones37f4b9c2011-07-01 17:56:50 -0500241 // different sizes? The product ID (and other attributes, like the name) will be identical for
Rick Ellis98783322009-02-17 02:29:44 +0000242 // both sizes because it's the same shirt. The only difference will be the size.
243 // Internally, we need to treat identical submissions, but with different options, as a unique product.
244 // Our solution is to convert the options array to a string and MD5 it along with the product ID.
245 // This becomes the unique "row ID"
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300246 if (isset($items['options']) && count($items['options']) > 0)
Rick Ellis98783322009-02-17 02:29:44 +0000247 {
ThallisPHPf074dff2012-05-03 16:01:46 -0300248 $rowid = md5($items['id'].serialize($items['options']));
Rick Ellis98783322009-02-17 02:29:44 +0000249 }
250 else
251 {
252 // No options were submitted so we simply MD5 the product ID.
253 // Technically, we don't need to MD5 the ID in this case, but it makes
254 // sense to standardize the format of array indexes for both conditions
255 $rowid = md5($items['id']);
Barry Mienydd671972010-10-04 16:33:58 +0200256 }
Rick Ellis98783322009-02-17 02:29:44 +0000257
258 // --------------------------------------------------------------------
259
260 // Now that we have our unique "row ID", we'll add our cart items to the master array
Andrew Seymour2e5bda32011-12-13 11:40:15 +0000261 // grab quantity if it's already there and add it on
Andrey Andreevbb248832011-12-21 16:42:51 +0200262 $old_quantity = isset($this->_cart_contents[$rowid]['qty']) ? (int) $this->_cart_contents[$rowid]['qty'] : 0;
Barry Mienydd671972010-10-04 16:33:58 +0200263
Andrey Andreevbb248832011-12-21 16:42:51 +0200264 // Re-create the entry, just to make sure our index contains only the data from this submission
265 $items['rowid'] = $rowid;
266 $items['qty'] += $old_quantity;
267 $this->_cart_contents[$rowid] = $items;
Barry Mienydd671972010-10-04 16:33:58 +0200268
Phil Sturgeon90910512011-07-20 10:07:40 -0600269 return $rowid;
Rick Ellis98783322009-02-17 02:29:44 +0000270 }
271
272 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200273
Rick Ellis98783322009-02-17 02:29:44 +0000274 /**
275 * Update the cart
276 *
Barry Mienydd671972010-10-04 16:33:58 +0200277 * This function permits the quantity of a given item to be changed.
Rick Ellis98783322009-02-17 02:29:44 +0000278 * Typically it is called from the "view cart" page if a user makes
279 * changes to the quantity before checkout. That array must contain the
280 * product ID and quantity for each item.
281 *
Rick Ellis98783322009-02-17 02:29:44 +0000282 * @param array
Rick Ellis98783322009-02-17 02:29:44 +0000283 * @return bool
284 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200285 public function update($items = array())
Rick Ellis98783322009-02-17 02:29:44 +0000286 {
287 // Was any cart data passed?
Andrey Andreevbb248832011-12-21 16:42:51 +0200288 if ( ! is_array($items) OR count($items) === 0)
Rick Ellis98783322009-02-17 02:29:44 +0000289 {
290 return FALSE;
291 }
Barry Mienydd671972010-10-04 16:33:58 +0200292
293 // You can either update a single product using a one-dimensional array,
Derek Jones37f4b9c2011-07-01 17:56:50 -0500294 // or multiple products using a multi-dimensional one. The way we
Rick Ellis98783322009-02-17 02:29:44 +0000295 // determine the array type is by looking for a required array key named "id".
296 // If it's not found we assume it's a multi-dimensional array
297 $save_cart = FALSE;
Andrey Andreevbb248832011-12-21 16:42:51 +0200298 if (isset($items['rowid'], $items['qty']))
Rick Ellis98783322009-02-17 02:29:44 +0000299 {
Andrey Andreevbb248832011-12-21 16:42:51 +0200300 if ($this->_update($items) === TRUE)
Rick Ellis98783322009-02-17 02:29:44 +0000301 {
302 $save_cart = TRUE;
303 }
304 }
305 else
306 {
307 foreach ($items as $val)
308 {
Andrey Andreevbb248832011-12-21 16:42:51 +0200309 if (is_array($val) && isset($val['rowid'], $val['qty']))
Rick Ellis98783322009-02-17 02:29:44 +0000310 {
Andrey Andreevbb248832011-12-21 16:42:51 +0200311 if ($this->_update($val) === TRUE)
Rick Ellis98783322009-02-17 02:29:44 +0000312 {
313 $save_cart = TRUE;
314 }
Barry Mienydd671972010-10-04 16:33:58 +0200315 }
Rick Ellis98783322009-02-17 02:29:44 +0000316 }
317 }
318
319 // Save the cart data if the insert was successful
Andrey Andreevbb248832011-12-21 16:42:51 +0200320 if ($save_cart === TRUE)
Rick Ellis98783322009-02-17 02:29:44 +0000321 {
322 $this->_save_cart();
323 return TRUE;
324 }
325
326 return FALSE;
327 }
328
329 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200330
Rick Ellis98783322009-02-17 02:29:44 +0000331 /**
332 * Update the cart
333 *
Barry Mienydd671972010-10-04 16:33:58 +0200334 * This function permits the quantity of a given item to be changed.
Rick Ellis98783322009-02-17 02:29:44 +0000335 * Typically it is called from the "view cart" page if a user makes
336 * changes to the quantity before checkout. That array must contain the
337 * product ID and quantity for each item.
338 *
Rick Ellis98783322009-02-17 02:29:44 +0000339 * @param array
340 * @return bool
Barry Mienydd671972010-10-04 16:33:58 +0200341 */
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300342 protected function _update($items = array())
Rick Ellis98783322009-02-17 02:29:44 +0000343 {
344 // Without these array indexes there is nothing we can do
Andrey Andreev56454792012-05-17 14:32:19 +0300345 if ( ! isset($items['qty'], $items['rowid'], $this->_cart_contents[$items['rowid']]))
Rick Ellis98783322009-02-17 02:29:44 +0000346 {
347 return FALSE;
348 }
Barry Mienydd671972010-10-04 16:33:58 +0200349
Rick Ellis98783322009-02-17 02:29:44 +0000350 // Prep the quantity
Andrey Andreev17779d62011-12-22 13:21:08 +0200351 $items['qty'] = (float) $items['qty'];
Rick Ellis98783322009-02-17 02:29:44 +0000352
353 // Is the quantity a number?
354 if ( ! is_numeric($items['qty']))
355 {
356 return FALSE;
357 }
Barry Mienydd671972010-10-04 16:33:58 +0200358
Derek Jones37f4b9c2011-07-01 17:56:50 -0500359 // Is the quantity zero? If so we will remove the item from the cart.
Rick Ellis98783322009-02-17 02:29:44 +0000360 // If the quantity is greater than zero we are updating
Andrey Andreev5036c9c2012-06-04 15:34:56 +0300361 if ($items['qty'] == 0)
Rick Ellis98783322009-02-17 02:29:44 +0000362 {
Barry Mienydd671972010-10-04 16:33:58 +0200363 unset($this->_cart_contents[$items['rowid']]);
Rick Ellis98783322009-02-17 02:29:44 +0000364 }
365 else
366 {
367 $this->_cart_contents[$items['rowid']]['qty'] = $items['qty'];
368 }
Barry Mienydd671972010-10-04 16:33:58 +0200369
Rick Ellis98783322009-02-17 02:29:44 +0000370 return TRUE;
371 }
372
373 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200374
Rick Ellis98783322009-02-17 02:29:44 +0000375 /**
376 * Save the cart array to the session DB
377 *
Rick Ellis98783322009-02-17 02:29:44 +0000378 * @return bool
379 */
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300380 protected function _save_cart()
Rick Ellis98783322009-02-17 02:29:44 +0000381 {
Rick Ellisaf4fb222009-02-24 22:44:22 +0000382 // Lets add up the individual prices and set the cart sub-total
Andrey Andreevbb248832011-12-21 16:42:51 +0200383 $this->_cart_contents['total_items'] = $this->_cart_contents['cart_total'] = 0;
Rick Ellis98783322009-02-17 02:29:44 +0000384 foreach ($this->_cart_contents as $key => $val)
385 {
386 // We make sure the array contains the proper indexes
Andrey Andreev56454792012-05-17 14:32:19 +0300387 if ( ! is_array($val) OR ! isset($val['price'], $val['qty']))
Rick Ellis98783322009-02-17 02:29:44 +0000388 {
389 continue;
390 }
391
Andrey Andreevbb248832011-12-21 16:42:51 +0200392 $this->_cart_contents['cart_total'] += ($val['price'] * $val['qty']);
393 $this->_cart_contents['total_items'] += $val['qty'];
Rick Ellisdf39d512009-02-24 22:29:37 +0000394 $this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']);
Rick Ellis98783322009-02-17 02:29:44 +0000395 }
396
Andrey Andreev56454792012-05-17 14:32:19 +0300397 // Is our cart empty? If so we delete it from the session
Rick Ellis98783322009-02-17 02:29:44 +0000398 if (count($this->_cart_contents) <= 2)
399 {
400 $this->CI->session->unset_userdata('cart_contents');
Barry Mienydd671972010-10-04 16:33:58 +0200401
Rick Ellis98783322009-02-17 02:29:44 +0000402 // Nothing more to do... coffee time!
403 return FALSE;
404 }
405
406 // If we made it this far it means that our cart has data.
407 // Let's pass it to the Session class so it can be stored
408 $this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents));
409
Andrey Andreev17779d62011-12-22 13:21:08 +0200410 // Woot!
Barry Mienydd671972010-10-04 16:33:58 +0200411 return TRUE;
Rick Ellis98783322009-02-17 02:29:44 +0000412 }
413
414 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200415
Rick Ellis98783322009-02-17 02:29:44 +0000416 /**
417 * Cart Total
418 *
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300419 * @return int
Rick Ellis98783322009-02-17 02:29:44 +0000420 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200421 public function total()
Rick Ellis98783322009-02-17 02:29:44 +0000422 {
Rick Ellisdf39d512009-02-24 22:29:37 +0000423 return $this->_cart_contents['cart_total'];
Rick Ellis98783322009-02-17 02:29:44 +0000424 }
Andrey Andreevbb248832011-12-21 16:42:51 +0200425
Andrew Seymourf75ec112011-12-14 09:36:39 +0000426 // --------------------------------------------------------------------
Andrey Andreevbb248832011-12-21 16:42:51 +0200427
Andrew Seymourf75ec112011-12-14 09:36:39 +0000428 /**
429 * Remove Item
430 *
431 * Removes an item from the cart
432 *
Timothy Warren86611db2012-04-27 10:06:25 -0400433 * @param int
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300434 * @return bool
Andrew Seymourf75ec112011-12-14 09:36:39 +0000435 */
436 public function remove($rowid)
437 {
Andrey Andreevbb248832011-12-21 16:42:51 +0200438 // unset & save
Andrew Seymourf75ec112011-12-14 09:36:39 +0000439 unset($this->_cart_contents[$rowid]);
Andrew Seymourf75ec112011-12-14 09:36:39 +0000440 $this->_save_cart();
Andrey Andreevbb248832011-12-21 16:42:51 +0200441 return TRUE;
Andrew Seymourf75ec112011-12-14 09:36:39 +0000442 }
Andrey Andreevbb248832011-12-21 16:42:51 +0200443
Rick Ellis98783322009-02-17 02:29:44 +0000444 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200445
Rick Ellis98783322009-02-17 02:29:44 +0000446 /**
447 * Total Items
448 *
449 * Returns the total item count
450 *
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300451 * @return int
Rick Ellis98783322009-02-17 02:29:44 +0000452 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200453 public function total_items()
Rick Ellis98783322009-02-17 02:29:44 +0000454 {
455 return $this->_cart_contents['total_items'];
456 }
457
458 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200459
Rick Ellis98783322009-02-17 02:29:44 +0000460 /**
461 * Cart Contents
462 *
463 * Returns the entire cart array
464 *
Timothy Warren86611db2012-04-27 10:06:25 -0400465 * @param bool
Rick Ellis98783322009-02-17 02:29:44 +0000466 * @return array
467 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200468 public function contents($newest_first = FALSE)
Rick Ellis98783322009-02-17 02:29:44 +0000469 {
Andrew Seymourde2e96a2011-12-13 16:44:59 +0000470 // do we want the newest first?
Andrey Andreevbb248832011-12-21 16:42:51 +0200471 $cart = ($newest_first) ? array_reverse($this->_cart_contents) : $this->_cart_contents;
Barry Mienydd671972010-10-04 16:33:58 +0200472
Rick Ellis98783322009-02-17 02:29:44 +0000473 // Remove these so they don't create a problem when showing the cart table
474 unset($cart['total_items']);
475 unset($cart['cart_total']);
Barry Mienydd671972010-10-04 16:33:58 +0200476
Rick Ellis98783322009-02-17 02:29:44 +0000477 return $cart;
478 }
479
480 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200481
Rick Ellis98783322009-02-17 02:29:44 +0000482 /**
Andrey Andreevcdeee662012-10-25 17:29:52 +0300483 * Get cart item
484 *
485 * Returns the details of a specific item in the cart
486 *
487 * @param string $row_id
488 * @return array
489 */
490 public function get_item($row_id)
491 {
492 return (in_array($row_id, array('total_items', 'cart_total'), TRUE) OR ! isset($this->_cart_contents[$row_id]))
493 ? FALSE
494 : $this->_cart_contents[$row_id];
495 }
496
497 // --------------------------------------------------------------------
498
499 /**
Rick Ellis98783322009-02-17 02:29:44 +0000500 * Has options
501 *
502 * Returns TRUE if the rowid passed to this function correlates to an item
503 * that has options associated with it.
504 *
Andrey Andreevcdeee662012-10-25 17:29:52 +0300505 * @param string $row_id = ''
Andrey Andreevbb248832011-12-21 16:42:51 +0200506 * @return bool
Rick Ellis98783322009-02-17 02:29:44 +0000507 */
Andrey Andreevcdeee662012-10-25 17:29:52 +0300508 public function has_options($row_id = '')
Rick Ellis98783322009-02-17 02:29:44 +0000509 {
Andrey Andreevcdeee662012-10-25 17:29:52 +0300510 return (isset($this->_cart_contents[$row_id]['options']) && count($this->_cart_contents[$row_id]['options']) !== 0);
Rick Ellis98783322009-02-17 02:29:44 +0000511 }
512
513 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200514
Rick Ellis98783322009-02-17 02:29:44 +0000515 /**
516 * Product options
517 *
518 * Returns the an array of options, for a particular product row ID
519 *
Andrey Andreevcdeee662012-10-25 17:29:52 +0300520 * @param string $row_id = ''
Rick Ellis98783322009-02-17 02:29:44 +0000521 * @return array
522 */
Andrey Andreevcdeee662012-10-25 17:29:52 +0300523 public function product_options($row_id = '')
Rick Ellis98783322009-02-17 02:29:44 +0000524 {
Andrey Andreevcdeee662012-10-25 17:29:52 +0300525 return isset($this->_cart_contents[$row_id]['options']) ? $this->_cart_contents[$row_id]['options'] : array();
Rick Ellis98783322009-02-17 02:29:44 +0000526 }
Rick Ellisdf39d512009-02-24 22:29:37 +0000527
528 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200529
Rick Ellisdf39d512009-02-24 22:29:37 +0000530 /**
531 * Format Number
532 *
533 * Returns the supplied number with commas and a decimal point.
534 *
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300535 * @param float
Andrey Andreevbb248832011-12-21 16:42:51 +0200536 * @return string
Rick Ellisdf39d512009-02-24 22:29:37 +0000537 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200538 public function format_number($n = '')
Rick Ellisdf39d512009-02-24 22:29:37 +0000539 {
Alex Bilbied261b1e2012-06-02 11:12:16 +0100540 return ($n === '') ? '' : number_format( (float) $n, 2, '.', ',');
Rick Ellisdf39d512009-02-24 22:29:37 +0000541 }
Barry Mienydd671972010-10-04 16:33:58 +0200542
Rick Ellis98783322009-02-17 02:29:44 +0000543 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200544
Rick Ellis98783322009-02-17 02:29:44 +0000545 /**
546 * Destroy the cart
547 *
548 * Empties the cart and kills the session
549 *
Andrey Andreevbb248832011-12-21 16:42:51 +0200550 * @return void
Rick Ellis98783322009-02-17 02:29:44 +0000551 */
Andrey Andreevbb248832011-12-21 16:42:51 +0200552 public function destroy()
Rick Ellis98783322009-02-17 02:29:44 +0000553 {
Andrey Andreevbb248832011-12-21 16:42:51 +0200554 $this->_cart_contents = array('cart_total' => 0, 'total_items' => 0);
Rick Ellis9c86ce52009-02-17 19:54:14 +0000555 $this->CI->session->unset_userdata('cart_contents');
Rick Ellis98783322009-02-17 02:29:44 +0000556 }
557
Rick Ellis98783322009-02-17 02:29:44 +0000558}
Rick Ellis98783322009-02-17 02:29:44 +0000559
560/* End of file Cart.php */
Andrey Andreev6f042cc2012-03-26 14:58:33 +0300561/* Location: ./system/libraries/Cart.php */