$value) { if($value['level'] == 1) $this->get_cat_tree($value['id']); } /* foreach ($goods_category2 AS $key => $value) { $strpad_count = $value['level']*10; echo str_pad('',$strpad_count,"-",STR_PAD_LEFT); echo $value['name']; echo "
"; }*/ return $goods_category2; } /** * 获取指定id下的 所有分类 * @global type $goods_category 所有商品分类 * @param type $id 当前显示的 菜单id * @return 返回数组 Description */ public function get_cat_tree($id) { global $goods_category, $goods_category2; $goods_category2[$id] = $goods_category[$id]; foreach ($goods_category AS $key => $value){ if($value['parent_id'] == $id) { $this->get_cat_tree($value['id']); $goods_category2[$id]['have_son'] = 1; // 还有下级 } } } /** * 移除指定$parent_id_path 分类以及下的所有分类 * @global type $cat_list 所有商品分类 * @param type $parent_id_path 指定的id * @return 返回数组 Description */ public function remove_cat($cat_list,$parent_id_path) { foreach ($cat_list AS $key => $value){ if(strstr($value['parent_id_path'],$parent_id_path)) { unset($cat_list[$value['id']]); } } return $cat_list; } /** * 改变或者添加分类时 需要修改他下面的 parent_id_path 和 level * @global type $cat_list 所有商品分类 * @param type $parent_id_path 指定的id * @return 返回数组 Description */ public function refresh_cat($id) { $GoodsCategory = M("GoodsCategory"); // 实例化User对象 $cat = $GoodsCategory->where("id", $id)->find(); // 找出他自己 // 刚新增的分类先把它的值重置一下 if($cat['parent_id_path'] == '') { ($cat['parent_id'] == 0) && DB::execute("UPDATE __PREFIX__goods_category set parent_id_path = '0_$id', level = 1 where id = :id",['id'=>$id]); // 如果是一级分类 DB::execute("UPDATE __PREFIX__goods_category AS a ,__PREFIX__goods_category AS b SET a.parent_id_path = CONCAT_WS('_',b.parent_id_path,'$id'),a.level = (b.level+1) WHERE a.parent_id=b.id AND a.id = :id",['id'=>$id]); $cat = $GoodsCategory->where("id", $id)->find(); // 从新找出他自己 } if($cat['parent_id'] == 0) //有可能是顶级分类 他没有老爸 { $parent_cat['parent_id_path'] = '0'; $parent_cat['level'] = 0; } else{ $parent_cat = $GoodsCategory->where("id", $cat['parent_id'])->find(); // 找出他老爸的parent_id_path } $replace_level = $cat['level'] - ($parent_cat['level'] + 1); // 看看他 相比原来的等级 升级了多少 ($parent_cat['level'] + 1) 他老爸等级加一 就是他现在要改的等级 $replace_str = $parent_cat['parent_id_path'].'_'.$id; DB::execute("UPDATE `__PREFIX__goods_category` SET parent_id_path = REPLACE(parent_id_path,'{$cat['parent_id_path']}','$replace_str'), level = (level - $replace_level) WHERE parent_id_path LIKE '{$cat['parent_id_path']}%'"); } /** * 动态获取商品属性输入框 根据不同的数据返回不同的输入框类型 * @param int $goods_id 商品id * @param int $type_id 商品属性类型id */ public function getAttrInput($goods_id,$type_id) { header("Content-type: text/html; charset=utf-8"); $GoodsAttribute = D('GoodsAttribute'); $attributeList = $GoodsAttribute->where("type_id", $type_id)->select(); foreach($attributeList as $key => $val) { $curAttrVal = $this->getGoodsAttrVal(NULL,$goods_id, $val['attr_id']); //促使他 循环 if(count($curAttrVal) == 0) $curAttrVal[] = array('goods_attr_id' =>'','goods_id' => '','attr_id' => '','attr_value' => '','attr_price' => ''); foreach($curAttrVal as $k =>$v) { $str .= ""; $addDelAttr = ''; // 加减符号 // 单选属性 或者 复选属性 if($val['attr_type'] == 1 || $val['attr_type'] == 2) { if($k == 0) $addDelAttr .= "[+]  "; else $addDelAttr .= "[-]  "; } $str .= "$addDelAttr {$val['attr_name']} "; // if($v['goods_attr_id'] > 0) //tp_goods_attr 表id // $str .= ""; // 手工录入 if($val['attr_input_type'] == 0) { $str .= ""; } // 从下面的列表中选择(一行代表一个可选值) if($val['attr_input_type'] == 1) { $str .= ""; //$str .= "属性价格"; } // 多行文本框 if($val['attr_input_type'] == 2) { $str .= ""; //$str .= "属性价格"; } $str .= ""; //$str .= "
"; } } return $str; } /** * 获取 tp_goods_attr 表中指定 goods_id 指定 attr_id 或者 指定 goods_attr_id 的值 可是字符串 可是数组 * @param int $goods_attr_id tp_goods_attr表id * @param int $goods_id 商品id * @param int $attr_id 商品属性id * @return array 返回数组 */ public function getGoodsAttrVal($goods_attr_id = 0 ,$goods_id = 0, $attr_id = 0) { $GoodsAttr = D('GoodsAttr'); if($goods_attr_id > 0) return $GoodsAttr->where("goods_attr_id", $goods_attr_id)->select(); if($goods_id > 0 && $attr_id > 0) return $GoodsAttr->where(['goods_id'=>$goods_id,'attr_id'=>$attr_id])->select(); } /** * 给指定商品添加属性 或修改属性 更新到 tp_goods_attr * @param int $goods_id 商品id * @param int $goods_type 商品类型id */ public function saveGoodsAttr($goods_id,$goods_type) { $GoodsAttr = D('GoodsAttr'); $Goods = M("Goods"); $old_goods_type = $Goods->where('goods_id', $goods_id)->getField('goods_type'); // 属性类型被更改了 就先删除以前的属性类型 或者没有属性 则删除 if(($goods_type == 0) || ($goods_type != $old_goods_type)) { $GoodsAttr->where('goods_id', $goods_id)->delete(); return; } $GoodsAttrList = $GoodsAttr->where('goods_id', $goods_id)->select(); $old_goods_attr = array(); // 数据库中的的属性 以 attr_id _ 和值的 组合为键名 foreach($GoodsAttrList as $k => $v) { $old_goods_attr[$v['attr_id'].'_'.$v['attr_value']] = $v; } file_put_contents("c.html", print_r($old_goods_attr,true)); $str = print_r($_POST,true); file_put_contents("a.html", $str); // post 提交的属性 以 attr_id _ 和值的 组合为键名 $post_goods_attr = array(); foreach($_POST as $k => $v) { $attr_id = str_replace('attr_','',$k); if(!strstr($k, 'attr_') || strstr($k, 'attr_price_')) continue; foreach ($v as $k2 => $v2) { if(empty($v2)) continue; // $tmp_key = $attr_id."_".$v2; $attr_price = $_POST["attr_price_$attr_id"][$k2]; $attr_price = $attr_price ? $attr_price : 0; if(array_key_exists($tmp_key , $old_goods_attr)) // 如果这个属性 原来就存在 { if($old_goods_attr[$tmp_key]['attr_price'] != $attr_price) // 并且价格不一样 就做更新处理 { $goods_attr_id = $old_goods_attr[$tmp_key]['goods_attr_id']; $GoodsAttr->where('goods_attr_id', $goods_attr_id)->save(array('attr_price'=>$attr_price)); } } else // 否则这个属性 数据库中不存在 说明要做删除操作 { $GoodsAttr->add(array('goods_id'=>$goods_id,'attr_id'=>$attr_id,'attr_value'=>$v2,'attr_price'=>$attr_price)); } unset($old_goods_attr[$tmp_key]); } } //file_put_contents("b.html", print_r($post_goods_attr,true)); // 没有被 unset($old_goods_attr[$tmp_key]); 掉是 说明 数据库中存在 表单中没有提交过来则要删除操作 foreach($old_goods_attr as $k => $v) { $GoodsAttr->where('goods_attr_id', $v['goods_attr_id'])->delete(); // } } /** * 获取 tp_spec_item表 指定规格id的 规格项 * @param int $spec_id 规格id * @return array 返回数组 */ public function getSpecItem($spec_id) { $model = M('SpecItem'); $arr = $model->where('spec_id', $spec_id)->select(); $arr = get_id_val($arr, 'id','item'); return $arr; } /** * 获取 规格的 笛卡尔积 * @param $goods_id 商品 id * @param $spec_arr 笛卡尔积 * @return string 返回表格字符串 */ public function getSpecInput($goods_id, $spec_arr) { // /*$spec_arr = array( 20 => array('7','8','9'), 10=>array('1','2'), 1 => array('3','4'), ); */ // 排序 foreach ($spec_arr as $k => $v) { $spec_arr_sort[$k] = count($v); } asort($spec_arr_sort); foreach ($spec_arr_sort as $key =>$val) { $spec_arr2[$key] = $spec_arr[$key]; } $clo_name = array_keys($spec_arr2); $spec_arr2 = combineDika($spec_arr2); // 获取 规格的 笛卡尔积 $spec = M('Spec')->getField('id,name'); // 规格表 $specItem = M('SpecItem')->getField('id,item');//规格项 $keySpecGoodsPrice = M('SpecGoodsPrice')->where('goods_id', $goods_id)->getField('key,key_name,price,store_count,sku');//规格项 $str = ""; $str .=""; // 显示第一行的数据 foreach ($clo_name as $k => $v) { $str .=" "; } $str .=""; // 显示第二行开始 foreach ($spec_arr2 as $k => $v) { $str .=""; $item_key_name = array(); foreach($v as $k2 => $v2) { $str .=""; $item_key_name[$v2] = $specItem[$v2]; } ksort($item_key_name); $item_key = implode('_', array_keys($item_key_name)); $item_name = implode('_', $item_key_name); $str .=""; $str .=""; $str .=""; $str .=""; } $str .= "
{$spec[$v]}价格 库存 SKU
$specItem[$v2]
"; return $str; } }