您的位置:首页 > 编程语言 > PHP开发

TP-购物车

2015-12-14 12:22 435 查看
加入购物车,在点击加入购物车判断已经登陆之后

在GoodsController的add_cart() 里面 判断确实登陆了

//接收ajax传过来的值

$data['goods_id'] = I("post.goods_id",0,"int");

$data['num'] = I("post.goods_num",0,"int");

$data['user_id'] = session("user.id");

$cart = M("cart");

//先查询是否有这个人的这个商品

加入购物车的时候,同一个人同一个商品只存在一条数据

$old_data = $cart->where("user_id=".$data['user_id']." and goods_id=".$data['goods_id'])->find();

if($old_data){

//存在

$data['num'] += $old_data['num'];

if($cart->where("id=".$old_data['id'])->save($data)!==false){

echo 1;

}else{

echo 0;//加入失败

}

}else{

if($cart->add($data)){

echo 1;

}else{

echo 0;//加入失败

}

在detail.html里面的ajax里面补充

else if(data == 0){

alert("加入购物车失败,请刷新后重试,或者尝试直接购买");

}else if(data == 1){

alert("加入购物车成功");

}

一般不用alert进行输出而是在下面写上一个100%的div,透明度设为0,这样网页里面的东西就不可点了,然后再再这个div里面键一个小的div

<div id="msg" style="display:none;width: 100%;height: 100%;position: fixed;top:0;opacity: 50%;;z-index: 999;">

<div style="text-align:center;margin: 300px auto;border: 1px solid red;width: 300px;height: 130px;">

</div>

</div>

<script>

var goods_id = {$goods_data.id};//读取到当前产品的id

/**

* 加入购物车的方法 ajax提交

*/

function addCart(){

var num = $("#buy_num").val();//购买数量

$.post("{:U('Goods/add_cart')}",{goods_id:goods_id,goods_num:num},function(data){

if(data == -2){

$("#msg").find("div").html("请求有误,请刷新后重拾");

}else if(data == -1){

$("#msg").find("div").html("请先登录后再进行购买");

$("#msg").show('slow');

window.location.href="{:U('User/login')}";//没有登录的话 直接跳转到登陆界面

}else if(data == 0){

$("#msg").find("div").html("加入购物车失败,请刷新后重试,或者尝试直接购买");

// alert("加入购物车失败,请刷新后重试,或者尝试直接购买");

}else if(data == 1){

$("#msg").find("div").html("加入购物车成功");

//alert("加入购物车成功");

}

$("#msg").show('slow');

setTimeout(function(){

$("#msg").hide("slow");

},1000);

})

}

</script>

点击立即购买 用js的方法将值传递过去

<button type="button" class="btn btn-danger">立即购买</button>

$(".btn.btn-danger").click(function(){

var num = $("#buy_num").val();//购买数量

window.location.href="{:U('Goods/buy')}?goods_id="+goods_id+"&num="+num;

})

/**

* 点击立即购买时的界面 立即购买之只针对单个商品,如果是点击购物车进去就是多个商品

*/

public function buy(){

$id = I("get.goods_id",0,"int");

$num = I("get.num",0,"int");

//看有没有登陆

if(session("?user")){

//看你有没有收货地址

$address = M("address");

$address_data = $address->where("user_id=".session("user.id"))->select();

if($address_data){

$goods = M("goods");

$goods_data = $goods->field("id,name,img,info,shop_price")->where("id=".$id)->find();

$this->assign("address_data",$address_data);

$this->assign("goods_data",$goods_data);

$this->assign("num",$num);

$this->display(); (order.html)

}else{

//没有收货地址 我需要进行添加

$this->error("请先添加收获地址",U('User/add_address')); (看下面)

}

}else{

$this->error("请先登录后在购买",U('User/login'));

}

}

在视图里面order.html 将名字改为buy

选择地址

<volist name="address_data" id="v">

<div class="m-order-item">

<a href="javascript:change({$v.id});" class="m-order-address">

<input class="a{$v.id}" type="radio" <if condition="$v['is_default'] eq 1">checked</if> name="address_id" value="{$v.id}">

{$v.name} {$v.tel}<span class="orange">[{$v.name}]</span>

<p>{$v.address}</p>

</a>

</div>

</volist>

<script>

function change(id){

$(".a"+id).click();

}

</script>

<li>

<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">

<img class="lazy pull-left" src="{$goods_data.img}" alt="">

<div class="m-cartlist-info">

<h3>{$goods_data.name}</h3>

<h4>{$goods_data.info}</h4>

<h5>¥{$goods_data.shop_price}</h5>

</div>

</a>

<span class="m-cartlist-nums">x {$num}</span>

</li>

支付方式仅限于支付宝

购物车: 新建CartController 由于购物车里面的所有方法都需要判断是否登陆

所以新建

namespace Home\Controller;

use Think\Controller;

class BackController extends Controller{

public function __construct(){

parent::__construct();

if(!session("?user")){

$this->error("请先进行登录",U("User/login"));

}

}

}

新建视图模型

namespace Home\Model;

use Think\Model\ViewModel;

class CartViewModel extends ViewModel{

public $viewFields = array(

'cart'=>array('id','num'),//主表以及要查询的字段 'goods'=>array('id'=>'goods_id','img','name','info','shop_price','_on'=>'cart.goods_id=goods.id'),

);

}

在CartController中

namespace Home\Controller;

use Think\Controller;

class CartController extends BackController{

public function index(){

$cart = D("CartView");

$data = $cart->where("cart.user_id=".session("user.id"))->select();

//print_r($data);

$this->assign("data",$data);

$this->display();

}

}

在购物车视图中

<foreach name="data" item="v">

<li type="normal">

<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}" >

