假設(shè)數(shù)據(jù)庫(kù)中會(huì)計(jì)科目數(shù)據(jù)表的字段為:id,code,name,islast。分別為自增主鍵,科目編碼,科目名稱(chēng),是否為末級(jí)("1"表示末級(jí)科目)。
這里在Thinkphp的模型層中使用遞歸來(lái)構(gòu)建ComboTree所需的數(shù)據(jù),代碼及注解如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
namespace Home\Model; use Think\Model; class AccountModel extends Model{ public function getTreeList(){ $data = $ this ->field( 'id,code,name,islast' )->select(); foreach($data as &$v){ //這里加入了元素pid,用來(lái)標(biāo)識(shí)父級(jí)id的 $len = strlen($v[ 'code' ]); if ($len == 3){ //這里假設(shè)長(zhǎng)度為3位的科目編碼是一級(jí),5位為二級(jí)科目,7位為三級(jí),以此類(lèi)推 $v[ 'pid' ] = 0; } else { $v[ 'pid' ] = substr($v[ 'code' ],0,$len-2); } } return $ this ->createTree($data); //生成ComboTree所需的數(shù)據(jù)結(jié)構(gòu) } //遞歸的方式生成子樹(shù) private function createSubTree($data,$pid){ $tree = array(); foreach($data as $k=>$v){ if ($v[ 'pid' ] == $pid){ $newDate = array( 'id' => $v[ 'id' ], 'text' =>$v[ 'name' ], 'state' =>($v[ 'islast' ] != 1)? 'closed' : 'open' ); if ($v[ 'islast' ] != 1){ //如果不是末級(jí)科目調(diào)用自身生成子數(shù)據(jù) $subData = $ this ->createSubTree($data,$v[ 'code' ]); if (!empty($subData)){ $newDate[ 'children' ] = $subData; } } array_push($tree,$newDate); } } return $tree; } //生成樹(shù),先從一級(jí)會(huì)計(jì)科目分類(lèi)開(kāi)始創(chuàng)建樹(shù)形菜單數(shù)據(jù) private function createTree($data){ $ret = array(); foreach($data as $k => $v){ if ($v[ 'pid' ] == 0){ $newDate = array( //創(chuàng)建為ComboTree能夠識(shí)別的格式,這里我沒(méi)有更好的辦法了,只能這樣處理 'id' => $v[ 'id' ], 'text' =>$v[ 'name' ], 'state' => 'closed' ); $subData = $ this ->createSubTree($data,$v[ 'code' ]); if (!empty($subData)){ $newDate[ 'children' ] = $subData; } $ret[] = $newDate; } } return $ret; } } |
類(lèi)似上述的數(shù)據(jù)(如部門(mén),地區(qū)等)需要構(gòu)建樹(shù)形菜單的簡(jiǎn)單修改代碼后基本都能實(shí)現(xiàn)類(lèi)似功能。
以上這篇ThinkPHP+EasyUI之ComboTree中的會(huì)計(jì)科目樹(shù)形菜單實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。