Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 1 | ################### |
| 2 | Shopping Cart Class |
| 3 | ################### |
| 4 | |
| 5 | The Cart Class permits items to be added to a session that stays active |
| 6 | while a user is browsing your site. These items can be retrieved and |
| 7 | displayed in a standard "shopping cart" format, allowing the user to |
| 8 | update the quantity or remove items from the cart. |
| 9 | |
| 10 | Please note that the Cart Class ONLY provides the core "cart" |
| 11 | functionality. It does not provide shipping, credit card authorization, |
| 12 | or other processing components. |
| 13 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 14 | .. contents:: |
| 15 | :local: |
| 16 | |
| 17 | .. raw:: html |
| 18 | |
| 19 | <div class="custom-index container"></div> |
| 20 | |
| 21 | ******************** |
| 22 | Using the Cart Class |
| 23 | ******************** |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 24 | |
| 25 | Initializing the Shopping Cart Class |
| 26 | ==================================== |
| 27 | |
| 28 | .. important:: The Cart class utilizes CodeIgniter's :doc:`Session |
| 29 | Class <sessions>` to save the cart information to a database, so |
| 30 | before using the Cart class you must set up a database table as |
| 31 | indicated in the :doc:`Session Documentation <sessions>`, and set the |
| 32 | session preferences in your application/config/config.php file to |
| 33 | utilize a database. |
| 34 | |
| 35 | To initialize the Shopping Cart Class in your controller constructor, |
| 36 | use the $this->load->library function:: |
| 37 | |
| 38 | $this->load->library('cart'); |
| 39 | |
| 40 | Once loaded, the Cart object will be available using:: |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 41 | |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 42 | $this->cart |
| 43 | |
| 44 | .. note:: The Cart Class will load and initialize the Session Class |
| 45 | automatically, so unless you are using sessions elsewhere in your |
| 46 | application, you do not need to load the Session class. |
| 47 | |
| 48 | Adding an Item to The Cart |
| 49 | ========================== |
| 50 | |
| 51 | To add an item to the shopping cart, simply pass an array with the |
| 52 | product information to the $this->cart->insert() function, as shown |
| 53 | below:: |
| 54 | |
| 55 | $data = array( |
Derek Jones | 97f283d | 2011-10-05 16:17:25 -0500 | [diff] [blame] | 56 | 'id' => 'sku_123ABC', |
| 57 | 'qty' => 1, |
| 58 | 'price' => 39.95, |
| 59 | 'name' => 'T-Shirt', |
| 60 | 'options' => array('Size' => 'L', 'Color' => 'Red') |
| 61 | ); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 62 | |
| 63 | $this->cart->insert($data); |
| 64 | |
| 65 | .. important:: The first four array indexes above (id, qty, price, and |
| 66 | name) are **required**. If you omit any of them the data will not be |
| 67 | saved to the cart. The fifth index (options) is optional. It is intended |
| 68 | to be used in cases where your product has options associated with it. |
| 69 | Use an array for options, as shown above. |
| 70 | |
| 71 | The five reserved indexes are: |
| 72 | |
| 73 | - **id** - Each product in your store must have a unique identifier. |
| 74 | Typically this will be an "sku" or other such identifier. |
| 75 | - **qty** - The quantity being purchased. |
| 76 | - **price** - The price of the item. |
| 77 | - **name** - The name of the item. |
| 78 | - **options** - Any additional attributes that are needed to identify |
| 79 | the product. These must be passed via an array. |
| 80 | |
| 81 | In addition to the five indexes above, there are two reserved words: |
| 82 | rowid and subtotal. These are used internally by the Cart class, so |
| 83 | please do NOT use those words as index names when inserting data into |
| 84 | the cart. |
| 85 | |
| 86 | Your array may contain additional data. Anything you include in your |
| 87 | array will be stored in the session. However, it is best to standardize |
| 88 | your data among all your products in order to make displaying the |
| 89 | information in a table easier. |
| 90 | |
| 91 | The insert() method will return the $rowid if you successfully insert a |
| 92 | single item. |
| 93 | |
| 94 | Adding Multiple Items to The Cart |
| 95 | ================================= |
| 96 | |
| 97 | By using a multi-dimensional array, as shown below, it is possible to |
| 98 | add multiple products to the cart in one action. This is useful in cases |
| 99 | where you wish to allow people to select from among several items on the |
| 100 | same page. |
| 101 | |
| 102 | :: |
| 103 | |
| 104 | $data = array( |
Derek Jones | 97f283d | 2011-10-05 16:17:25 -0500 | [diff] [blame] | 105 | array( |
| 106 | 'id' => 'sku_123ABC', |
| 107 | 'qty' => 1, |
| 108 | 'price' => 39.95, |
| 109 | 'name' => 'T-Shirt', |
| 110 | 'options' => array('Size' => 'L', 'Color' => 'Red') |
| 111 | ), |
| 112 | array( |
| 113 | 'id' => 'sku_567ZYX', |
| 114 | 'qty' => 1, |
| 115 | 'price' => 9.95, |
| 116 | 'name' => 'Coffee Mug' |
| 117 | ), |
| 118 | array( |
| 119 | 'id' => 'sku_965QRS', |
| 120 | 'qty' => 1, |
| 121 | 'price' => 29.95, |
| 122 | 'name' => 'Shot Glass' |
| 123 | ) |
| 124 | ); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 125 | |
| 126 | $this->cart->insert($data); |
| 127 | |
| 128 | Displaying the Cart |
| 129 | =================== |
| 130 | |
| 131 | To display the cart you will create a :doc:`view |
| 132 | file </general/views>` with code similar to the one shown below. |
| 133 | |
| 134 | Please note that this example uses the :doc:`form |
| 135 | helper </helpers/form_helper>`. |
| 136 | |
| 137 | :: |
| 138 | |
| 139 | <?php echo form_open('path/to/controller/update/function'); ?> |
| 140 | |
| 141 | <table cellpadding="6" cellspacing="1" style="width:100%" border="0"> |
| 142 | |
| 143 | <tr> |
| 144 | <th>QTY</th> |
| 145 | <th>Item Description</th> |
| 146 | <th style="text-align:right">Item Price</th> |
| 147 | <th style="text-align:right">Sub-Total</th> |
| 148 | </tr> |
| 149 | |
| 150 | <?php $i = 1; ?> |
| 151 | |
| 152 | <?php foreach ($this->cart->contents() as $items): ?> |
| 153 | |
| 154 | <?php echo form_hidden($i.'[rowid]', $items['rowid']); ?> |
| 155 | |
| 156 | <tr> |
| 157 | <td><?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?></td> |
| 158 | <td> |
| 159 | <?php echo $items['name']; ?> |
| 160 | |
| 161 | <?php if ($this->cart->has_options($items['rowid']) == TRUE): ?> |
| 162 | |
| 163 | <p> |
| 164 | <?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?> |
| 165 | |
| 166 | <strong><?php echo $option_name; ?>:</strong> <?php echo $option_value; ?><br /> |
| 167 | |
| 168 | <?php endforeach; ?> |
| 169 | </p> |
| 170 | |
| 171 | <?php endif; ?> |
| 172 | |
| 173 | </td> |
| 174 | <td style="text-align:right"><?php echo $this->cart->format_number($items['price']); ?></td> |
| 175 | <td style="text-align:right">$<?php echo $this->cart->format_number($items['subtotal']); ?></td> |
| 176 | </tr> |
| 177 | |
| 178 | <?php $i++; ?> |
| 179 | |
| 180 | <?php endforeach; ?> |
| 181 | |
| 182 | <tr> |
| 183 | <td colspan="2"> </td> |
| 184 | <td class="right"><strong>Total</strong></td> |
| 185 | <td class="right">$<?php echo $this->cart->format_number($this->cart->total()); ?></td> |
| 186 | </tr> |
| 187 | |
| 188 | </table> |
| 189 | |
| 190 | <p><?php echo form_submit('', 'Update your Cart'); ?></p> |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 191 | |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 192 | Updating The Cart |
| 193 | ================= |
| 194 | |
| 195 | To update the information in your cart, you must pass an array |
| 196 | containing the Row ID and quantity to the $this->cart->update() |
| 197 | function: |
| 198 | |
| 199 | .. note:: If the quantity is set to zero, the item will be removed from |
| 200 | the cart. |
| 201 | |
| 202 | :: |
| 203 | |
| 204 | $data = array( |
Derek Jones | 97f283d | 2011-10-05 16:17:25 -0500 | [diff] [blame] | 205 | 'rowid' => 'b99ccdf16028f015540f341130b6d8ec', |
| 206 | 'qty' => 3 |
| 207 | ); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 208 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 209 | $this->cart->update($data); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 210 | |
| 211 | // Or a multi-dimensional array |
| 212 | |
| 213 | $data = array( |
Derek Jones | 97f283d | 2011-10-05 16:17:25 -0500 | [diff] [blame] | 214 | array( |
| 215 | 'rowid' => 'b99ccdf16028f015540f341130b6d8ec', |
| 216 | 'qty' => 3 |
| 217 | ), |
| 218 | array( |
| 219 | 'rowid' => 'xw82g9q3r495893iajdh473990rikw23', |
| 220 | 'qty' => 4 |
| 221 | ), |
| 222 | array( |
| 223 | 'rowid' => 'fh4kdkkkaoe30njgoe92rkdkkobec333', |
| 224 | 'qty' => 2 |
| 225 | ) |
| 226 | ); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 227 | |
Derek Jones | 97f283d | 2011-10-05 16:17:25 -0500 | [diff] [blame] | 228 | $this->cart->update($data); |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 229 | |
| 230 | What is a Row ID? |
| 231 | ***************** |
| 232 | |
| 233 | The row ID is a unique identifier that is |
| 234 | generated by the cart code when an item is added to the cart. The reason |
| 235 | a unique ID is created is so that identical products with different |
| 236 | options can be managed by the cart. |
| 237 | |
| 238 | For example, let's say someone buys two identical t-shirts (same product |
| 239 | ID), but in different sizes. The product ID (and other attributes) will |
| 240 | be identical for both sizes because it's the same shirt. The only |
| 241 | difference will be the size. The cart must therefore have a means of |
| 242 | identifying this difference so that the two sizes of shirts can be |
| 243 | managed independently. It does so by creating a unique "row ID" based on |
| 244 | the product ID and any options associated with it. |
| 245 | |
| 246 | In nearly all cases, updating the cart will be something the user does |
| 247 | via the "view cart" page, so as a developer, it is unlikely that you |
Andrey Andreev | ba231aa | 2014-01-20 16:43:41 +0200 | [diff] [blame] | 248 | will ever have to concern yourself with the "row ID", other than making |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 249 | sure your "view cart" page contains this information in a hidden form |
| 250 | field, and making sure it gets passed to the update function when the |
| 251 | update form is submitted. Please examine the construction of the "view |
| 252 | cart" page above for more information. |
| 253 | |
| 254 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 255 | *************** |
| 256 | Class Reference |
| 257 | *************** |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 258 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 259 | .. class:: CI_Cart |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 260 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 261 | .. attribute:: $product_id_rules = '\.a-z0-9_-' |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 262 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 263 | These are the regular expression rules that we use to validate the product |
| 264 | ID - alpha-numeric, dashes, underscores, or periods by default |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 265 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 266 | .. attribute:: $product_name_rules = '\w \-\.\:' |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 267 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 268 | These are the regular expression rules that we use to validate the product ID and product name - alpha-numeric, dashes, underscores, colons or periods by |
| 269 | default |
Andrew Seymour | f75ec11 | 2011-12-14 09:36:39 +0000 | [diff] [blame] | 270 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 271 | .. attribute:: $product_name_safe = TRUE |
Andrew Seymour | f75ec11 | 2011-12-14 09:36:39 +0000 | [diff] [blame] | 272 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 273 | Whether or not to only allow safe product names. Default TRUE. |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 274 | |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 275 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 276 | .. method:: insert([$items = array()]) |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 277 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 278 | :param array $items: Items to insert into the cart |
| 279 | :returns: TRUE on success, FALSE on failure |
| 280 | :rtype: bool |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 281 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 282 | Insert items into the cart and save it to the session table. Returns TRUE |
| 283 | on success and FALSE on failure. |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 284 | |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 285 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 286 | .. method:: update([$items = array()]) |
Andrey Andreev | cdeee66 | 2012-10-25 17:29:52 +0300 | [diff] [blame] | 287 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 288 | :param array $items: Items to update in the cart |
| 289 | :returns: TRUE on success, FALSE on failure |
| 290 | :rtype: bool |
Andrey Andreev | cdeee66 | 2012-10-25 17:29:52 +0300 | [diff] [blame] | 291 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 292 | This method permits the quantity of a given item to be changed. |
| 293 | Typically it is called from the "view cart" page if a user makes changes |
| 294 | to the quantity before checkout. That array must contain the product ID |
| 295 | and quantity for each item. |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 296 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 297 | .. method:: remove($rowid) |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 298 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 299 | :param int $rowid: ID of the item to remove from the cart |
| 300 | :returns: TRUE on success, FALSE on failure |
| 301 | :rtype: bool |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 302 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 303 | Allows you to remove an item from the shopping cart by passing it the |
| 304 | ``$rowid``. |
Derek Jones | 8ede1a2 | 2011-10-05 13:34:52 -0500 | [diff] [blame] | 305 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 306 | .. method:: total() |
| 307 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 308 | :returns: Total amount |
| 309 | :rtype: int |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 310 | |
| 311 | Displays the total amount in the cart. |
| 312 | |
| 313 | |
| 314 | .. method:: total_items() |
| 315 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 316 | :returns: Total amount of items in the cart |
| 317 | :rtype: int |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 318 | |
| 319 | Displays the total number of items in the cart. |
| 320 | |
| 321 | |
| 322 | .. method:: contents([$newest_first = FALSE]) |
| 323 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 324 | :param bool $newest_first: Whether to order the array with newest items first |
| 325 | :returns: An array of cart contents |
| 326 | :rtype: array |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 327 | |
| 328 | Returns an array containing everything in the cart. You can sort the |
| 329 | order by which the array is returned by passing it TRUE where the contents |
| 330 | will be sorted from newest to oldest, otherwise it is sorted from oldest |
| 331 | to newest. |
| 332 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 333 | .. method:: get_item($row_id) |
| 334 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 335 | :param int $row_id: Row ID to retrieve |
| 336 | :returns: Array of item data |
| 337 | :rtype: array |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 338 | |
| 339 | Returns an array containing data for the item matching the specified row |
| 340 | ID, or FALSE if no such item exists. |
| 341 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 342 | .. method:: has_options($row_id = '') |
| 343 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 344 | :param int $row_id: Row ID to inspect |
| 345 | :returns: TRUE if options exist, FALSE otherwise |
| 346 | :rtype: bool |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 347 | |
| 348 | Returns TRUE (boolean) if a particular row in the cart contains options. |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 349 | This method is designed to be used in a loop with ``contents()``, since |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 350 | you must pass the rowid to this function, as shown in the Displaying |
| 351 | the Cart example above. |
| 352 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 353 | .. method:: product_options([$row_id = '']) |
| 354 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 355 | :param int $row_id: Row ID |
| 356 | :returns: Array of product options |
| 357 | :rtype: array |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 358 | |
| 359 | Returns an array of options for a particular product. This method is |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 360 | designed to be used in a loop with ``contents()``, since you |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 361 | must pass the rowid to this method, as shown in the Displaying the |
| 362 | Cart example above. |
| 363 | |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 364 | .. method:: destroy() |
| 365 | |
Andrey Andreev | 28c2c97 | 2014-02-08 04:27:48 +0200 | [diff] [blame^] | 366 | :rtype: void |
Derek Jones | 82b34e6 | 2013-07-21 23:07:20 -0700 | [diff] [blame] | 367 | |
| 368 | Permits you to destroy the cart. This method will likely be called |
| 369 | when you are finished processing the customer's order. |