首页 > 开发 > PHP > 正文

php实现仿写CodeIgniter的购物车类

2024-05-04 23:38:21
字体:
来源:转载
供稿:网友

这篇文章主要介绍了php实现仿写CodeIgniter的购物车类,较为详细的分析了购物车的功能与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php实现仿写CodeIgniter的购物车类。分享给大家供大家参考。具体如下:

这里仿写CodeIgniter的购物车类

购物车基本功能:

1) 将物品加入购物车

2) 从购物车中删除物品

3) 更新购物车物品信息 【+1/-1】

4) 对购物车物品进行统计

1. 总项目

2. 总数量

3. 总金额

5) 对购物单项物品的数量及金额进行统计

6) 清空购物车

cart.php文件如下:

 

 
  1. <?php 
  2. /** 
  3. * 
  4. * @author quanshuidingdang 
  5. */ 
  6. class Cart { 
  7. //物品id及名称规则,调试信息控制 
  8. private $product_id_rule = '/.a-z0-9-_'//小写字母 | 数字 | ._- 
  9. private $product_name_rule = '/./:a-z0-9-_';//小写字母 | 数字 | ._-: 
  10. private $debug = TRUE; 
  11. //购物车 
  12. private $_cart_contents = array(); 
  13. /** 
  14. * 构造函数 
  15. * 
  16. * @param array 
  17. */ 
  18. public function __construct() { 
  19. //是否第一次使用? 
  20. if(isset($_SESSION['cart_contents'])) { 
  21. $this->_cart_contents = $_SESSION['cart_contents']; 
  22. else { 
  23. $this->_cart_contents['cart_total'] = 0; 
  24. $this->_cart_contents['total_items'] = 0; 
  25. if($this->debug === TRUE) { 
  26. //$this->_log("cart_create_success"); 
  27. /** 
  28. * 将物品加入购物车 
  29. * 
  30. * @access public 
  31. * @param array 一维或多维数组,必须包含键值名:  
  32. id -> 物品ID标识,  
  33. qty -> 数量(quantity),  
  34. price -> 单价(price),  
  35. name -> 物品姓名 
  36. * @return bool 
  37. */ 
  38. public function insert($items = array()) { 
  39. //输入物品参数异常 
  40. if( ! is_array($items) OR count($items) == 0) { 
  41. if($this->debug === TRUE) { 
  42. $this->_log("cart_no_items_insert"); 
  43. return FALSE; 
  44. //物品参数处理 
  45. $save_cart = FALSE; 
  46. if(isset($items['id'])) { 
  47. if($this->_insert($items) === TRUE) { 
  48. $save_cart = TRUE; 
  49. else { 
  50. foreach($items as $val) { 
  51. if(is_array($val) AND isset($val['id'])) { 
  52. if($this->_insert($val) == TRUE) { 
  53. $save_cart = TRUE; 
  54. //当插入成功后保存数据到session 
  55. if($save_cart) { 
  56. $this->_save_cart(); 
  57. return TRUE; 
  58. return FALSE; 
  59. /** 
  60. * 更新购物车物品信息 
  61. * 
  62. * @access public 
  63. * @param array 
  64. * @return bool 
  65. */ 
  66. public function update($items = array()) { 
  67. //输入物品参数异常 
  68. if( !is_array($items) OR count($items) == 0) { 
  69. if($this->debug === TRUE) { 
  70. $this->_log("cart_no_items_insert"); 
  71. return FALSE; 
  72. //物品参数处理 
  73. $save_cart = FALSE; 
  74. if(isset($items['rowid']) AND isset($items['qty'])) { 
  75. if($this->_update($items) === TRUE) { 
  76. $save_cart = TRUE; 
  77. else { 
  78. foreach($items as $val) { 
  79. if(is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) { 
  80. if($this->_update($val) === TRUE) { 
  81. $save_cart = TRUE; 
  82. //当更新成功后保存数据到session 
  83. if($save_cart) { 
  84. $this->_save_cart(); 
  85. return TRUE; 
  86. return FALSE; 
  87. /** 
  88. * 获取购物车物品总金额 
  89. * 
  90. * @return int 
  91. */ 
  92. public function total() { 
  93. return $this->_cart_contents['cart_total']; 
  94. /** 
  95. * 获取购物车物品种类 
  96. * 
  97. * @return int 
  98. */ 
  99. public function total_items() { 
  100. return $this->_cart_contents['total_items']; 
  101. /** 
  102. * 获取购物车 
  103. * 
  104. * @return array 
  105. */ 
  106. public function contents() { 
  107. return $this->_cart_contents; 
  108. /** 
  109. * 获取购物车物品options 
  110. * 
  111. * @param string 
  112. * @return array 
  113. */ 
  114. public function options($rowid = '') { 
  115. if($this->has_options($rowid)) { 
  116. return $this->_cart_contents[$rowid]['options']; 
  117. else { 
  118. return array(); 
  119. /** 
  120. * 清空购物车 
  121. * 
  122. */ 
  123. public function destroy() { 
  124. unset($this->_cart_contents); 
  125. $this->_cart_contents['cart_total'] = 0; 
  126. $this->_cart_contents['total_items'] = 0; 
  127. unset($_SESSION['cart_contents']); 
  128. /** 
  129. * 判断购物车物品是否有options选项 
  130.  
  131. * @param string 
  132. * @return bool 
  133. */ 
  134. private function has_options($rowid = '') { 
  135. if( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) { 
  136. return FALSE; 
  137. return TRUE; 
  138. /** 
  139. * 插入数据 
  140. * 
  141. * @access private  
  142. * @param array 
  143. * @return bool 
  144. */ 
  145. private function _insert($items = array()) { 
  146. //输入物品参数异常 
  147. if( ! is_array($items) OR count($items) == 0) { 
  148. if($this->debug === TRUE) { 
  149. $this->_log("cart_no_data_insert"); 
  150. return FALSE; 
  151. //如果物品参数无效(无id/qty/price/name) 
  152. if( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name'])) { 
  153. if($this->debug === TRUE) { 
  154. $this->_log("cart_items_data_invalid"); 
  155. return FALSE; 
  156. //去除物品数量左零及非数字字符 
  157. $items['qty'] = trim(preg_replace('/([^0-9])/i''', $items['qty'])); 
  158. $items['qty'] = trim(preg_replace('/^([0]+)/i''', $items['qty'])); 
  159. //如果物品数量为0,或非数字,则我们对购物车不做任何处理! 
  160. if( ! is_numeric($items['qty']) OR $items['qty'] == 0) { 
  161. if($this->debug === TRUE) { 
  162. $this->_log("cart_items_data(qty)_invalid"); 
  163. return FALSE; 
  164. //物品ID正则判断 
  165. if( ! preg_match('/^['.$this->product_id_rule.']+$/i', $items['id'])) { 
  166. if($this->debug === TRUE) { 
  167. $this->_log("cart_items_data(id)_invalid"); 
  168. return FALSE; 
  169. //物品名称正则判断 
  170. if( ! preg_match('/^['.$this->product_name_rule.']+$/i', $items['name'])) { 
  171. if($this->debug === TRUE) { 
  172. $this->_log("cart_items_data(name)_invalid"); 
  173. return FALSE; 
  174. //去除物品单价左零及非数字(带小数点)字符 
  175. $items['price'] = trim(preg_replace('/([^0-9/.])/i''', $items['price'])); 
  176. $items['price'] = trim(preg_replace('/^([0]+)/i''', $items['price'])); 
  177. //如果物品单价非数字 
  178. if( ! is_numeric($items['price'])) { 
  179. if($this->debug === TRUE) { 
  180. $this->_log("cart_items_data(price)_invalid"); 
  181. return FALSE; 
  182. //生成物品的唯一id 
  183. if(isset($items['options']) AND count($items['options']) >0) { 
  184. $rowid = md5($items['id'].implode('', $items['options'])); 
  185. else { 
  186. $rowid = md5($items['id']); 
  187. //加入物品到购物车 
  188. unset($this->_cart_contents[$rowid]); 
  189. $this->_cart_contents[$rowid]['rowid'] = $rowid; 
  190. foreach($items as $key => $val) { 
  191. $this->_cart_contents[$rowid][$key] = $val; 
  192. return TRUE; 
  193. /** 
  194. * 更新购物车物品信息(私有) 
  195. * 
  196. * @access private 
  197. * @param array 
  198. * @return bool 
  199. */ 
  200. private function _update($items = array()) { 
  201. //输入物品参数异常 
  202. if( ! isset($items['rowid']) OR ! isset($items['qty']) OR ! isset($this->_cart_contents[$items['rowid']])) { 
  203. if($this->debug == TRUE) { 
  204. $this->_log("cart_items_data_invalid"); 
  205. return FALSE; 
  206. //去除物品数量左零及非数字字符 
  207. $items['qty'] = preg_replace('/([^0-9])/i''', $items['qty']); 
  208. $items['qty'] = preg_replace('/^([0]+)/i''', $items['qty']); 
  209. //如果物品数量非数字,对购物车不做任何处理! 
  210. if( ! is_numeric($items['qty'])) { 
  211. if($this->debug === TRUE) { 
  212. $this->_log("cart_items_data(qty)_invalid"); 
  213. return FALSE; 
  214. //如果购物车物品数量与需要更新的物品数量一致,则不需要更新 
  215. if($this->_cart_contents[$items['rowid']]['qty'] == $items['qty']) { 
  216. if($this->debug === TRUE) { 
  217. $this->_log("cart_items_data(qty)_equal"); 
  218. return FALSE; 
  219. //如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除 
  220. //否则修改购物车物品数量等于输入的物品数量 
  221. if($items['qty'] == 0) { 
  222. unset($this->_cart_contents[$items['rowid']]); 
  223. else { 
  224. $this->_cart_contents[$items['rowid']]['qty'] = $items['qty']; 
  225. return TRUE; 
  226. /** 
  227. * 保存购物车数据到session 
  228.  
  229. * @access private 
  230. * @return bool 
  231. */ 
  232. private function _save_cart() { 
  233. //首先清除购物车总物品种类及总金额 
  234. unset($this->_cart_contents['total_items']); 
  235. unset($this->_cart_contents['cart_total']); 
  236. //然后遍历数组统计物品种类及总金额 
  237. $total = 0; 
  238. foreach($this->_cart_contents as $key => $val) { 
  239. if( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty'])) { 
  240. continue
  241. $total += ($val['price'] * $val['qty']); 
  242. //每种物品的总金额 
  243. $this->_cart_contents[$key]['subtotal'] = ($val['price'] * $val['qty']); 
  244. //设置购物车总物品种类及总金额 
  245. $this->_cart_contents['total_items'] = count($this->_cart_contents); 
  246. $this->_cart_contents['cart_total'] = $total; 
  247. //如果购物车的元素个数少于等于2,说明购物车为空 
  248. if(count($this->_cart_contents) <= 2) { 
  249. unset($_SESSION['cart_contents']); 
  250. return FALSE; 
  251. //保存购物车数据到session 
  252. $_SESSION['cart_contents'] = $this->_cart_contents; 
  253. return TRUE; 
  254. /** 
  255. * 日志记录 
  256. * 
  257. * @access private 
  258. * @param string 
  259. * @return bool 
  260. */ 
  261. private function _log($msg) { 
  262. return @file_put_contents('cart_err.log', $msg, FILE_APPEND); 
  263. /*End of file cart.php*/ 
  264. /*Location /htdocs/cart.php*/ 

cart_demo.php文件如下:

 

 
  1. <?php 
  2. session_start(); 
  3. require_once('cart.php'); 
  4. $items = array( 
  5. 0 => array( 
  6. 'id' => 'sp001'
  7. 'qty' => 20, 
  8. 'price' => '10.50'
  9. 'name' => 'a002'
  10. 'options' => array( 
  11. 'made' => 'china'
  12. 'company' => 'bgi' 
  13. ), 
  14. 1 => array( 
  15. 'id' => 'sp002'
  16. 'qty' => 1, 
  17. 'price' => '3.50'
  18. 'name' => 'b002' 
  19. ); 
  20. $arr = array( 
  21. 'rowid' => '86dbb7cb58a667558b4bbb1f60330028'
  22. 'qty' => 21 
  23. ); 
  24. $cart = new Cart(); 
  25. $cart->insert($items); 
  26. //var_dump($cart->contents()); 
  27. $cart->update($arr); 
  28. var_dump($cart->contents()); 
  29. //$cart->destroy(); 
  30. //var_dump($_SESSION['cart_contents']); 
  31. /*end of php*/ 

希望本文所述对大家的php程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表