我想使用codeigniter和mysql动态地制作一个动态树菜单,我对css和amp;树结构的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>
如果能看到$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是递归函数,它适用于任何子层
希望它能帮助你。