購物車類別

當消費者在瀏覽你的網頁時,購物車類別讓商品可以加入購物車中。 這些項目被檢視並顯示在標準的購物車模式中,允許消費者更新數量或移除商品。

請注意,購物車僅提供購物車的函數功能。並沒有提供運送、信用卡授權或其他項目處理。

使用購物車類別

初始化購物車類別

使用 $this->load->library 函式,在控制器中初始化購物車類別:

$this->load->library('cart');

載入一次後,購物車的物件使用如下:

$this->cart

在購物車中新增一個商品

使用 $this->cart->insert 的方式,可以將商品資訊透過陣列放入,這樣就可以在購物車中新增商品。如下範例:

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'options' => array('Size' => 'L', 'Color' => 'Red')
);

$this->cart->insert($data);

五個索引的意思如下:

  • id - 每個商品都必須要有一個唯一的辨識值。通常會指一個 sku,或是其他辨識值。
  • qty - 購買數量。
  • price - 商品價格。
  • name - 商品名稱。
  • options - 商品的其他附加資訊。必須使用陣列傳入。

除了上述五個索引外,還有兩個保留字 (reserved words):rowid 和 subtotal。 這兩個適用於購物車類別的內部,因此請不要將這兩字做為索引名稱。

你的陣列會包含附加的資訊。你陣列內的任何資訊都會被儲存於 session 中。 最好的做法是在你的商品資訊中建立一套規則,如此一來將會更容易顯示你的商品資訊。

$data = array(
        'id'      => 'sku_123ABC',
        'qty'     => 1,
        'price'   => 39.95,
        'name'    => 'T-Shirt',
        'coupon'         => 'XMAS-50OFF'
);

$this->cart->insert($data);

若你成功插入單一商品,``insert()`` 方法將會回傳 $rowid,也就是這項編號。

在購物車中新增多個商品

透過使用多維陣列的方式,可以依次將多樣商品放置在購物車中。 當你想讓消費者可以在同一頁中選擇多樣商品,此方式會相當實用。請參考以下:

$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);

顯示購物車

為了顯示購物車,你會建立一個視圖檔 :doc:`view file </general/views>`,如同以下範例: 請注意,此範例使用了表單輔助函數 :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>

更新購物車

為了更新購物車內的商品資訊,你必須透過 $this->cart->update() 的方式,傳送一個包含 Row ID 以及數量的陣列。

$data = array(
        'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'   => 3
);

$this->cart->update($data);

// 或是使用多維陣列來新增多筆

$data = array(
        array(
                'rowid'   => 'b99ccdf16028f015540f341130b6d8ec',
                'qty'     => 3
        ),
        array(
                'rowid'   => 'xw82g9q3r495893iajdh473990rikw23',
                'qty'     => 4
        ),
        array(
                'rowid'   => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
                'qty'     => 2
        )
);

$this->cart->update($data);

當插入一個商品時,你也可以更新之前定義的特性,例如選項、價格或是其他自定義範圍 (custom fields)。

$data = array(
        'rowid'  => 'b99ccdf16028f015540f341130b6d8ec',
        'qty'    => 1,
        'price'  => 49.95,
        'coupon' => NULL
);

$this->cart->update($data);

什麼是 Row ID?

Row ID 當你將商品加入購物車時產生的一個唯一值。 這樣一來,同樣商品但不同選項的物品就能在購物車中被管理。

舉例來說,若有人買了兩件不同尺寸但款式一樣的 T-shirts (相同商品 ID)。 因為是同樣的商品,所以商品 ID 將會判定成相同的商品編號。 因此,購物車必須根據商品 ID 以及其他相關選項,提供每個商品唯一的 Row ID 來作區別。

一般而言,消費者會透過 “檢視購物車” 頁面,來更新購物車資訊。 因此身為開發人員,你必須確定 Row ID 有隱藏在你的 “檢視購物車” 頁面中, 並且確保當更新表單被提交時,它會通過 update() 方法來更新購物車。 更多資訊請參考以上的”檢視購物車”頁面。

類別參考

class CI_Cart
$product_id_rules = '.a-z0-9_-'

這些是我們用來驗證商品 ID 的固定表達規則--預設為字母數字、破折號、底線及句號。

$product_name_rules = 'w -.:'

這些是我們用來驗種商品 ID 及商品名稱的固定表達規則--預設為字母數字、破折號、底線、分號及句號。

$product_name_safe = TRUE

是否只允許安全商品名稱,預設為 TRUE。

insert([$items = array()])
Parameters:
  • $items (array) – 加入購物車的商品
Returns:

成功則為 TRUE,失敗則為 FALSE

Return type:

bool

在購物車中加入商品,並存入 Session 表格。成功則為 TRUE,失敗則為 FALSE。

update([$items = array()])
Parameters:
  • $items (array) – 購物車中更新的商品
Returns:

成功則為 TRUE,失敗則為 FALSE。

Return type:

bool

此方法允許更改商品的特性。 一般來說若消費者在確認前修改商品數量,會從 “檢視購物車頁面” 中叫出。 此陣列中的每個商品必須包含 rowid。

remove($rowid)
Parameters:
  • $rowid (int) – 移除購物車中的商品 rowid
Returns:

成功則為 TRUE,失敗則為 FALSE。

Return type:

bool

允許你透過傳送 $rowid 移除購物車中的商品。

total()
Returns:總金額
Return type:int

在購物車中顯示總金額。

total_items()
Returns:購物車中項目的總數量
Return type:int

在購物車中顯示總數量。

contents([$newest_first = FALSE])
Parameters:
  • $newest_first (bool) – 是否將最新商品排在前面
Returns:

購物車的陣列

Return type:

array

回傳購物車內所有東西的陣列。你可以從最新到最舊分類訂單,否則他將會從最舊到最新排序。

get_item($row_id)
Parameters:
  • $row_id (int) – 欲取得的 Row ID
Returns:

商品資訊的陣列

Return type:

array

回傳吻合特定 Row ID 的商品陣列,若顯示 FALSE 則此商品不存在。

has_options($row_id = '')
Parameters:
  • $row_id (int) – 欲檢查的 Row ID
Returns:

存在返回 TRUE,不存在為 FALSE

Return type:

bool

若是購物車內的特定資料含有選項,則顯示 TRUE(布林值) 。此方法使用於含有 ``contents()``的函數中,你必須傳送 Rowid, 可參考上述 “顯示購物車” 中的範例。

如果該項目有設定附加資訊 (options) 的選項,則返回 TRUE (布林值)。 這個方式的設計,你必須傳送 rowid 到這個方法,同時也可與 contents() 做循環 (loop) 使用, 可參考上述 “顯示購物車” 中的範例。

product_options([$row_id = ''])
Parameters:
  • $row_id (int) – Row ID
Returns:

附加資訊的陣列

Return type:

array

回傳購物車內的特定商品的附加資訊 (options) 陣列。 這個方式的設計,你必須傳送 rowid 到這個方法,同時也可與 contents() 做循環 (loop) 使用, 可參考上述 “顯示購物車” 中的範例。

destroy()
Return type:void

當消費者購物完畢時,允許你清空購物車。