• 商品扩展分类与商品


    商品扩展分类与商品

        建表

     

    drop table if exists p40_goods_cat;
    create table p40_goods_cat
    (
    cat_id mediumint unsigned not null comment '分类Id',
    goods_id mediumint unsigned not null comment '商品Id',
    key cat_id(cat_id),
    key goods_id(goods_id)
    )engine=InnoDB default charset=utf8 comment '商品扩展分类';

    1. 在表单中添加扩展分类的下拉框
    2. <tr>
      <td class="label">扩展分类:<input onclick="$('#cat_list').append($('#cat_list').find('li').eq(0).clone());" type="button" 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>
      <tr>

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

    先打印表单

    /**
    * 商品添加之后会调用这个方法,其中$data['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'],

    ));
    }
    }

    1. 在商品列表中再添加一列:“扩展分类名称”

    修改商品模型中的search方法连表:

        

    /************** 取某一页的数据 ***************/
    /**
    * SELECT a.*,b.brand_name FROM p39_goods a LEFT JOIN p39_brand b ON a.brand_id=b.id
    */
    $data = $this->order("$orderby $orderway") // 排序
    ->field('a.*,b.brand_name,c.cat_name')
    ->alias('a')
    ->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();

    因为一个商品有多个分类,所以连表之后商品出现多份:

       解决办法

       分组

      

    ->where($where) // 搜索
    ->limit($pageObj->firstRow.','.$pageObj->listRows) // 翻页
    ->group('a.id')
    ->select();

    可以调用group_concat函数把同一组中的值拼到一起

     

    $data = $this->order("$orderby $orderway") // 排序
    ->field('a.*,b.brand_name,c.cat_name,GROUP_CONCAT(e.cat_name) ext_cat_name')

    GRUOP_CONCAT默认使用,连接 可以用别用的:

    $data = $this->order("$orderby $orderway") // 排序
    ->field('a.*,b.brand_name,c.cat_name,GROUP_CONCAT(e.cat_name SEPARATOR "<br/>") ext_cat_name')
    ->alias('a')

    根据分类搜索商品时扩展分类下的商品也搜索出来

     

    1. 修改商品模型中的search方法把分类搜索再添加上扩展分类的代码

     

     

    在商品模型中添加一个方法:根据分类ID搜索分类下所有的商品ID【考虑扩展分类和主分类】

      

     

    /**
    * 取出一个分类下所有商品的ID[即考虑主分类也考虑了扩展分类】
    *
    * @param unknown_type $catId
    */
    public function getGoodsIdByCatId($catId)
    {
    // 先取出所有子分类的ID
    $catModel = D('category');
    $children = $catModel->getChildren($catId);
    // 和子分类放一起
    $children[] = $catId;
    /*************** 取出主分类或者扩展分类在这些分类中的商品 ****************/
    // 取出主分类下的商品ID
    $gids = $this->field('id')->where(array(
    'cat_id' => array('in', $children),
    ))->select();
    // 取出扩展分类下的商品的ID
    $gcModel = D('goods_cat');
    $gids1 = $gcModel->field('DISTINCT goods_id id')->where(array(
    'cat_id' => array('IN', $children)
    ))->select();
    // 把主分类的ID和扩展分类下的商品ID合并成一个二维数组【两个都不为空时合并,否则取出不为空的数组】
    if($gids && $gids1)
    $gids = array_merge($gids, $gids1);
    elseif ($gids1)
    $gids = $gids1;
    // 二维转一维并去重
    $id = array();
    foreach ($gids as $k => $v)
    {
    if(!in_array($v['id'], $id))
    $id[] = $v['id'];
    }
    return $id;
    }

    1. 修改商品模型中的search方法实际这个方法来搜索商品


    //主分类的搜索
    $catId=I('get.cat_id');
    if($catId)
    {
    //先取出所有子分类的ID

    $gids=$this->getGoodsIdByCatId($catId);

    //搜索所有这些分类下的商品
    $where['a.cat_id']= array('IN',$gids);
    }

    商品分类的修改与删除

     

     

    删除----》  删除商品时,扩展分类表中相关的数据也一起删除

        


    protected function _before_delete($option)
    {
    $id = $option['where']['id']; // 要删除的商品的ID

     

    /************** 删除扩展分类 ********************/
    $gcModel=D('goods_cat');
    $gcModel->where(array(
    'goods_id'=>array('eq',$id),
    ))->delete();

    修改--

    1. 从添加的表单中把扩展分类的按钮复制过来

       


    //取出扩展分类

    $gcModel =D('goods_cat');

    $gcData = $gcModel->field('cat_id')->where(array(
    'goods_id' => array('eq', $id),
    ))->select();



    // 设置页面信息
    $this->assign(array(
    'gcData'=>$gcData,

    在表单中循环输出  

    还要考虑如果没有原分类时默认输出一个下拉框

       

    <tr>
    <td class="label">扩展分类:<input onclick="$('#cat_list').append($('#cat_list').find('li').eq(0).clone());" type="button" id="btn_add_cat" value="添加一个" /></td>
    <td>
    <ul id="cat_list">
    <!-- 如果有原分类就循环输出,否则默认输出一个下拉框 -->
    <?php if($gcData): ?>
    <?php foreach ($gcData as $k1 => $v1): ?>
    <li>
    <select name="ext_cat_id[]">
    <option value="">选择分类</option>
    <?php foreach ($catData as $k => $v):
    if($v['id'] == $v1['cat_id'])
    $select = 'selected="selected"';
    else
    $select = '';
    ?>
    <option <?php echo $select; ?> value="<?php echo $v['id']; ?>"><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></option>
    <?php endforeach; ?>
    </select>
    </li>
    <?php endforeach; ?>
    <?php else: ?>
    <li>
    <select name="ext_cat_id[]">
    <option value="">选择分类</option>
    <?php foreach ($catData as $k => $v): ?>
    <option <?php echo $select; ?> value="<?php echo $v['id']; ?>"><?php echo str_repeat('-', 8*$v['level']) . $v['cat_name']; ?></option>
    <?php endforeach; ?>
    </select>
    </li>
    <?php endif; ?>
    </ul>
    <span style="color:#F00;font-size:16px;font-weight:bold;">如果要删除某个分类请设置为“选择分类”即可!</span>
    </td>
    </tr>

    1. 提交表单之后,先清空原分类数据,然后把修改之后的当作新的添加一遍即可

     直接复制添加时的添加分类的代码

    protected function _before_update(&$data, $option)
    {
    $id = $option['where']['id']; // 要修改的商品的ID


    /************ 处理扩展分类 *****************/
    $ecid=I('post.ext_cat_id');
    $gcModel=D('goods_cat');

    //先删除原分类数据
    $gcModel->where(array(
    'goods_id'=>array('eq',$id),

    ))->select();
    if($ecid)
    {
    $gcModel=D('goods_cat');
    foreach($ecid as $k =>$v)
    {
    if(empty($v))
    continue;
    $gcModel->add(array(
    'cat_id'=>$v,
    'goods_id'=>$id,

    ));
    }
    }

     

     

     

     

    世上无难事,只怕有心人......
  • 相关阅读:
    php DOC类型注释的用法
    Mysql 数据库更新错误
    Smarty初体验二 获取配置信息
    Smarty 模板初体验
    去网络视频广告方法——虽过时,但效果依然很好(亲测)
    织梦模板修改方法大全
    dede织梦:文章内容页调用
    织梦系统学习:文章页当前位置的写法(自认对SEO有用)
    ZOJ 3229 Shoot the Bullet
    URAL 1277 Cops and Thieves
  • 原文地址:https://www.cnblogs.com/gooderic/p/5688311.html
Copyright © 2020-2023  润新知