2015-02-11 21 views
5

Dinamik bir ağaç menüsü oluşturmak için dinamik olarak codeigniter ve mysql kullanarak, ağaç yapısı için css & jquery ile ilgili herhangi bir sorunum yok.Kod yapısı ve mysql ile ağaç yapısını dinamik olarak oluşturma

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

Sadece yapabilirsiniz: Bu benim modeli

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

şudur: Bu benim işlevi

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

geçerli:

İki tablo, masa organizasyonu & organizasyon sınıfı var organization_parent için ağaç ve sonuç şöyle:

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

ve böyle bir sonuç yapmak istiyorum:

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

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

veya HTML eğer sonuç böyle olacaktır: $organization->result() görürseniz

<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> 
+0

Verileri ilk önce ağaç yapınızla ilgili bir dizi yapısına mı koyuyorsunuz? – Edward

+0

Modelimi ekledim, –

+0

Genel bir ipucu olarak, bu tür görevlerde, ağaç düğümlerini oluşturan bir işlevi tanımlamanız gerekir ve bu işlev, koşullu olarak, çocuk düğümü eklemek için kendisini çağırır. i.e 'fonksiyonu dTree() {// code; if (koşul) {dTree();}}' Durum, düğümün bir çocuğu olup olmadığını kontrol etmek üzere. – SaidbakR

cevap

5

yararlı olacaktır

, sınama işlevini kullanmış olduğunuz varsayılmaktadır

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 özyinelemeli bir işlevdir ve herhangi bir alt katman için çalışacaktır
size yardımcı olacaktır umarım.

+0

Çok şükür İslam, aradığım şey, gerçekten bana yardım ettim :) –