首页 > 编程 > PHP > 正文

php实现仿写CodeIgniter的购物车类

2020-03-22 20:33:20
字体:
来源:转载
供稿:网友
本文实例讲述了php实现仿写CodeIgniter的购物车类。分享给大家供大家参考。具体如下: 这里仿写CodeIgniter的购物车类 购物车基本功能: 1) 将物品加入购物车
2) 从购物车中删除物品
3) 更新购物车物品信息 【+1/-1】
4) 对购物车物品进行统计
1. 总项目
2. 总数量
3. 总金额
5) 对购物单项物品的数量及金额进行统计
6) 清空购物车 cart.php文件如下: * @author quanshuidingdang html' target='_blank'>class Cart { //物品id及名称规则,调试信息控制 private $product_id_rule = '.a-z0-9-_'; //小写字母 | 数字 | ._- private $product_name_rule = '.:a-z0-9-_';//小写字母 | 数字 | ._-: private $debug = TRUE; //购物车 private $_cart_contents = array(); * 构造函数 * @param array public function __construct() { //是否第一次使用 if(isset($_SESSION['cart_contents'])) { $this- _cart_contents = $_SESSION['cart_contents']; } else { $this- _cart_contents['cart_total'] = 0; $this- _cart_contents['total_items'] = 0; if($this- debug === TRUE) { //$this- _log("cart_create_success"); * 将物品加入购物车 * @access public * @param array 一维或多维数组,必须包含键值名: id - 物品ID标识, qty - 数量(quantity), price - 单价(price), name - 物品姓名 * @return bool public function insert($items = array()) { //输入物品参数异常 if( ! is_array($items) OR count($items) == 0) { if($this- debug === TRUE) { $this- _log("cart_no_items_insert"); return FALSE; //物品参数处理 $save_cart = FALSE; if(isset($items['id'])) { if($this- _insert($items) === TRUE) { $save_cart = TRUE; } else { foreach($items as $val) { if(is_array($val) AND isset($val['id'])) { if($this- _insert($val) == TRUE) { $save_cart = TRUE; //当插入成功后保存数据到session if($save_cart) { $this- _save_cart(); return TRUE; return FALSE; * 更新购物车物品信息 * @access public * @param array * @return bool public function update($items = array()) { //输入物品参数异常 if( !is_array($items) OR count($items) == 0) { if($this- debug === TRUE) { $this- _log("cart_no_items_insert"); return FALSE; //物品参数处理 $save_cart = FALSE; if(isset($items['rowid']) AND isset($items['qty'])) { if($this- _update($items) === TRUE) { $save_cart = TRUE; } else { foreach($items as $val) { if(is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) { if($this- _update($val) === TRUE) { $save_cart = TRUE; //当更新成功后保存数据到session if($save_cart) { $this- _save_cart(); return TRUE; return FALSE; * 获取购物车物品总金额 * @return int public function total() { return $this- _cart_contents['cart_total']; * 获取购物车物品种类 * @return int public function total_items() { return $this- _cart_contents['total_items']; * 获取购物车 * @return array public function contents() { return $this- _cart_contents; * 获取购物车物品options * @param string * @return array public function options($rowid = '') { if($this- has_options($rowid)) { return $this- _cart_contents[$rowid]['options']; } else { return array(); * 清空购物车 public function destroy() { unset($this- _cart_contents); $this- _cart_contents['cart_total'] = 0; $this- _cart_contents['total_items'] = 0; unset($_SESSION['cart_contents']); * 判断购物车物品是否有options选项 * @param string * @return bool private function has_options($rowid = '') { if( ! isset($this- _cart_contents[$rowid]['options']) OR count($this- _cart_contents[$rowid]['options']) === 0) { return FALSE; return TRUE; * 插入数据 * @access private * @param array * @return bool private function _insert($items = array()) { //输入物品参数异常 if( ! is_array($items) OR count($items) == 0) { if($this- debug === TRUE) { $this- _log("cart_no_data_insert"); return FALSE; //如果物品参数无效(无id/qty/price/name) if( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name'])) { if($this- debug === TRUE) { $this- _log("cart_items_data_invalid"); return FALSE; //去除物品数量左零及非数字字符 $items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty'])); $items['qty'] = trim(preg_replace('/^([0]+)/i', '', $items['qty'])); //如果物品数量为0,或非数字,则我们对购物车不做任何处理! if( ! is_numeric($items['qty']) OR $items['qty'] == 0) { if($this- debug === TRUE) { $this- _log("cart_items_data(qty)_invalid"); return FALSE; //物品ID正则判断 if( ! preg_match('/^['.$this- product_id_rule.']+$/i', $items['id'])) { if($this- debug === TRUE) { $this- _log("cart_items_data(id)_invalid"); return FALSE; //物品名称正则判断 if( ! preg_match('/^['.$this- product_name_rule.']+$/i', $items['name'])) { if($this- debug === TRUE) { $this- _log("cart_items_data(name)_invalid"); return FALSE; //去除物品单价左零及非数字(带小数点)字符 $items['price'] = trim(preg_replace('/([^0-9.])/i', '', $items['price'])); $items['price'] = trim(preg_replace('/^([0]+)/i', '', $items['price'])); //如果物品单价非数字 if( ! is_numeric($items['price'])) { if($this- debug === TRUE) { $this- _log("cart_items_data(price)_invalid"); return FALSE; //生成物品的唯一id if(isset($items['options']) AND count($items['options']) 0) { $rowid = md5($items['id'].implode('', $items['options'])); } else { $rowid = md5($items['id']); //加入物品到购物车 unset($this- _cart_contents[$rowid]); $this- _cart_contents[$rowid]['rowid'] = $rowid; foreach($items as $key = $val) { $this- _cart_contents[$rowid][$key] = $val; return TRUE; * 更新购物车物品信息(私有) * @access private * @param array * @return bool private function _update($items = array()) { //输入物品参数异常 if( ! isset($items['rowid']) OR ! isset($items['qty']) OR ! isset($this- _cart_contents[$items['rowid']])) { if($this- debug == TRUE) { $this- _log("cart_items_data_invalid"); return FALSE; //去除物品数量左零及非数字字符 $items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']); $items['qty'] = preg_replace('/^([0]+)/i', '', $items['qty']); //如果物品数量非数字,对购物车不做任何处理! if( ! is_numeric($items['qty'])) { if($this- debug === TRUE) { $this- _log("cart_items_data(qty)_invalid"); return FALSE; //如果购物车物品数量与需要更新的物品数量一致,则不需要更新 if($this- _cart_contents[$items['rowid']]['qty'] == $items['qty']) { if($this- debug === TRUE) { $this- _log("cart_items_data(qty)_equal"); return FALSE; //如果需要更新的物品数量等于0,表示不需要这件物品,从购物车种清除 //否则修改购物车物品数量等于输入的物品数量 if($items['qty'] == 0) { unset($this- _cart_contents[$items['rowid']]); } else { $this- _cart_contents[$items['rowid']]['qty'] = $items['qty']; return TRUE; * 保存购物车数据到session * @access private * @return bool private function _save_cart() { //首先清除购物车总物品种类及总金额 unset($this- _cart_contents['total_items']); unset($this- _cart_contents['cart_total']); //然后遍历数组统计物品种类及总金额 $total = 0; foreach($this- _cart_contents as $key = $val) { if( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty'])) { continue; $total += ($val['price'] * $val['qty']); //每种物品的总金额 $this- _cart_contents[$key]['subtotal'] = ($val['price'] * $val['qty']); //设置购物车总物品种类及总金额 $this- _cart_contents['total_items'] = count($this- _cart_contents); $this- _cart_contents['cart_total'] = $total; //如果购物车的元素个数少于等于2,说明购物车为空 if(count($this- _cart_contents) = 2) { unset($_SESSION['cart_contents']); return FALSE; //保存购物车数据到session $_SESSION['cart_contents'] = $this- _cart_contents; return TRUE; * 日志记录 * @access private * @param string * @return bool private function _log($msg) { return @file_put_contents('cart_err.log', $msg, FILE_APPEND); /*End of file cart.php*/ /*Location /htdocs/cart.php*/ cart_demo.php文件如下: session_start(); require_once('cart.php'); $items = array( 0 = array( 'id' = 'sp001', 'qty' = 20, 'price' = '10.50', 'name' = 'a002', 'options' = array( 'made' = 'china', 'company' = 'bgi' 1 = array( 'id' = 'sp002', 'qty' = 1, 'price' = '3.50', 'name' = 'b002' $arr = array( 'rowid' = '86dbb7cb58a667558b4bbb1f60330028', 'qty' = 21 $cart = new Cart(); $cart- insert($items); //var_dump($cart- contents()); $cart- update($arr); var_dump($cart- contents()); //$cart- destroy(); //var_dump($_SESSION['cart_contents']); /*end of php*/ 希望本文所述对大家的php程序设计有所帮助。
PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

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