TP电商项目:商品扩展类的添加

需求分析:

一件商品可以同时属于多个扩展分类,搜索任何一个分类都可以搜索出这件商品

第一步 建表

//扩展分类表

create table p39_goods_cat(

cat_id  mediumint unsigned not null  comment '分类id',

goods_id  mediumint unsigned not null  comment '商品id',

key goods_id(goods_id),

key cat_id(cat_id)


)engine=InnoDB default charset=utf8 comment '商品的扩展分类 ';

第二步 将主分类的代码复制到扩展分类

<tr>

                <td class="label">扩展分类:</td>

                <td>

                    <select name="cat_id">

                    <option value="">选择分类</option>

                    <?php foreach ($catData as $k => $v): ?>

                    <option value="<?php echo $v['id']; ?>"><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></option>

                    <?php endforeach; ?>

                    </select>


                </td>

            </tr>

如图所示:


第三步 添加一个按钮 点击一次克隆一个扩展分类的下拉框

<tr>

                <td class="label">扩展分类:<input

onclick="$('#cat_list').append($('#cat_list').find('select').eq(0).clone());"


 type="button" id="btn_add_cat" value="添加一个"/></td>

                <td>

                    <select name="cat_id">

                    <option value="">选择分类</option>

                    <?php foreach ($catData as $k => $v): ?>

                    <option value="<?php echo $v['id']; ?>"><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></option>

                    <?php endforeach; ?>

                    </select>

                </td>

            </tr>

修改为:

<tr>

                <td class="label">扩展分类:<input type="button" onclick="$('#cat_list').append($('#cat_list').find('li').eq(0).clone());"    id="btn_add_cat" value="添加一个"/></td>

                <td >

                    <ul  id="cat_list"  >

                        <li>

                    <select name="ext_cat_id[]">

                    <option value="">选择分类</option>

                    <?php foreach ($catData as $k => $v): ?>

                    <option value="<?php echo $v['id']; ?>"><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></option>

                    <?php endforeach; ?>

                    </select>

                        </li>

                    </ul>


                </td>

            </tr>

如图所示:


第四步  在修改商品模型,在商品添加之后,获取商品的ID再接收表单中的扩展分类ID数组插入到分类表

protected function _after_insert($data,$option){

        $ecid=I('post.ext_cat_id');

        if($ecid)

        {

            $gcModel=D('goods_cat');

            foreach($ecid as $k=>$v){

                if(empty($v))

                    continue;

                $gcModel->add(array(

                    'cat_id'=>$v,

                    'goods_id'=>$data['id'],


                ));

            }


        }

第五步 在商品列表中再添加一列:“扩展分类名称”

修改商品模型search方法

public function search($perPage=5){

        //取出总的记录数

//echo 1;

//echo "<br/>";

        $count=$this->where($where)->count();

        //echo $count;

        ////搜索页

        $where=array();

        $gn=I('get.gn');

        if($gn) {

        $where['a.goods_name']=array('like',"%$gn%");}//

        $fp=I('get.fp');

        $tp=I('get.tp');

        if($fp&&$tp){

            $where['a.shop_price']=array('between',array($fp,$tp));

        }

        elseif ($fp) {

            $where['a.shop_price']=array('egt',$fp);


        }elseif ($tp) {

              $where['a.shop_price']=array('elt',$tp);

        }

        //添加时间

        $fa=I('get.fa');

        $ta=I('get.ta');

          if($fa && $ta){

            $where['a.addtime']=array('between',array($fa,$ta));

        }

        elseif ($fa) {

            $where['a.addtime']=array('egt',$fa);


        }elseif ($ta) {

              $where['a.addtime']=array('elt',$ta);

        }

        $brandId=I('get.brand_id');

        if($brandId){

        $where['a.brand_id']=array('eq',$brandId);}

        $catId=I('get.cat_id');

          if($catId){

              $catModel=D('category');

              $children=$catModel->getChildren($catId);

              $children[]=$catId;

            $where['a.cat_id']=array('IN',$children);

          }

        //是否上架

        $ios=I('get.ios');

        if($ios){


            $where['a.is_on_sale']=array('eq',$ios);

        }


        //生成翻页类的对象

        $pageObj=new \Think\Page($count,$perPage);

          $pageObj->setConfig('next','下一页');

                  $pageObj->setConfig('prev','上一页');

        //生成页面显示的上一页,下一页的字符串

        $pageString=$pageObj->show();

        /***************** 排序 *****************/

$orderby = 'a.id';      // 默认的排序字段

$orderway = 'desc';  // 默认的排序方式

$odby = I('get.odby');

if($odby)

{

if($odby == 'id_asc')

$orderway = 'asc';

elseif ($odby == 'price_desc')

$orderby = 'shop_price';

elseif ($odby == 'price_asc')

{

$orderby = 'shop_price';

$orderway = 'asc';

}

}




        //取数据

        $data=$this->order("$orderby $orderway")


              ->field('a.*,b.brand_name,c.cat_name,e.ext_cat_name')

              ->alias('a')

              // ->join('LEFT JOIN p39_brand b ON a.brand_id=b.id')

                ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id

                          LEFT JOIN __CATEGORY__ c ON a.cat_id=c.id

                          LEFT JOIN __GOODS_CAT__ d  ON a.id=d.goods_id

                          LEFT JOIN __CATEGORY__ e ON d.cat_id=e.id


')

                ->where($where)

                ->limit($pageObj->firstRow.','.$pageObj->listRows)

                ->select();

        // print_r($data);

        return array(

          'data'=>$data,

            'page'=>$pageString,

        );

    }

如图所示:


解决办法‘:

分组

$data=$this->order("$orderby $orderway")


              ->field('a.*,b.brand_name,c.cat_name,e.cat_name ext_cat_name')

              ->alias('a')

              // ->join('LEFT JOIN p39_brand b ON a.brand_id=b.id')

                ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id

                          LEFT JOIN __CATEGORY__ c ON a.cat_id=c.id

                          LEFT JOIN __GOODS_CAT__ d  ON a.id=d.goods_id

                          LEFT JOIN __CATEGORY__ e ON d.cat_id=e.id


')

                ->where($where)

                ->group('a.id')

                ->limit($pageObj->firstRow.','.$pageObj->listRows)

                ->select();



运用一个函数:

GROUP_CONCAT

$data=$this->order("$orderby $orderway")


              ->field('a.*,b.brand_name,c.cat_name,GROUP_CONCAT(e.cat_name) ext_cat_name')

              ->alias('a')

              // ->join('LEFT JOIN p39_brand b ON a.brand_id=b.id')

                ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id

                          LEFT JOIN __CATEGORY__ c ON a.cat_id=c.id

                          LEFT JOIN __GOODS_CAT__ d  ON a.id=d.goods_id

                          LEFT JOIN __CATEGORY__ e ON d.cat_id=e.id


')


扩展:

使用SEPARATOR

->field('a.*,b.brand_name,c.cat_name,GROUP_CONCAT(e.cat_name SEPARATOR "<br/>") ext_cat_name')


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容