第一种情况:这个要删除的分类其下有子分类,要删除先删除子分类先. 举个例子:顶级分类服装 其下有衣服 其下下还有耐克 如果要删除顶级分类服装咋整。 第一步:判断它是否为空。如果为空,代表什么都没做。不理会。 第一步:获取要删除的分类的id。 第三步:先找出无限极分类所有的分类,然后通过算法找到这个服装分类其下有没有子分类。有的话,返回服装所有的子分类回来。 第四步:转换成数组格式遍历下。遍历的作用就是删除服装其下的所有子类。 第五步:遍历删除完服装其下所有子类,在删除服装这个分类。
public function del($id=''){
//如果分类id是空,则跳转到列表页面
if ($id=='') {
$this->redirect('category/index');
}
//根据id找到当前的记录
$category = Db::name('Category')->find($id);
//先找出所有分类,再根据id循环
$categorys = Db::name('Category')->field('id,parent_id')->select();
$category_model = new Categorys();
$cateStr = $category_model->getChildrenIdStr($categorys,$id);
$cate_list=explode(',',$cateStr);
foreach ($cate_list as $k => $v) {
Db::name('category')->where('id',$v)->delete();
}
Db::name('category')->where('id',$id)->delete();
return redirect('index');
}
//由父类id得到全部子类,返回字符串
public function getChildrenIdStr($cate_list,$parent_id=0){
static $str='';
foreach ($cate_list as $k => $v) {//遍历无限极分类
if ($v['parent_id']==$parent_id) {//如果这个分类是顶级分类的话,
$str =$str.','.$v['id'];//就把其下的子类一次一次的遍历赋值给$str
$this->getChildrenIdStr($cate_list,$v['id']);//无线极分类所有的分类,服装下的子类(衣服)。$v['id']的意思是记住一句话。顶级分类的id(服装)等于其下的子类(衣服)的pid。
}
}
$str=ltrim($str,',');//去掉左边所有的空格,以逗号分隔
$str=rtrim($str,',');//去掉右边所有的空格,以逗号分隔
//print_r($str);
return $str;
}