当前位置:首页 > PHP教程 > php高级应用 > 列表

ComboTree中的会计科目树形菜单实现方法

发布:smiling 来源: PHP粉丝网  添加日期:2018-11-02 20:14:46 浏览: 评论:0 

假设数据库中会计科目数据表的字段为:id,code,name,islast。分别为自增主键,科目编码,科目名称,是否为末级("1"表示末级科目)。

这里在Thinkphp的模型层中使用递归来构建ComboTree所需的数据,代码及注解如下:

  1. namespace Home\Model; 
  2. use Think\Model; 
  3.   
  4. class AccountModel extends Model{ 
  5.   
  6.   publicfunctiongetTreeList(){  
  7.   $data = $this->field('id,code,name,islast')->select(); 
  8.   foreach($data as &$v){       //这里加入了元素pid,用来标识父级id的    
  9.    $len = strlen($v['code']); 
  10.    if($len == 3){          //这里假设长度为3位的科目编码是一级,5位为二级科目,7位为三级,以此类推 
  11.     $v['pid'] = 0; 
  12.    }else
  13.     $v['pid'] = substr($v['code'],0,$len-2); 
  14.    }  
  15.   } 
  16.   return$this->createTree($data);//生成ComboTree所需的数据结构 
  17.  } 
  18.    
  19.  //递归的方式生成子树 
  20.  privatefunctioncreateSubTree($data,$pid){ 
  21.   $tree = array(); 
  22.   foreach($data as $k=>$v){ 
  23.    if($v['pid'] == $pid){ 
  24.     $newDate = array
  25.      'id'=> $v['id'], 
  26.      'text'=>$v['name'], 
  27.      'state'=>($v['islast'] != 1)?'closed':'open' 
  28.     ); 
  29.     if($v['islast'] != 1){        //如果不是末级科目调用自身生成子数据 
  30.      $subData = $this->createSubTree($data,$v['code']); 
  31.      if(!emptyempty($subData)){ 
  32.       $newDate['children'] = $subData;  
  33.      } 
  34.     } 
  35.     array_push($tree,$newDate); 
  36.    }   
  37.   } 
  38.   return$tree
  39.  } 
  40.    
  41.  //生成树,先从一级会计科目分类开始创建树形菜单数据 
  42.  privatefunctioncreateTree($data){  
  43.   $ret = array(); 
  44.   foreach($data as $k => $v){ 
  45.    if($v['pid'] == 0){ 
  46.     $newDate = array//创建为ComboTree能够识别的格式,这里我没有更好的办法了,只能这样处理 
  47.      'id'=> $v['id'], 
  48.      'text'=>$v['name'], 
  49.      'state'=>'closed' 
  50.     ); 
  51.     $subData = $this->createSubTree($data,$v['code']); 
  52.     if(!emptyempty($subData)){ 
  53.      $newDate['children'] = $subData;  
  54.     } //phpfensi.com 
  55.     $ret[] = $newDate
  56.    }    
  57.   } 
  58.   return$ret
  59.  }  

类似上述的数据(如部门,地区等)需要构建树形菜单的简单修改代码后基本都能实现类似功能。

Tags: ComboTree 树形菜单

分享到: