398 lines
11 KiB
ReStructuredText
398 lines
11 KiB
ReStructuredText
###################
|
||
Shopping Cart Class
|
||
###################
|
||
|
||
The Cart Class permits items to be added to a session that stays active
|
||
while a user is browsing your site. These items can be retrieved and
|
||
displayed in a standard "shopping cart" format, allowing the user to
|
||
update the quantity or remove items from the cart.
|
||
|
||
.. important:: The Cart library is DEPRECATED and should not be used.
|
||
It is currently only kept for backwards compatibility.
|
||
|
||
Please note that the Cart Class ONLY provides the core "cart"
|
||
functionality. It does not provide shipping, credit card authorization,
|
||
or other processing components.
|
||
|
||
.. contents::
|
||
:local:
|
||
|
||
.. raw:: html
|
||
|
||
<div class="custom-index container"></div>
|
||
|
||
********************
|
||
Using the Cart Class
|
||
********************
|
||
|
||
Initializing the Shopping Cart Class
|
||
====================================
|
||
|
||
.. important:: The Cart class utilizes CodeIgniter's :doc:`Session
|
||
Class <sessions>` to save the cart information to a database, so
|
||
before using the Cart class you must set up a database table as
|
||
indicated in the :doc:`Session Documentation <sessions>`, and set the
|
||
session preferences in your application/config/config.php file to
|
||
utilize a database.
|
||
|
||
To initialize the Shopping Cart Class in your controller constructor,
|
||
use the ``$this->load->library()`` method::
|
||
|
||
$this->load->library('cart');
|
||
|
||
Once loaded, the Cart object will be available using::
|
||
|
||
$this->cart
|
||
|
||
.. note:: The Cart Class will load and initialize the Session Class
|
||
automatically, so unless you are using sessions elsewhere in your
|
||
application, you do not need to load the Session class.
|
||
|
||
Adding an Item to The Cart
|
||
==========================
|
||
|
||
To add an item to the shopping cart, simply pass an array with the
|
||
product information to the ``$this->cart->insert()`` method, as shown
|
||
below::
|
||
|
||
$data = array(
|
||
'id' => 'sku_123ABC',
|
||
'qty' => 1,
|
||
'price' => 39.95,
|
||
'name' => 'T-Shirt',
|
||
'options' => array('Size' => 'L', 'Color' => 'Red')
|
||
);
|
||
|
||
$this->cart->insert($data);
|
||
|
||
.. 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. The fifth index (options) is optional. It is intended
|
||
to be used in cases where your product has options associated with it.
|
||
Use an array for options, as shown above.
|
||
|
||
The five reserved indexes are:
|
||
|
||
- **id** - Each product in your store must have a unique identifier.
|
||
Typically this will be an "sku" or other such identifier.
|
||
- **qty** - The quantity being purchased.
|
||
- **price** - The price of the item.
|
||
- **name** - The name of the item.
|
||
- **options** - Any additional attributes that are needed to identify
|
||
the product. These must be passed via an array.
|
||
|
||
In addition to the five indexes above, there are two reserved words:
|
||
rowid and subtotal. These are used internally by the Cart class, so
|
||
please do NOT use those words as index names when inserting data into
|
||
the cart.
|
||
|
||
Your array may contain additional data. Anything you include in your
|
||
array will be stored in the session. However, it is best to standardize
|
||
your data among all your products in order to make displaying the
|
||
information in a table easier.
|
||
|
||
::
|
||
|
||
$data = array(
|
||
'id' => 'sku_123ABC',
|
||
'qty' => 1,
|
||
'price' => 39.95,
|
||
'name' => 'T-Shirt',
|
||
'coupon' => 'XMAS-50OFF'
|
||
);
|
||
|
||
$this->cart->insert($data);
|
||
|
||
The ``insert()`` method will return the $rowid if you successfully insert a
|
||
single item.
|
||
|
||
Adding Multiple Items to The Cart
|
||
=================================
|
||
|
||
By using a multi-dimensional array, as shown below, it is possible to
|
||
add multiple products to the cart in one action. This is useful in cases
|
||
where you wish to allow people to select from among several items on the
|
||
same page.
|
||
|
||
::
|
||
|
||
$data = array(
|
||
array(
|
||
'id' => 'sku_123ABC',
|
||
'qty' => 1,
|
||
'price' => 39.95,
|
||
'name' => 'T-Shirt',
|
||
'options' => array('Size' => 'L', 'Color' => 'Red')
|
||
),
|
||
array(
|
||
'id' => 'sku_567ZYX',
|
||
'qty' => 1,
|
||
'price' => 9.95,
|
||
'name' => 'Coffee Mug'
|
||
),
|
||
array(
|
||
'id' => 'sku_965QRS',
|
||
'qty' => 1,
|
||
'price' => 29.95,
|
||
'name' => 'Shot Glass'
|
||
)
|
||
);
|
||
|
||
$this->cart->insert($data);
|
||
|
||
Displaying the Cart
|
||
===================
|
||
|
||
To display the cart you will create a :doc:`view
|
||
file </general/views>` with code similar to the one shown below.
|
||
|
||
Please note that this example uses the :doc:`form
|
||
helper </helpers/form_helper>`.
|
||
|
||
::
|
||
|
||
<?php echo form_open('path/to/controller/update/method'); ?>
|
||
|
||
<table cellpadding="6" cellspacing="1" style="width:100%" border="0">
|
||
|
||
<tr>
|
||
<th>QTY</th>
|
||
<th>Item Description</th>
|
||
<th style="text-align:right">Item Price</th>
|
||
<th style="text-align:right">Sub-Total</th>
|
||
</tr>
|
||
|
||
<?php $i = 1; ?>
|
||
|
||
<?php foreach ($this->cart->contents() as $items): ?>
|
||
|
||
<?php echo form_hidden($i.'[rowid]', $items['rowid']); ?>
|
||
|
||
<tr>
|
||
<td><?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?></td>
|
||
<td>
|
||
<?php echo $items['name']; ?>
|
||
|
||
<?php if ($this->cart->has_options($items['rowid']) == TRUE): ?>
|
||
|
||
<p>
|
||
<?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?>
|
||
|
||
<strong><?php echo $option_name; ?>:</strong> <?php echo $option_value; ?><br />
|
||
|
||
<?php endforeach; ?>
|
||
</p>
|
||
|
||
<?php endif; ?>
|
||
|
||
</td>
|
||
<td style="text-align:right"><?php echo $this->cart->format_number($items['price']); ?></td>
|
||
<td style="text-align:right">$<?php echo $this->cart->format_number($items['subtotal']); ?></td>
|
||
</tr>
|
||
|
||
<?php $i++; ?>
|
||
|
||
<?php endforeach; ?>
|
||
|
||
<tr>
|
||
<td colspan="2"> </td>
|
||
<td class="right"><strong>Total</strong></td>
|
||
<td class="right">$<?php echo $this->cart->format_number($this->cart->total()); ?></td>
|
||
</tr>
|
||
|
||
</table>
|
||
|
||
<p><?php echo form_submit('', 'Update your Cart'); ?></p>
|
||
|
||
Updating The Cart
|
||
=================
|
||
|
||
To update the information in your cart, you must pass an array
|
||
containing the Row ID and one or more pre-defined properties to the
|
||
``$this->cart->update()`` method.
|
||
|
||
.. note:: If the quantity is set to zero, the item will be removed from
|
||
the cart.
|
||
|
||
::
|
||
|
||
$data = array(
|
||
'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
|
||
'qty' => 3
|
||
);
|
||
|
||
$this->cart->update($data);
|
||
|
||
// Or a multi-dimensional array
|
||
|
||
$data = array(
|
||
array(
|
||
'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
|
||
'qty' => 3
|
||
),
|
||
array(
|
||
'rowid' => 'xw82g9q3r495893iajdh473990rikw23',
|
||
'qty' => 4
|
||
),
|
||
array(
|
||
'rowid' => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
|
||
'qty' => 2
|
||
)
|
||
);
|
||
|
||
$this->cart->update($data);
|
||
|
||
You may also update any property you have previously defined when
|
||
inserting the item such as options, price or other custom fields.
|
||
|
||
::
|
||
|
||
$data = array(
|
||
'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
|
||
'qty' => 1,
|
||
'price' => 49.95,
|
||
'coupon' => NULL
|
||
);
|
||
|
||
$this->cart->update($data);
|
||
|
||
What is a Row ID?
|
||
*****************
|
||
|
||
The row ID is a unique identifier that is generated by the cart code
|
||
when an item is added to the cart. The reason a unique ID is created
|
||
is so that identical products with different options can be managed
|
||
by the cart.
|
||
|
||
For example, let's say someone buys two identical t-shirts (same product
|
||
ID), but in different sizes. The product ID (and other attributes) will
|
||
be identical for both sizes because it's the same shirt. The only
|
||
difference will be the size. The cart must therefore have a means of
|
||
identifying this difference so that the two sizes of shirts can be
|
||
managed independently. It does so by creating a unique "row ID" based on
|
||
the product ID and any options associated with it.
|
||
|
||
In nearly all cases, updating the cart will be something the user does
|
||
via the "view cart" page, so as a developer, it is unlikely that you
|
||
will ever have to concern yourself with the "row ID", other than making
|
||
sure your "view cart" page contains this information in a hidden form
|
||
field, and making sure it gets passed to the ``update()`` method when
|
||
the update form is submitted. Please examine the construction of the
|
||
"view cart" page above for more information.
|
||
|
||
|
||
***************
|
||
Class Reference
|
||
***************
|
||
|
||
.. php:class:: CI_Cart
|
||
|
||
.. attribute:: $product_id_rules = '\.a-z0-9_-'
|
||
|
||
These are the regular expression rules that we use to validate the product
|
||
ID - alpha-numeric, dashes, underscores, or periods by default
|
||
|
||
.. attribute:: $product_name_rules = '\w \-\.\:'
|
||
|
||
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
|
||
default
|
||
|
||
.. attribute:: $product_name_safe = TRUE
|
||
|
||
Whether or not to only allow safe product names. Default TRUE.
|
||
|
||
|
||
.. php:method:: insert([$items = array()])
|
||
|
||
:param array $items: Items to insert into the cart
|
||
:returns: TRUE on success, FALSE on failure
|
||
:rtype: bool
|
||
|
||
Insert items into the cart and save it to the session table. Returns TRUE
|
||
on success and FALSE on failure.
|
||
|
||
|
||
.. php:method:: update([$items = array()])
|
||
|
||
:param array $items: Items to update in the cart
|
||
:returns: TRUE on success, FALSE on failure
|
||
:rtype: bool
|
||
|
||
This method permits changing the properties of a given item.
|
||
Typically it is called from the "view cart" page if a user makes changes
|
||
to the quantity before checkout. That array must contain the rowid
|
||
for each item.
|
||
|
||
.. php:method:: remove($rowid)
|
||
|
||
:param int $rowid: ID of the item to remove from the cart
|
||
:returns: TRUE on success, FALSE on failure
|
||
:rtype: bool
|
||
|
||
Allows you to remove an item from the shopping cart by passing it the
|
||
``$rowid``.
|
||
|
||
.. php:method:: total()
|
||
|
||
:returns: Total amount
|
||
:rtype: int
|
||
|
||
Displays the total amount in the cart.
|
||
|
||
|
||
.. php:method:: total_items()
|
||
|
||
:returns: Total amount of items in the cart
|
||
:rtype: int
|
||
|
||
Displays the total number of items in the cart.
|
||
|
||
|
||
.. php:method:: contents([$newest_first = FALSE])
|
||
|
||
:param bool $newest_first: Whether to order the array with newest items first
|
||
:returns: An array of cart contents
|
||
:rtype: array
|
||
|
||
Returns an array containing everything in the cart. You can sort the
|
||
order by which the array is returned by passing it TRUE where the contents
|
||
will be sorted from newest to oldest, otherwise it is sorted from oldest
|
||
to newest.
|
||
|
||
.. php:method:: get_item($row_id)
|
||
|
||
:param int $row_id: Row ID to retrieve
|
||
:returns: Array of item data
|
||
:rtype: array
|
||
|
||
Returns an array containing data for the item matching the specified row
|
||
ID, or FALSE if no such item exists.
|
||
|
||
.. php:method:: has_options($row_id = '')
|
||
|
||
:param int $row_id: Row ID to inspect
|
||
:returns: TRUE if options exist, FALSE otherwise
|
||
:rtype: bool
|
||
|
||
Returns TRUE (boolean) if a particular row in the cart contains options.
|
||
This method is designed to be used in a loop with ``contents()``, since
|
||
you must pass the rowid to this method, as shown in the Displaying
|
||
the Cart example above.
|
||
|
||
.. php:method:: product_options([$row_id = ''])
|
||
|
||
:param int $row_id: Row ID
|
||
:returns: Array of product options
|
||
:rtype: array
|
||
|
||
Returns an array of options for a particular product. This method is
|
||
designed to be used in a loop with ``contents()``, since you
|
||
must pass the rowid to this method, as shown in the Displaying the
|
||
Cart example above.
|
||
|
||
.. php:method:: destroy()
|
||
|
||
:rtype: void
|
||
|
||
Permits you to destroy the cart. This method will likely be called
|
||
when you are finished processing the customer's order. |