]>
jfr.im git - z_archive/KronOS.git/blob - video/system/libraries/Cart.php
1 <? php
if ( ! defined ( 'BASEPATH' )) exit ( 'No direct script access allowed' );
5 * An open source application development framework for PHP 5.1.6 or newer
8 * @author ExpressionEngine Dev Team
9 * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc.
10 * @license http://codeigniter.com/user_guide/license.html
11 * @link http://codeigniter.com
16 // ------------------------------------------------------------------------
21 * @package CodeIgniter
22 * @subpackage Libraries
23 * @category Shopping Cart
24 * @author ExpressionEngine Dev Team
25 * @link http://codeigniter.com/user_guide/libraries/cart.html
29 // These are the regular expression rules that we use to validate the product ID and product name
30 var $product_id_rules = '\.a-z0-9_-' ; // alpha-numeric, dashes, underscores, or periods
31 var $product_name_rules = '\.\:\-_ a-z0-9' ; // alpha-numeric, dashes, underscores, colons or periods
33 // Private variables. Do not change!
35 var $_cart_contents = array ();
39 * Shopping Class Constructor
41 * The constructor loads the Session class, used to store the shopping cart contents.
43 public function __construct ( $params = array ())
45 // Set the super object to a local variable for use later
46 $this- > CI
=& get_instance ();
48 // Are any config settings being passed manually? If so, set them
50 if ( count ( $params ) > 0 )
52 foreach ( $params as $key => $val )
58 // Load the Sessions class
59 $this- > CI
-> load
-> library ( 'session' , $config );
61 // Grab the shopping cart array from the session table, if it exists
62 if ( $this- > CI
-> session
-> userdata ( 'cart_contents' ) !== FALSE )
64 $this- > _cart_contents
= $this- > CI
-> session
-> userdata ( 'cart_contents' );
68 // No cart exists so we'll set some base values
69 $this- > _cart_contents
[ 'cart_total' ] = 0 ;
70 $this- > _cart_contents
[ 'total_items' ] = 0 ;
73 log_message ( 'debug' , "Cart Class Initialized" );
76 // --------------------------------------------------------------------
79 * Insert items into the cart and save it to the session table
85 function insert ( $items = array ())
87 // Was any cart data passed? No? Bah...
88 if ( ! is_array ( $items ) OR count ( $items ) == 0 )
90 log_message ( 'error' , 'The insert method must be passed an array containing data.' );
94 // You can either insert a single product using a one-dimensional array,
95 // or multiple products using a multi-dimensional one. The way we
96 // determine the array type is by looking for a required array key named "id"
97 // at the top level. If it's not found, we will assume it's a multi-dimensional array.
100 if ( isset ( $items [ 'id' ]))
102 if (( $rowid = $this- > _insert ( $items )))
109 foreach ( $items as $val )
111 if ( is_array ( $val ) AND isset ( $val [ 'id' ]))
113 if ( $this- > _insert ( $val ))
121 // Save the cart data if the insert was successful
122 if ( $save_cart == TRUE )
125 return isset ( $rowid ) ? $rowid : TRUE ;
131 // --------------------------------------------------------------------
140 function _insert ( $items = array ())
142 // Was any cart data passed? No? Bah...
143 if ( ! is_array ( $items ) OR count ( $items ) == 0 )
145 log_message ( 'error' , 'The insert method must be passed an array containing data.' );
149 // --------------------------------------------------------------------
151 // Does the $items array contain an id, quantity, price, and name? These are required
152 if ( ! isset ( $items [ 'id' ]) OR ! isset ( $items [ 'qty' ]) OR ! isset ( $items [ 'price' ]) OR ! isset ( $items [ 'name' ]))
154 log_message ( 'error' , 'The cart array must contain a product ID, quantity, price, and name.' );
158 // --------------------------------------------------------------------
160 // Prep the quantity. It can only be a number. Duh...
161 $items [ 'qty' ] = trim ( preg_replace ( '/([^0-9])/i' , '' , $items [ 'qty' ]));
162 // Trim any leading zeros
163 $items [ 'qty' ] = trim ( preg_replace ( '/(^[0]+)/i' , '' , $items [ 'qty' ]));
165 // If the quantity is zero or blank there's nothing for us to do
166 if ( ! is_numeric ( $items [ 'qty' ]) OR $items [ 'qty' ] == 0 )
171 // --------------------------------------------------------------------
173 // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods
174 // Not totally sure we should impose this rule, but it seems prudent to standardize IDs.
175 // Note: These can be user-specified by setting the $this->product_id_rules variable.
176 if ( ! preg_match ( "/^[" . $this- > product_id_rules
. "]+$/i" , $items [ 'id' ]))
178 log_message ( 'error' , 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores' );
182 // --------------------------------------------------------------------
184 // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods.
185 // Note: These can be user-specified by setting the $this->product_name_rules variable.
186 if ( ! preg_match ( "/^[" . $this- > product_name_rules
. "]+$/i" , $items [ 'name' ]))
188 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' );
192 // --------------------------------------------------------------------
194 // Prep the price. Remove anything that isn't a number or decimal point.
195 $items [ 'price' ] = trim ( preg_replace ( '/([^0-9\.])/i' , '' , $items [ 'price' ]));
196 // Trim any leading zeros
197 $items [ 'price' ] = trim ( preg_replace ( '/(^[0]+)/i' , '' , $items [ 'price' ]));
199 // Is the price a valid number?
200 if ( ! is_numeric ( $items [ 'price' ]))
202 log_message ( 'error' , 'An invalid price was submitted for product ID: ' . $items [ 'id' ]);
206 // --------------------------------------------------------------------
208 // We now need to create a unique identifier for the item being inserted into the cart.
209 // Every time something is added to the cart it is stored in the master cart array.
210 // Each row in the cart array, however, must have a unique index that identifies not only
211 // a particular product, but makes it possible to store identical products with different options.
212 // For example, what if someone buys two identical t-shirts (same product ID), but in
213 // different sizes? The product ID (and other attributes, like the name) will be identical for
214 // both sizes because it's the same shirt. The only difference will be the size.
215 // Internally, we need to treat identical submissions, but with different options, as a unique product.
216 // Our solution is to convert the options array to a string and MD5 it along with the product ID.
217 // This becomes the unique "row ID"
218 if ( isset ( $items [ 'options' ]) AND count ( $items [ 'options' ]) > 0 )
220 $rowid = md5 ( $items [ 'id' ]. implode ( '' , $items [ 'options' ]));
224 // No options were submitted so we simply MD5 the product ID.
225 // Technically, we don't need to MD5 the ID in this case, but it makes
226 // sense to standardize the format of array indexes for both conditions
227 $rowid = md5 ( $items [ 'id' ]);
230 // --------------------------------------------------------------------
232 // Now that we have our unique "row ID", we'll add our cart items to the master array
234 // let's unset this first, just to make sure our index contains only the data from this submission
235 unset ( $this- > _cart_contents
[ $rowid ]);
237 // Create a new index with our new row ID
238 $this- > _cart_contents
[ $rowid ][ 'rowid' ] = $rowid ;
240 // And add the new items to the cart array
241 foreach ( $items as $key => $val )
243 $this- > _cart_contents
[ $rowid ][ $key ] = $val ;
250 // --------------------------------------------------------------------
255 * This function permits the quantity of a given item to be changed.
256 * Typically it is called from the "view cart" page if a user makes
257 * changes to the quantity before checkout. That array must contain the
258 * product ID and quantity for each item.
265 function update ( $items = array ())
267 // Was any cart data passed?
268 if ( ! is_array ( $items ) OR count ( $items ) == 0 )
273 // You can either update a single product using a one-dimensional array,
274 // or multiple products using a multi-dimensional one. The way we
275 // determine the array type is by looking for a required array key named "id".
276 // If it's not found we assume it's a multi-dimensional array
278 if ( isset ( $items [ 'rowid' ]) AND isset ( $items [ 'qty' ]))
280 if ( $this- > _update ( $items ) == TRUE )
287 foreach ( $items as $val )
289 if ( is_array ( $val ) AND isset ( $val [ 'rowid' ]) AND isset ( $val [ 'qty' ]))
291 if ( $this- > _update ( $val ) == TRUE )
299 // Save the cart data if the insert was successful
300 if ( $save_cart == TRUE )
309 // --------------------------------------------------------------------
314 * This function permits the quantity of a given item to be changed.
315 * Typically it is called from the "view cart" page if a user makes
316 * changes to the quantity before checkout. That array must contain the
317 * product ID and quantity for each item.
323 function _update ( $items = array ())
325 // Without these array indexes there is nothing we can do
326 if ( ! isset ( $items [ 'qty' ]) OR ! isset ( $items [ 'rowid' ]) OR ! isset ( $this- > _cart_contents
[ $items [ 'rowid' ]]))
332 $items [ 'qty' ] = preg_replace ( '/([^0-9])/i' , '' , $items [ 'qty' ]);
334 // Is the quantity a number?
335 if ( ! is_numeric ( $items [ 'qty' ]))
340 // Is the new quantity different than what is already saved in the cart?
341 // If it's the same there's nothing to do
342 if ( $this- > _cart_contents
[ $items [ 'rowid' ]][ 'qty' ] == $items [ 'qty' ])
347 // Is the quantity zero? If so we will remove the item from the cart.
348 // If the quantity is greater than zero we are updating
349 if ( $items [ 'qty' ] == 0 )
351 unset ( $this- > _cart_contents
[ $items [ 'rowid' ]]);
355 $this- > _cart_contents
[ $items [ 'rowid' ]][ 'qty' ] = $items [ 'qty' ];
361 // --------------------------------------------------------------------
364 * Save the cart array to the session DB
369 function _save_cart ()
371 // Unset these so our total can be calculated correctly below
372 unset ( $this- > _cart_contents
[ 'total_items' ]);
373 unset ( $this- > _cart_contents
[ 'cart_total' ]);
375 // Lets add up the individual prices and set the cart sub-total
378 foreach ( $this- > _cart_contents
as $key => $val )
380 // We make sure the array contains the proper indexes
381 if ( ! is_array ( $val ) OR ! isset ( $val [ 'price' ]) OR ! isset ( $val [ 'qty' ]))
386 $total +
= ( $val [ 'price' ] * $val [ 'qty' ]);
387 $items +
= $val [ 'qty' ];
390 $this- > _cart_contents
[ $key ][ 'subtotal' ] = ( $this- > _cart_contents
[ $key ][ 'price' ] * $this- > _cart_contents
[ $key ][ 'qty' ]);
393 // Set the cart total and total items.
394 $this- > _cart_contents
[ 'total_items' ] = $items ;
395 $this- > _cart_contents
[ 'cart_total' ] = $total ;
397 // Is our cart empty? If so we delete it from the session
398 if ( count ( $this- > _cart_contents
) <= 2 )
400 $this- > CI
-> session
-> unset_userdata ( 'cart_contents' );
402 // Nothing more to do... coffee time!
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
));
414 // --------------------------------------------------------------------
424 return $this- > _cart_contents
[ 'cart_total' ];
427 // --------------------------------------------------------------------
432 * Returns the total item count
437 function total_items ()
439 return $this- > _cart_contents
[ 'total_items' ];
442 // --------------------------------------------------------------------
447 * Returns the entire cart array
454 $cart = $this- > _cart_contents
;
456 // Remove these so they don't create a problem when showing the cart table
457 unset ( $cart [ 'total_items' ]);
458 unset ( $cart [ 'cart_total' ]);
463 // --------------------------------------------------------------------
468 * Returns TRUE if the rowid passed to this function correlates to an item
469 * that has options associated with it.
474 function has_options ( $rowid = '' )
476 if ( ! isset ( $this- > _cart_contents
[ $rowid ][ 'options' ]) OR count ( $this- > _cart_contents
[ $rowid ][ 'options' ]) === 0 )
484 // --------------------------------------------------------------------
489 * Returns the an array of options, for a particular product row ID
494 function product_options ( $rowid = '' )
496 if ( ! isset ( $this- > _cart_contents
[ $rowid ][ 'options' ]))
501 return $this- > _cart_contents
[ $rowid ][ 'options' ];
504 // --------------------------------------------------------------------
509 * Returns the supplied number with commas and a decimal point.
514 function format_number ( $n = '' )
521 // Remove anything that isn't a number or decimal point.
522 $n = trim ( preg_replace ( '/([^0-9\.])/i' , '' , $n ));
524 return number_format ( $n , 2 , '.' , ',' );
527 // --------------------------------------------------------------------
532 * Empties the cart and kills the session
539 unset ( $this- > _cart_contents
);
541 $this- > _cart_contents
[ 'cart_total' ] = 0 ;
542 $this- > _cart_contents
[ 'total_items' ] = 0 ;
544 $this- > CI
-> session
-> unset_userdata ( 'cart_contents' );
551 /* End of file Cart.php */
552 /* Location: ./system/libraries/Cart.php */