前端模板C层点击事件时,传入要删除的id数据:
<a href="#" onClick="warning('确实要删除吗', '{:url('del',array('id'=>$cate['id']))}')" class="btn btn-danger btn-sm shiny">
<i class="fa fa-trash-o"></i> 删除
</a>
删除分类:
public function del(){
$del=db('cate')->delete(input('id'));//删除的事单个id的分类
if($del){
$this->success('删除成功',url('lst'));
}else{
$this->error('删除失败');
}
}
不过由于有的分类具有多个子栏目的情况,所以要设置一个删除这个栏目下相应子栏目的方法,原理是获取 所要删除栏目下pid的值,循环获取所有这一pid栏目的id,删除这些id就实现了删除子栏目
控制器层要用到前置操作
可以为某个或者某些操作指定前置执行的操作方法,设置 beforeActionList属性可以指定某个方法为其他方法的前置操作,数组键名为需要调用的前置方法名,无值的话为当前控制器下所有方法的前置方法。
['except' => '方法名,方法名']
表示这些方法不使用前置方法,
['only' => '方法名,方法名']
表示只有这些方法使用前置方法。
根据官方解释,我们用only方法
protected $beforeActionList = [
//'first',
//'second' => ['except'=>'hello'],
'delsoncate' => ['only'=>'del'],//执行del方法前执行delsoncate方法
];
然后建立delsoncate方法
//删除子栏目
public function delsoncate(){
$cateid=input('id');//要删除的主id
$cate=new CateModel();
$sonids=$cate->getchilrenid($cateid);//$sonids子栏目id,getchilrenid方法在M层获得子栏目id的操作
if($sonids){
db('cate')->delete($sonids);//删除操作
}
}
根据上面getchilrenid($cateid)获取子栏目的方法,我们在M层中操作:
//根据删除栏目id获取该栏目下的所有子栏目id
public function getchilrenid($cateid){
//获取所有栏目id的方法
$cateres=$this->select();
return $this->_getchilrenid($cateres,$cateid);//传递栏目数据到_getchilrenid方法
}
public function _getchilrenid($cateres,$cateid){
static $arr=array();//静态化空数组
foreach($cateres as $k=>$v){//循环获得的所有数据
if($v['pid']==$cateid){//判断pid也就是上级栏目id等于栏目id,
$arr[]=$v['id'];//则把这一pid下的所有id存放到数组中,也就是获得所有子栏目
$this->_getchilrenid($cateres,$v['id']);//执行这个方法
}
}
return $arr;//返回数组数据,让控制器层使用
}