如何动态地使用codeigniter和mysql制作树结构

时间:2015-02-11 08:59:01

标签: php mysql codeigniter

我想使用codeigniter和mysql动态创建动态树菜单,我对css&没有任何问题。树结构的jquery。

我有两张桌子,桌子组织&组织班:

(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>

1 个答案:

答案 0 :(得分:5)

如果看到$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是递归函数,它适用于任何子图层 希望它会对你有所帮助。