基于CI(CodeIgniter)框架实现购物车功能的方法


Posted in PHP onApril 09, 2018

本文实例讲述了基于CI(CodeIgniter)框架实现购物车功能的方法。分享给大家供大家参考,具体如下:

在商城项目中,购物车是非常重要的一环,此处留下源码,留作笔记!!!

话不多说,往下看:

1. 源代码

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class cart extends Home_Controller {
  private $info = array();    #前台提交数据
  private $specData = array();  #规格信息
  private $prodData = array();  #货品组合信息
  private $cartData = array();  #购物车入库数据
  /**
   * 构造函数
   */
  public function __construct()
  {
    parent::__construct();
    $this->load->model('goodsModel','goods');
    $this->load->model('productModel','product');
    $this->load->model('goodsAttrModel','goodsAttr');
  }
  /**
   * [购物车]数据添加
   */
  public function cartAdd()
  {
    #接收购物车提交数据
    $this->info = $this->input->post();
  // $this->ajaxReturn($this->info);
    #1.验证商品库存、货品库存
    $this->checkGoodsNumber();
    #2.查询规格名称、价格
    $this->getSpecData();
    #3.组装购物车添加de数据
    $cartData = $this->setCartData();
  p(json_decode($this->input->cookie('cart'),true));
    # 一、判断是否登录
    if(!UID){
      //未登录 数据存入Cookie中
      //1:获取cookie中的购物车数据
      $cookieCartData = $this->input->cookie('cart');
      //2:判断cookie中数据是否为空
      if(empty($cookieCartData)){
        //2-1:为空则表示用户没有添加过购物车
        //2-1-1.设置Key-->生成购物车数据
        $key = $cartData['goods_id'].'-'.$cartData['product_id'];
        $cookieCart = array($key => $cartData);
        //2-1-2.设置购物车返回值(商品数量、总价)
        $this->setCartReturn(1,$cartData['goods_price']);
        //2-1-3.设置Cookie存储购物车数据
      }else{
        //2-2:不为空 表示用户添加过购物车
        //2-2-1.追加购物数据
        $cookieCart = $this->addCartData($cartData,json_decode($cookieCartData,true));
        //2-2-2.设置购物车返回值(商品数量、总价)
        $this->setCartReturn(count($cookieCart),array_sum(array_column($cookieCart, 'goods_price')));
      }
      //3:设置Cookie存储购物车数据
      setCookie('cart',json_encode($cookieCart),LEFT_TIME,'/');
    }else{
      //已登录 数据存入数据库
    }
    //返回购物车提示数据
    $this->ajaxReturn($this->msg);
  }
  /**
   * 验证商品库存
   */
  public function checkGoodsNumber()
  {
    $this->goods->map = array(
      'goods_id'     =>  $this->info['goods_id'],
      'goods_number >='  => $this->info['buy_number'],
    );
    $this->goods = $this->goods->find('goods_id,goods_name,goods_sn,goods_img,shop_price');
    if(!$this->goods){
      $this->msg['msg'] = "商品库存不足";
      $this->ajaxReturn($this->msg);
    }
    #验证货品库存
    $this->product->map = array(
      'goods_id'     =>  $this->info['goods_id'],
      'product_attr'   =>  $this->info['prod_attr'],
      'product_number >=' => $this->info['buy_number'],
    );
    $this->prodData = $this->product->find();
    if(!$this->prodData){
      $this->msg['msg'] = "货品库存不足";
      $this->ajaxReturn($this->msg);
    }
    return true;
  }
  /**
   * 组合规格名称、价格
   */
  public function getSpecData()
  {
    $this->goodsAttr->map = inToType(explode("|", $this->info['prod_attr']),'goods_attr_id');
    $goodsAttrInfo = $this->goodsAttr->select('goods_attr_value,goods_attr_price');
    $this->specData['product_attr_value'] = implode("|", array_column($goodsAttrInfo, 'goods_attr_value'));
    $this->specData['product_price'] = array_sum(array_column($goodsAttrInfo,'goods_attr_price'));
    # 返回规格信息 $this->specData
  }
  /**
   * 组装购物车添加的数组
   */
  public function setCartData()
  {
    $this->cartData = array(
      'product_id'  =>  $this->prodData['product_id'],
      'product_attr' =>  $this->prodData['product_attr'],
      'buy_number'  =>  $this->info['buy_number'],
      'goods_price'  =>  $this->info['shop_price'],
      'goods_sum'   =>  $this->info['shop_price'] * $this->info['buy_number'],
      'product_price' =>  '',
      'product_attr_value'  =>  '',
      'uid'      =>  UID,
    );
    $this->cartData = array_merge($this->cartData,$this->goods);
    #若存在规格【添加规格信息】
    if(!empty($this->info['prod_attr'])){
      $this->cartData['product_price'] = $this->specData['product_price'];
      $this->cartData['product_attr_value'] = $this->specData['product_attr_value'];
    }
    return $this->cartData;
    # 购物车 添加的总数据 $this->cartData;
  }
  /**
   * 设置购物车返回提示数据
   * @param [商品数量,总价]
   */
  public function setCartReturn($number,$prices)
  {
    $this->msg['code'] = self::STATUS_ON;
    $this->msg['data'] = array(
        'number'  =>  $number,
        'prices'  =>  $prices,
    );
  }
  /**
   * 购物车 新添加数据
   * @param [新数据,原购物车数据]
   */
  public function addCartData($newData,$oldData)
  {
    #组合Key
    $key = $newData['goods_id'].'-'.$newData['product_id'];
    // #判断购物车中是否有该商品
    if(isset($oldData[$key])){
      //1.有 合并商品数量、价格
      $oldData[$key]['buy_number'] = $oldData[$key]['buy_number'] + $newData['buy_number'];
      $oldData[$key]['goods_price'] = $newData['goods_price'];
      $oldData[$key]['goods_sum'] = $oldData[$key]['buy_number'] * $oldData[$key]['goods_price'];
    }else{
      //2.没有 追加新商品
      $oldData[$key] = $newData;
    }
    #返回购物车数据
    return $oldData;
  }
}
?>

