購(gòu)物車類
購(gòu)物車類允許項(xiàng)目被添加到session中,session在用戶瀏覽你的網(wǎng)站期間都保持有效狀態(tài)。這些項(xiàng)目能夠以標(biāo)準(zhǔn)的 "購(gòu)物車" 格式被檢索和顯示,并允許用戶更新數(shù)量或者從購(gòu)物車中移除項(xiàng)目。
請(qǐng)注意購(gòu)物車類只提供核心的"購(gòu)物車"功能。它不提供配送、信用卡授權(quán)或者其它處理組件。
初始化購(gòu)物車類
重要:購(gòu)物車類利用 CodeIgniter 的 Session 類把購(gòu)物車信息保存到數(shù)據(jù)庫(kù)中,所以在使用購(gòu)物車類之前,你必須根據(jù) Session 類文檔中的說(shuō)明來(lái)創(chuàng)建數(shù)據(jù)庫(kù)表,并且在 application/config/config.php 文件中把 Session 相關(guān)參數(shù)設(shè)置為使用數(shù)據(jù)庫(kù)。
為了在你的控制器構(gòu)造函數(shù)中初始化購(gòu)物車類,請(qǐng)使用 $this->load->library 函數(shù):
$this->load->library('cart');
一旦加載,就可以通過(guò)調(diào)用 $this->cart 來(lái)使用購(gòu)物車對(duì)象了。
說(shuō)明: 購(gòu)物車類會(huì)自動(dòng)加載和初始化Session類,因此除非你在別處要用到session,否則你不需要再次加載Session類。
將一個(gè)項(xiàng)目添加到購(gòu)物車
要添加項(xiàng)目到購(gòu)物車,只需將一個(gè)包含了商品信息的數(shù)組傳遞給 $this->cart->insert() 函數(shù)即可,就像下面這樣:
$data = array(
???????????????'id'????? => 'sku_123ABC',
???????????????'qty'???? => 1,
???????????????'price'?? => 39.95,
???????????????'name'??? => 'T-Shirt',
???????????????'options' => array('Size' => 'L', 'Color' => 'Red')
????????????);
$this->cart->insert($data);
重要說(shuō)明: 上面的前四個(gè)數(shù)組索引 (id, qty, price 和name) 是 必需的。 如果缺少其中的任何一個(gè),數(shù)據(jù)將不會(huì)被保存到購(gòu)物車中。第5個(gè)索引 (options) 是可選的。當(dāng)你的商品包含一些相關(guān)的選項(xiàng)信息時(shí),你就可以使用它。正如上面所顯示的那樣,請(qǐng)使用一個(gè)數(shù)組來(lái)保存選項(xiàng)信息。注意:$data['price'] 的值必須大于0
五個(gè)保留的索引分別是:
- id - 你的商店里的每件商品都必須有一個(gè)唯一的標(biāo)識(shí)符(identifier)。典型的標(biāo)識(shí)符是 "sku"(譯者注:庫(kù)存量單位) 或者其它類似的標(biāo)識(shí)符。
- qty - 購(gòu)買的數(shù)量(quantity)。
- price - 商品的價(jià)格(price)。
- name - 商品的名稱(name)。
- options - 標(biāo)識(shí)商品的任何附加屬性。必須通過(guò)數(shù)組來(lái)傳遞。
除以上五個(gè)索引外,還有兩個(gè)保留字:rowid 和 subtotal。它們是購(gòu)物車類內(nèi)部使用的,因此,往購(gòu)物車中插入數(shù)據(jù)時(shí),請(qǐng)不要使用這些詞作為索引。
你的數(shù)組可能包含附加的數(shù)據(jù)。你的數(shù)組中包含的所有數(shù)據(jù)都會(huì)被存儲(chǔ)到session中。然而,最好的方式是標(biāo)準(zhǔn)化你所有商品的數(shù)據(jù),這樣更方便你在表格中顯示它們。
The insert() method will return the $rowid if you successfully insert a single item.
將多個(gè)項(xiàng)目添加到購(gòu)物車
通過(guò)下面這種多維數(shù)組的方式,可以一次性添加多個(gè)產(chǎn)品到購(gòu)物車中。當(dāng)你希望允許用戶選擇同一頁(yè)面中的多個(gè)項(xiàng)目時(shí),這就非常有用了。
$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);
顯示購(gòu)物車
為了顯示購(gòu)物車的數(shù)據(jù),你得創(chuàng)建一個(gè) 視圖文件,它的代碼類似于下面這個(gè)。
請(qǐng)注意這個(gè)范例使用了表單輔助函數(shù).
更新購(gòu)物車
為了更新購(gòu)物車中的信息,你必須將一個(gè)包含了 Row ID 和數(shù)量(quantity)的數(shù)組傳遞給 $this->cart->update() 函數(shù):
說(shuō)明: 如果數(shù)量被設(shè)置為 0 ,那么購(gòu)物車中對(duì)應(yīng)的項(xiàng)目會(huì)被移除。
$data = array(
???????????????'rowid' => 'b99ccdf16028f015540f341130b6d8ec',
???????????????'qty'?? => 3
????????????);
$this->cart->update($data);
// 或者是一個(gè)多維數(shù)組
$data = array(
???????????????array(
???????????????????????'rowid'?? => 'b99ccdf16028f015540f341130b6d8ec',
???????????????????????'qty'???? => 3
????????????????????),
???????????????array(
???????????????????????'rowid'?? => 'xw82g9q3r495893iajdh473990rikw23',
???????????????????????'qty'???? => 4
????????????????????),
???????????????array(
???????????????????????'rowid'?? => 'fh4kdkkkaoe30njgoe92rkdkkobec333',
???????????????????????'qty'???? => 2
????????????????????)
????????????);
$this->cart->update($data);
什么是 Row ID?? 當(dāng)一個(gè)項(xiàng)目被添加到購(gòu)物車時(shí),程序所生成的那個(gè)唯一的標(biāo)識(shí)符就是row ID。創(chuàng)建唯一ID的理由是,當(dāng)購(gòu)物車中相同的商品有不同的選項(xiàng)時(shí),購(gòu)物車就能夠?qū)λ鼈冞M(jìn)行管理。
比如說(shuō),有人購(gòu)買了兩件相同的T-shirt (相同的商品ID),但是尺寸不同。商品ID(以及其它屬性)都會(huì)完全一樣,因?yàn)樗鼈兪窍嗤腡-shirt。它們唯一的差別就是尺寸不同。因此購(gòu)物車必須想辦法來(lái)區(qū)分它們,這樣才能獨(dú)立地管理這兩件尺寸不同的T-shirt。而基于商品ID和其它相關(guān)選項(xiàng)信息來(lái)創(chuàng)建一個(gè)唯一的 "row ID" 就能解決這個(gè)問(wèn)題。
在幾乎所有情況下,更新購(gòu)物車都將是用戶通過(guò) "查看購(gòu)物車" 頁(yè)面來(lái)實(shí)現(xiàn)的,因此對(duì)開(kāi)發(fā)者來(lái)說(shuō),不必太擔(dān)心"row ID",只要保證你的 "查看購(gòu)物車" 頁(yè)面中的一個(gè)隱藏表單字段包含了這個(gè)信息,并且確保它能被傳遞給表單提交時(shí)所調(diào)用的更新函數(shù)就行了。請(qǐng)仔細(xì)分析上面的 "查看購(gòu)物車" 頁(yè)面的結(jié)構(gòu)以獲取更多信息。
?
函數(shù)參考
$this->cart->insert();
允許你將項(xiàng)目添加到購(gòu)物車中,就像上面所描述的那樣。
$this->cart->update();
允許你更新購(gòu)物車中的項(xiàng)目,就像上面所描述的那樣。
$this->cart->total();
顯示購(gòu)物車中的總計(jì)金額。
$this->cart->total_items();
顯示購(gòu)物車中總共的項(xiàng)目數(shù)量。
$this->cart->contents();
返回一個(gè)包含了購(gòu)物車中所有信息的數(shù)組。
$this->cart->has_options(rowid);
如果購(gòu)物車中特定的列包含選項(xiàng)信息,本函數(shù)會(huì)返回 TRUE(布爾值)。本函數(shù)被設(shè)計(jì)為與 $this->cart->contents() 一起在循環(huán)中使用,因此就像上面的 顯示購(gòu)物車 范例所顯示的那樣,你必須把 rowid 傳遞給這個(gè)函數(shù)。
$this->cart->product_options(rowid);
以數(shù)組的形式返回特定商品的選項(xiàng)信息。本函數(shù)被設(shè)計(jì)為與 $this->cart->contents() 一起在循環(huán)中使用,因此就像上面的 顯示購(gòu)物車 范例所顯示的那樣,你必須把 rowid 傳遞給這個(gè)函數(shù)。
$this->cart->destroy();
允許你銷毀購(gòu)物車。這個(gè)函數(shù)一般是在你處理完用戶訂單后調(diào)用。
?