首先数据库字段要有id 。。。。parentid这些字段
如何做出这个样子呢,这就需要递归,控制器里面的add方面应该这样写
public function add(){
$pri=D('Privilege');
if(IS_POST){
if($pri->create()){
if($pri->add()){
$this->success('新增权限成功',U('lst'));
}else{
$this->error('新增权限失败');
}
}else {
$this->error($pri->getError());
}
return ;
}
$pris=$pri->pritree();
// dump($pris);
// die;
$this->assign('pris',$pris);
$this->display();
}
$pris=$pri->pritree();
这个函数在model层面里面写
public function pritree(){
$data=$this->select();
// dump($data);
// die;
return $this->resort($data);
}
public function resort($data,$parentid=0,$level=0){
static $ret=array();
foreach($data as $k => $v){
if($v['parentid']==$parentid){
$v['level']=$level;
$ret[]=$v;
$this->resort($data,$v['id'],$level+1);
}
}
return $ret;
}
解释一下这两个函数是什么意思,第一个函数是找出改对象里面所有的数据
然后把数据传入递归函数里面,声明一个静态数组,循环语句
$v['parentid']
就是这个意思,找出等于0的子栏目,这些栏目都是顶级栏目,level代表是第几层,
然后存在ret这个数组里面,递归,最后返回这个数组,给add方法
$pris=$pri->pritree();
// dump($pris);
// die;
$this->assign('pris',$pris);
$this->display();
赋值给前台前台输出
<volist name="pris" id="vo">
<option value="{$vo.id}"><?php echo str_repeat('-',$vo['level']*2); ?>{$vo.priname}
</option>
</volist>
就能显示那种分层的感觉,str_repeat函数代表重复
前台这样展示
<volist name="pris" id="vo">
<tr>
<td class="tc"><input name="ids[]" class="check" value="{$vo.id}" type="checkbox"></td>
<td>{$vo.id}</td>
<td>
<a target="_blank" href="#" title="">
<if condition="$vo['level'] neq 0">
|</if>
<?php echo str_repeat('-',$vo['level']*2); ?>{$vo.priname}</a>
</td>
<td>{$vo.moname}</td>
<td>{$vo.coname}</td>
<td>{$vo.aname}</td>
<td>{$vo.parentid}</td>
<td>
<a class="link-update" href="__CONTROLLER__/edit/id/{$vo.id}">修改</a>
<a class="link-del" οnclick="return confirm('确定要删除本权限及其子权限吗?');" href="__CONTROLLER__/del/id/{$vo.id}">删除</a>
</td>
</tr>
</volist>
public function lst(){
$pri=D('Privilege');
$pris=$pri->pritree();
// dump($pris);
// die;
$this->assign('pris',$pris);
$this->display();
}
就这样无限级分类的添加算是完成了