标签:
商品扩展分类与商品
建表
 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>
先打印表单
/**
	 * 商品添加之后会调用这个方法,其中$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‘)
根据分类搜索商品时扩展分类下的商品也搜索出来
在商品模型中添加一个方法:根据分类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;
	}
		//主分类的搜索
		 $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,
            	  	 		  ));
            	  }
            }
标签:
原文地址:http://www.cnblogs.com/gooderic/p/5688311.html