商品扩展分类与商品
建表
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 '商品扩展分类';
- 在表单中添加扩展分类的下拉框
-
<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>
- 修改商品模型 ,在商品添加之后,获取商品的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'],
));
}
}
- 在商品列表中再添加一列:“扩展分类名称”
修改商品模型中的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')
根据分类搜索商品时扩展分类下的商品也搜索出来
- 修改商品模型中的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;
}
- 修改商品模型中的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();
修改--》
- 从添加的表单中把扩展分类的按钮复制过来
//取出扩展分类
$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>
- 提交表单之后,先清空原分类数据,然后把修改之后的当作新的添加一遍即可
直接复制添加时的添加分类的代码
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,
));
}
}