Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Tree structure with codeigniter and mysql dynamically

I want to make a dynamic tree menu dynamically using codeigniter and mysql, I don't have any problems with css & jquery for tree structure.

I have two tables, table organization & organization class:

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

this is my function:

$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 />';?>

this is my model :

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;
    }

I just can make tree for organization_parent, and the result is like this:

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

and I want to make the result like this:

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

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

or the result will be like this if in 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>
like image 783
Abdul Ghanni Avatar asked Feb 11 '15 08:02

Abdul Ghanni


1 Answers

It would be helpful if see the $organization->result()

lets assume you using test function

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 is recursive function and it will work for any sub layers
hope it will help you.

like image 79
Shaiful Islam Avatar answered Oct 13 '22 10:10

Shaiful Islam