2. 数据库

CREATE TABLE `shop_goods` (
 `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `goods_name` varchar(255) NOT NULL,
 `type_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
CREATE TABLE `shop_product` (
 `product_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `goods_id` int(11) NOT NULL,
 `goods_price` decimal(10,2) NOT NULL,
 `goods_num` int(11) NOT NULL,
 `goods_sn` varchar(50) NOT NULL,
 `goods_attr_id` varchar(100) NOT NULL,
 PRIMARY KEY (`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
CREATE TABLE `shop_goods_attr` (
 `goods_attr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `goods_id` int(11) NOT NULL,
 `attr_id` int(11) NOT NULL,
 `attr_value` varchar(255) NOT NULL,
 PRIMARY KEY (`goods_attr_id`)
) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8;

CI购物车总结完毕!!!

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
输出控制类
Oct 09 PHP
PHP 中的批处理的实现
Jun 14 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
将php数组输出html表格的方法
Feb 24 PHP
php中函数前加&amp;符号的作用分解
Jul 08 PHP
php中header设置常见文件类型的content-type
Jun 23 PHP
PHP缓冲区用法总结
Feb 14 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
laravel orm 关联条件查询代码
Oct 21 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 #PHP
PHP+Session防止表单重复提交的解决方法
Apr 09 #PHP
PHP创建自己的Composer包方法
Apr 09 #PHP
Bootstrap+PHP实现多图上传功能实例详解
Apr 08 #PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 #PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 #PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
Apr 08 #PHP
You might like
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP异常处理Exception类
2015/12/11 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
python发送伪造的arp请求
2014/01/09 Python
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
用C++封装MySQL的API的教程
2015/05/06 Python
基于keras中的回调函数用法说明
2020/06/17 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
德国百年厨具品牌WMF美国站:WMF美国
2016/09/12 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
电气专业应届生求职信
2013/11/01 职场文书
教师师德反思材料
2014/02/15 职场文书
夜不归宿检讨书
2014/02/25 职场文书
实习指导老师意见
2015/06/04 职场文书
锦旗赠语
2015/06/23 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技