基于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 相关文章推荐
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
php 利用socket发送HTTP请求(GET,POST)
Aug 24 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
Laravel学习教程之model validation的使用示例
Oct 23 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
Apr 09 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
Laravel数据库读写分离配置的方法
Oct 13 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
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
chrome原生方法之数组
2011/11/30 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
微信QQ的二维码登录原理js代码解析
2016/06/23 Javascript
video.js使用改变ui过程
2017/03/05 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
深入理解requireJS-实现一个简单的模块加载器
2018/01/15 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
老生常谈进程线程协程那些事儿
2017/07/24 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
pycharm安装和首次使用教程
2018/08/27 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
2018/09/17 Python
解决python 上传图片限制格式问题
2019/10/30 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
公共事业管理本科生求职信
2013/10/07 职场文书
实习求职信
2013/12/01 职场文书
运动会入场词100字
2014/02/06 职场文书
婚礼主持词
2014/03/13 职场文书
奖金申请报告模板
2015/05/15 职场文书
Spring Boot 实现 WebSocket
2022/04/30 Java/Android
Spring中的@Transactional的工作原理
2022/06/05 Java/Android