A-A+
php 动态生成组织结构图
一个 php 动态生成组织结构图的类,比如我们公司的组织结构,总栽,总经理,IT部,客服部,业务部,这就属于一个组织结构,还有类似于这样的其它组织,利用这个 PHP 的类对象可以很好的生成一个组织机构的图形,更形象的进行展出出来,让大家一眼可以看出公司的一个组织人员状态。
这个类其实用得还不是很多,比如像企业站,我们基本上就可以直接用 PS 来画一个组织机构图了,那么对于 PHP 动态生成组织结构图,应该用在什么地方呢,我想可以放在一些比较大型的信息站上面,就像 B2B 类的网站,每个企业会员都有自己的公司黄页,如果要加企业的组织结构图,就可以用这个 php 动态生成组织结构类,每个单位的组织结构图都不一样,可以进行调用不同的参数生成不同的组织结构图,这也是 php 功能强大的体现之一。
<?php
//创建组织结构类
class getTree{
private $rootnodeid; //根节点联系人的nodeid
private $partleft = 5; //每个节点左边相对位置初始值
private $lastid = array(); //存放每层结构的最后一个节点
private $partroot = array(); //存放每个部门根节点
private $partson = array(); //存放parentid是部门根节点的节点
private $levelpt = array(); //存放有子节点的nodeid
//遍历org chart
public function displayChildren($resData, $parentid, $level){
foreach($resData['result'] as $list){
//如果parentid等于上一节点的uuid则是该uuid的子节点
if($list['parentid'] == $parentid){
//找出当前parntid的子uuid
$hasChild = $this->hasChild($resData['result'],$parentid);
$tempid = $hasChild[count($hasChild)-1];
//如果该节点的parentid是公司的uuid则该节点是root节点
if($list['parentid'] == $resData['comid']){
$this->rootnodeid = $list['nodeid'];
}else if($list['parentid'] == $this->rootnodeid){
//如果该节点的parentid是root节点的uuid则该节点是某部门的partroot节点
$this->lastid = array();
$this->levelpt = array();
$this->partroot[] = $list['nodeid'];
?>
<div class="section">
<div style="border:1px solid #333333; width:0
px; height:15px; margin-left: 120px;"></div>
<div id="<?php echo $list['nodeid']; ?>" cla
ss="part <?php echo $list['style']; ?>" style="margin-left:50px; m
argin-right:10px;">
<div class="photo">
<div class="plus" style="position:abs
olute; margin-left:28px;"><b style="color:red;">+</b></div>
<a href="javascript:;"><img title="<?php e
cho $list['name']; ?>" src="<?php echo $list['sma_picurl'];?>" alt="<?p
hp echo $list['name']; ?>"/></a>
</div>
<div class="info">
<div class="partment">
<div class="name"><?php echo $li
st['name']; ?></div>
<div class="name" style="float:right;">
<a name="color" href="javascrip
t:;"><img src="/joywok/public/images/contact/color.png"/></a>
<a name="del" href="javascrip
t:;"><img src="/joywok/public/images/contact/del.png"/></a>
<a name="add" href="javascrip
t:;"><img src="/joywok/public/images/contact/add.png"/></a>
</div>
</div>
<div class="detail">
<div class="name"><?php echo $li
st['dept']; ?></div>
<div class="name"><?php echo $li
st['post']; ?></div>
</div>
</div>
</div>
<?php
}else{
//把每个节点的parentid做记录
if($level > 2){
$this->levelpt[$level][$list['nodei
d']] = $list['parentid'];
}
//判断节点的parentid是不是部门根节点
if(in_array($list['parentid'], $this->partroot)){
$this->partson[] = $list['nodeid'];
}
//判断节点是不是该层最后一个节点
if($list['nodeid'] == $tempid){
$this->lastid[] = $list['nodeid'];
}
//画线:调用playLine()方法
$this->playLine($list['nodeid'], $list['node
id'], $level);
if($level == 2){
if(in_array($list['nodeid'],$this->lastid)){
echo '<div class='.$list['nodeid'].' na
me='.$list['nodeid'].' style="float:left; margin-left: 52px; margin-to
p:0px; width:40px; height:84px"><img alt="last" src="/joywok/public/i
mages/contact/lastline.png"/></div>';
}else {
echo '<div class='.$list['nodeid'].' na
me='.$list['nodeid'].' style="float:left; margin-left: 50px; margin-t
op:0px; width:40px; height:84px"><img alt="middle" src="/joywok/publi
c/images/contact/midline.png"/></div>';
}
}else if($level != 2){
if(in_array($list['nodeid'],$this->lastid) ){
echo '<div class='.$list['nodeid'].' nam
e='.$list['nodeid'].' style="float:left; margin-left: 2px; margin-to
p:0px; width:40px; height:84px"><img alt="last" src="/joywok/public/i
mages/contact/lastline.png"/></div>';
}else{
echo '<div class='.$list['nodeid'].' n
ame='.$list['nodeid'].' style="float:left; margin-left: 0px; margin-t
op:0px; width:40px; height:84px"><img alt="middle" src="/joywok/publi
c/images/contact/midline.png"/></div>';
}
}
?>
<div id="<?php echo $list['nodeid']; ?>" class="p
art <?php echo $list['style']; ?>" style="margin-top:40px; margin-lef
t:<?echo $this->partleft; ?>px; margin-right:10px;">
<div class="photo">
<div class="plus" style="position:absolut
e; margin-left:28px;"><b style="color:red;">+</b></div>
<a href="javascript:;"><img title="<?php ec
ho $level; ?>" src="<?php echo $list['sma_picurl'];?>" alt="<?php ech
o $list['name']; ?>"/></a>
</div>
<div class="info">
<div class="partment">
<div class="name"><?php echo $list['n
ame']; ?></div>
<div class="name" style="float:right;">
<a name="color" href="javascrip
t:;"><img src="/joywok/public/images/contact/color.png"/></a>
<a name="del" href="javascript:;"><img src="/joywok/public/images/contact/del.png"/></a>
<a name="add" href="javascript:;"><img src="/joywok/public/images/contact/add.png"/></a>
</div>
</div>
<div class="detail">
<div class="name"><?php echo $list['dept']; ?></div>
<div class="name"><?php echo $list['post']; ?></div>
</div>
</div>
</div>
<?php
}
$this->partleft += 45;
$this->displayChildren($resData, $list['nodeid'], $level+1);
$this->partleft -= 45;
//判断是否是一个部门的结束
if($list['parentid'] == $this->rootnodeid){
echo "</div>";
}
}
}
}
//找出当前parntid的子uuid
function hasChild($param,$parentid) {
$tempArr = array();
foreach($param as $list){
if($list['parentid'] == $parentid){
$tempArr[] = $list['nodeid'];
}
}
return $tempArr;
}
//递归画线
function playLine($uuid, $curid, $level){
if($level >= 3){
$this->playLine($uuid, $this->levelpt[$level][$curid], $l
evel-1);
if($level == 3 && in_array($this->levelpt[$level][$curi
d], $this->lastid)){
$level = $level-1;
echo '<div class="'.$uuid.'" name="'.$uuid.'" style="f
loat:left; margin-left:52px; margin-top:0px; width:40px; height:84px"></div>';
}else if($level == 3 && !in_array($this->levelpt[$level][$
curid], $this->lastid)){
$level = $level-1;
echo '<div class="'.$uuid.'" name="'.$uuid.'" style="f
loat:left; margin-left:52px; margin-top:0px; width:40px; height:84px"><i
mg alt="'.$level.'" src="/joywok/public/images/contact/line.png"/></div>';
}else if($level != 3 && in_array($this->levelpt[$level][$cu
rid], $this->lastid)){
$level = $level-1;
echo '<div class="'.$uuid.'" name="'.$uuid.'" style="flo
at:left; margin-left:2px; margin-top:0px; width:40px; height:84px"></div>';
}else if($level != 3 && !in_array($this->levelpt[$level][$c
urid], $this->lastid)){
$level = $level-1;
echo '<div class="'.$uuid.'" name="'.$uuid.'" style="fl
oat:left; margin-left:2px; margin-top:0px; width:40px; height:84px"><img a
lt="'.$level.'" src="/joywok/public/images/contact/line.png"/></div>';
}
}
}
}
?>