<img class="lazy pull-left" src="{$v.img}">

<div class="m-cartlist-info">

<h3>{$v.name}</h3>

<h4>{$v.info}</h4>

<h5>¥{$v.shop_price}</h5>

</div>

</a>

<span class="m-cartlist-delete" data-dismiss="alert">

<i class="glyphicon fdayicon fdayicon-delete"></i>

</span>

<div class="m-cart-numswrap">

<div class="num_sel_lage pull-right clearfix">

<span class="inC">-</span>

<input type="text" disabled="" name='qty' autocomplete='on' value="{$v.num}" >

<span class="deC">+</span>

</div>

</div>

</li>

</foreach>

删除就是有ajax删除就可以了 自己做

<button type="button" class="btn btn-warning navbar-btn pull-right" onclick="location.href='{:U(\'Cart/buy\')}'">去结算</button> 通过购物车点进结算中心

在CartController中新建

public function buy(){

$address = M("address");

$address_data = $address->where("user_id=".session("user.id"))->select();

if($address_data){

$cart = D("CartView");

$data = $cart->where("cart.user_id=".session("user.id"))->select();

$this->assign("address_data",$address_data);

$this->assign("data",$data);

$this->display("Goods:buy");

}else{

$this->error("请先添加收获地址",U('User/add_address'));

}

}

在add_address.html里面 市区县的下拉框删掉,到时候自己去找个插件,这是连动的

设为默认地址:

<input name="is_default" type="checkbox" class="onoffswitch-checkbox hide" id="myonoffswitch" value='1'>

地址类型删掉

<form class="form-horizontal m-order-address-form" role="form" method="post" action="{:U('User/add_address')}">

在UserController里面添加

public function add_address(){

if(session("?user")){

添加完收货地址应该跳回到前一个页面

if(!(strstr($_SERVER['HTTP_REFERER'],"User/add_address"))){

setcookie("prev_href",$_SERVER['HTTP_REFERER']);

}

if(IS_POST){

$address = M("address");

$data['name'] = I("post.name","","addslashes");

$data['address'] = I("post.address","","addslashes");

$data['tel'] = I("post.tel","","addslashes");

$data['is_default'] = I("post.is_default",0,"int");

//记住 一个人的默认地址只有一个 如果is_default是1的话 你需要先去修改原来的默认地址为0

if($data['is_default'] == 1){

$new_data['is_default'] = 0;

$address->where("user_id=".session("user.id")." and is_default=1")->save($new_data);

}

$data['user_id'] = session("user.id");

if($address->add($data)){

if($_COOKIE['prev_href']){

$this->success('新增成功',$_COOKIE['prev_href']);

}else{

$this->success('新增成功',U('User/address_list'));

}

}else{

$this->error("新增失败");

}

}else{

$this->display();

}

}else{

$this->error("请先登录后在添加收货地址",U('User/login'));

}

}

在goods的buy界面

<if condition="$num"> 如果有$num传过来,说明是立即购买传过来的 这时购买单个商品

<li>

<a href="{:U('Goods/detail',array('id'=>$goods_data['id']))}">

<img class="lazy pull-left" src="{$goods_data.img}" alt="">

<div class="m-cartlist-info">

<h3>{$goods_data.name}</h3>

<h4>{$goods_data.info}</h4>

<h5>¥{$goods_data.shop_price}</h5>

</div>

</a>

<span class="m-cartlist-nums">x {$num}</span>

</li>

<else /> 否则是购物车点击过来的, 这时购买多个商品

<volist name="data" id="v">

<li>

<a href="{:U('Goods/detail',array('id'=>$v['goods_id']))}">

<img class="lazy pull-left" src="{$v.img}" alt="">

<div class="m-cartlist-info">

<h3>{$v.name}</h3>

<h4>{$v.info}</h4>

<h5>¥{$v.shop_price}</h5>

</div>

</a>

<span class="m-cartlist-nums">x {$v.num}</span>

</li>

</volist>

</if>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: