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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.