商品详情

1.后台代码

public function detail($id)
    {
        //验证参数 商品id是否为纯数字
        if (!intval($id)) {
            $this->error('参数不正确', '/home/goods/index');
        }
        //根据id查询商品表和商品相册表,规格商品表
        $goods = \app\home\model\Goods::with('goodsImage,specGoods')->find($id)->toArray();
        //页面默认显示 商品第一个sku的价格,库存,成本价 替换到$goods中
        if (!empty($goods['spec_goods'])) {
            //判断第一个sku的商品价格是否大于0 是就将值替换到$goods中
            if ($goods['spec_goods'][0]['price'] > 0) {
                $goods['goods_price'] = $goods['spec_goods'][0]['price'];
            }
            //将sku的成本价替换到商品表中
            if ($goods['spec_goods'][0]['cost_price'] > 0) {
                $goods['cost_price'] = $goods['spec_goods'][0]['cost_price'];
            }

            if ($goods['spec_goods'][0]['store_count'] > 0) {
                $goods['goods_number'] = $goods['spec_goods'][0]['store_count'];
            } else {
                $goods['goods_number'] = 0;
            }
        }

        //将商品属性转化为数组
        $goods['goods_attr'] = json_decode($goods['goods_attr']);

        /*echo "<pre>";
        print_r($goods);die();*/
        //查询规格主键id
        $value_ids = array_column($goods['spec_goods'], 'value_ids');
        $value_ids = array_unique(explode('_', implode('_', $value_ids)));
//        print_r($value_ids);die();   Array ( [0] => 18 [1] => 21 [3] => 22 [4] => 19 )
        //根据value_ids 查询规格值
        $specValue = SpecValue::with('spec')->where('id', 'in', $value_ids)->select();
        $specValue = collection($specValue)->toArray();
        /*echo "<pre>";
        print_r($specValue);die();*/
        //将specValue的格式处理
        $res = [];
        foreach ($specValue as $v) {
            $res[$v['spec_id']] = [
                'spec_id' => $v['spec_id'],
                'spec_name' => $v['spec_name'],
                'spec_values' => []
            ];
        }
        foreach ($specValue as $v) {
            $res[$v['spec_id']]['spec_values'][] = $v;
        }
        /*echo "<pre>";
        print_r($res);
        die();*/
        //Array (
        // [19] =>
        // Array (
        // [spec_id] => 19 [spec_name] => 颜色 [spec_values] =>
        // Array ( [0] => Array ( [id] => 18 [spec_id] => 19 [spec_value] => 黑色 [type_id] => 16  [spec_name] => 颜色 )
        // [1] => Array ( [id] => 19 [spec_id] => 19 [spec_value] => 白色 [type_id] => 16  [spec_name] => 颜色 ) ) )
        // [20] =>
        // Array (
        // [spec_id] => 20 [spec_name] => 版本 [spec_values] =>
        // Array (
        // [0] => Array ( [id] => 21 [spec_id] => 20 [spec_value] => 全网通 [type_id] => 16 [spec_name] => 版本 )
        // [1] => Array ( [id] => 22 [spec_id] => 20 [spec_value] => 单网通 [type_id] => 16  [spec_name] => 版本 ) ) ) )

        $value_ids_map = [];
        foreach ($goods['spec_goods'] as $v) {
            $row = [
                'id' => $v['id'],
                'price' => $v['price']
            ];
            $value_ids_map[$v['value_ids']] = $row;
        }
        //
        $value_ids_map = json_encode($value_ids_map);
        /*echo $value_ids_map;die();*/
        //{"18_21":{"id":801,"price":"1000.00"},"18_22":{"id":802,"price":"1100.00"},"19_21":{"id":803,"price":"1200.00"},"19_22":{"id":804,"price":"1200.00"}}
        $this->assign('value_ids_map', $value_ids_map);
        $this->assign('specs', $res);
        $this->assign('goods', $goods);
        return view();
    }

2.前端页面展示  jquery

 1 <div id="specification" class="summary-wrap clearfix">
 2             {foreach $specs as $v}
 3                 <dl>
 4                    <dt>
 5                       <div class="fl title">
 6                            <i>{$v.spec_name}</i>
 7                       </div>
 8                    </dt>
 9                       {foreach $v['spec_values'] as $k=>$vo}
10                        <dd><a spec_values_id="{$vo.id}"  href="javascript:;" class="{if($k==0)}selected{/if}">{$vo.spec_value}<span
11                               title="点击取消选择">&nbsp;</span></a></dd>
12                        {/foreach}
13                 </dl>
14             {/foreach}
15</div>
16 <div class="summary-wrap">
17                <div class="fl title">
18                      <div class="control-group">
19                           <div class="controls">
20                                <input id="number" autocomplete="off" type="text" value="1" minnum="1"
21                                       class="itxt"/>
22                                 <a href="javascript:void(0)" id="plus" class="increment plus">+</a>
23                                  <a href="javascript:void(0)" id="mins" class="increment mins">-</a>
24                            </div>
25                       </div>
26                 </div>
27                 <div class="fl">
28                      <ul class="btn-choose unstyled">
29                           <li>
30                              <a href="javascript:;" id="addshopcar" class="sui-btn  btn-danger addshopcar">加入购物车</a>
31                           </li>
32                      </ul>
33                </div>
34 </div>
35 <script>
36     $(function () {
37         //规格值ids 到 规格商品id的映射关系
38         var value_ids_map = {$value_ids_map};
39         //加入购物车
40         $("#addshopcar").click(function () {
41             //先获取选中的规格值的组合 例如:18_19
42             var value_ids = '';
43             $(".selected").each(function (k,v) {
44                 value_ids += $(v).attr('spec_values_id') + '_';
45             })
46             //将最后一个_消除
47             value_ids = value_ids.slice(0,-1);
48             //获取对应的商品规格sku里面的id spec_goods_id 考虑到部分商品可能没有SKU 使用三元判断
49             var spec_goods_id = value_ids_map[value_ids]?value_ids_map[value_ids].id:'';
50             //将spec_goods_id放入隐藏表单中
51             $('input[name=spec_goods_id]').val(spec_goods_id);
52             //获取购买商品数量
53             var number = $("#number").val();
54             //将商品数量放入隐藏表单中
55             $('input[name=number]').val(number);
56             //提交表单
57             $('form').submit();
58         })
59 
60 
61         //规格值选中效果  find() 循环遍历 id 为specification div 下的a元素
62         $("#specification").find('a').click(function () {
63             //给当前当标签 移除selected这个class
64             $(this).closest('dl').find('a').removeClass('selected');
65             //再给当前点击的a标签加上selected
66             $(this).addClass('selected');
67 
68             //获取选中的规格值组合
69             var value_ids = '';
70             $(".selected").each(function (k,v) {
71                 value_ids += $(v).attr('spec_values_id')+'_';//拼接 为18_19_
72             })
73             //去掉最后一个下划线 slice(开始下标,结尾下标:为负数从后面开始) 方法选取基于索引的元素的子集。
74             value_ids = value_ids.slice(0,-1);
75             //获取对应的商品规格sku里面的值
76             var spec_goods_price = value_ids_map[value_ids].price;
77             //将价格显示到页面上
78             $("#goods_price").html(spec_goods_price);
79         })
80 
81         //购买数量  加
82         $("#plus").click(function () {
83             //先获取input 里面的值  parseInt()返回一个整数
84             var number = parseInt($("#number").val());
85             number += 1;
86             $("#number").val(number);
87         })
88         //
89         $("#mins").click(function () {
90             var number = parseInt($("#number").val());
91             if (number == 1) return;
92             number -= 1;
93             $("#number").val(number)
94         })
95 
96     })
97 </script>

 

posted @ 2021-09-26 20:38  晚夜聆风  阅读(448)  评论(0编辑  收藏  举报