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>
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With