如何使用codeigniter和mysql动态生成树结构

问题描述:

我想使用codeigniter和mysql动态创建一个动态树形菜单,我没有任何问题,用于树结构的jQuery的jQuery的&。如何使用codeigniter和mysql动态生成树结构

我有两个表,表组织&组织类:

(id, parent_org_id, org_class_id, title) 
(1,  0,    1,   Company Name) 
(2,  0,    1,   Company2 Name) 
(3,  1,    2,   Departement Name) 
(4,  2,    2,   Departement2 Name) 
(5,  4,    3,   Division2 Name) 

(id,  org_class_title, order_no) 
(1,  0,    1) 
(2,  0,    2) 
(3,  1,    3) 

这是我的函数:

$str =''; 
$lastListLevel=0; 
$firstRow=true; 

foreach($organization->result() as $row){ 
    $currentListLevel=$row->parent_organization_id -1 ; // minus one to correct level to Level 0 
    $differenceLevel=$currentListLevel-$lastListLevel; 

    $rootLevel=false; 

    if($differenceLevel==0){   
     if($firstRow){ 
      $firstRow=false; 
     }else{ 
      $str .='</li>'; 
     } 
     $str .='<li>'; 
    }elseif($differenceLevel>0){  
     for($j=0;$j<$differenceLevel;$j++){ 
      $str .='<ul><li>'; 
     } 
    }elseif($differenceLevel<0){  
     for($j=$differenceLevel;$j<=0;$j++){ 
      if($j==0){ // root level reached 
       $rootLevel=true; 
       $str .='</li>'; 
      }else{ 
       $str .='</li></ul>'; 
      } 
     } 
     $str .= ($rootLevel) ? '<li>' : '<ul>'; 
    } 
    $str.='<span><i class="icon-minus-sign"></i>'.$row->parent_organization_id.'-'.$row->organization_class_id.'-'.$row->id.'--'.$row->title.'--'.$row->organization_class.'</span>'.'<button type="button" class="btn btn-info btn-small" data-toggle="modal" data-target="#editorganizationModal'.$row->id.'"><i class="icon-paste"></i></button>';?> 

    <?php 
    $lastListLevel=$currentListLevel; 

}echo $str.'<br>Lowest organization level. Please define new lower level to add.<br />';?> 

这是我的模型:

function getOrganization(){ 
     $this->db->select('organization.*, organization.id as id, parent.id as parent_id, parent.title as organization_parent, organization_class.title as organization_class, organization.title as title'); 
     $this->db->from('organization'); 
     $this->db->join('organization_class', 'organization.organization_class_id = organization_class.id', 'left'); 
     $this->db->join('organization as parent', 'organization.parent_organization_id = parent.id', 'left'); 
     $this->db->order_by('organization.organization_class_id', 'asc'); 
     $query = $this->db->get(); 
     return $query; 
    } 

我正好可以弥补树为organization_parent,结果是这样的:

-- Company Name - Company 
-- Company Name 2 - Company 
       --Departement Name - Departement 
       --Departement2 Name - Departement 
         --Division Name2 - Division 

,我想使结果是这样的:

-- Company Name - Company 
    --Departement Name - Departement 

-- Company Name2 - Company 
    --Departement2 Name - Departement 
     --Division2 Name - Division 

或结果会是这样,如果在HTML:

<ul> 
    <li>Company Name - Company 
     <ul> 
      <li>Departement Name - Departement</li> 
     </ul> 
    </li> 

    <li>Company Name2 - Company 
     <ul> 
      <li>Departement Name2 - Departement 
       <ul> 
        <li>Divison Name2 - Division</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 
+0

您是否将数据放入与您的树结构相关的数组结构中? – Edward 2015-02-11 09:18:10

+0

我已经添加了我的模型, – 2015-02-11 09:28:38

+0

作为一般提示,在这类任务中,您必须定义一个创建树节点的函数,并有条件地调用它自己以添加子节点。即函数dTree(){//代码; if(条件){dTree();}}'该条件即将检查节点是否有子节点。 – SaidbakR 2015-02-11 09:38:31

请将看到$organization->result()是有帮助

让我们假设你使用测试功能

public function test()//may be index() or something else.Rename this funciton name as yours 
{ 
    //other codes getting data from model 
    $results=$organization->result();//capture the query data inside $results variable 
    $menu=$this->get_menu($results,0); //get_menu() function is bellow 
    //$menu will contain your ul li structure 
    //send it to view or echo 
} 

public function get_menu($results,$parent_id) 
{ 
    $menu='<ul>'; 

    for($i=0;$i<sizeof($results);$i++) 
    { 
     if($results[$i]->parent_id==$parent_id) 
     { 
      if($this->has_child($results,$results[$i]->id)) 
      { 
       $sub_menu= $this->get_menu($results,$results[$i]->id); 
       $menu.='<li>'.$results[$i]->title.'-'.$results[$i]->organization_class.$sub_menu.'</li>'; 
      } 
      else 
      { 
       $menu.='<li>'.$results[$i]->title.'-'.$results[$i]->organization_class.'</li>'; 
      } 
     } 
    } 
    $menu.='</ul>'; 
    return $menu; 
} 
public function has_child($results,$id) 
{ 
    for($i=0;$i<sizeof($results);$i++) 
    { 
     if($results[$i]->parent_id==$id) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

get_menu是递归函数,它将适用于任何子层
希望它能帮助你。

+0

谢谢shaiful伊斯兰教,这是我寻找的东西,你真的帮我:) – 2015-02-12 00:13:00