2015-02-11 6 views
5

Voglio creare dinamicamente un menu ad albero usando codeigniter e mysql, non ho problemi con css & jquery per struttura ad albero.Come rendere dinamicamente la struttura ad albero con codeigniter e mysql

ho due tavoli, organizzazione tavolo classe & organizzazione:

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

questa è la mia funzione:

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

questo è il mio modello:

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

ho appena può fare tree for organization_parent, e il risultato è come questo:

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

e voglio fare il risultato come questo:

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

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

o il risultato sarà come questo se 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> 
+0

Stai mettendo i dati in una struttura di array rilevante per la struttura ad albero prima? – Edward

+0

mi è stato aggiunto il mio modello, –

+0

Come suggerimento generale, in questo tipo di attività, è necessario definire una funzione che crea i nodi dell'albero e questa funzione, in modo condizionale, si chiama per aggiungere nodi figli. i.e 'function dTree() {// code; if (condition) {dTree();}}' La condizione sta per verificare se il nodo ha un figlio o meno. – SaidbakR

risposta

5

Sarebbe utile se vedere il $organization->result()

consente di assumere che si utilizza la funzione di test

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 è una funzione ricorsiva e funzionerà per tutti i sottolivelli
spero che ti possa aiutare.

+0

Grazie all'islam misericordioso, è quello che sto cercando, mi hai davvero aiutato :) –