Foro

Ayuda en treepanel, children.

0
Buenas, tengo un treepanel que se conecta mediante mysql para el menu dinamico, el problema esta en que solo puede tener un padre con hijos y lo que quisiera hacer es el hijo tambien pueda tener otro menu. Ojala puedan entender lo que necesito y ayudarme. Gracias, aqui una muestra del codigo.
class Inicio extends CI_Controller{
    
    public function __construct(){
        parent::__construct();

        /*-- Cargamos Funciones asistentes de CodeIgniter --*/
        $this->load->helper( array('html','url') );
            
    }
    
    /* Funcion por defecto del controlador actual */
    function index()
    {
    
        
        if($this->session->userdata('logged_in'))
        {
          $session_data = $this->session->userdata('logged_in');
          $data['username'] = $session_data['username'];
          $this->load->view('header', $data);
         
        }
        else
        {
          //De los contrario si no hay session regresamos al Login
          redirect('login', 'refresh');
        }
        
            
    }
    
    
        
    function logout()
   {
        $this->session->unset_userdata('logged_in');
        session_destroy();
        redirect('inicio');
        
   }
   
  
  //Building the menu..Creando el Menu
  function menuMain()
    {
        $session_data = $this->session->userdata('logged_in');
        $data['username'] = $session_data['username'];
        $username=$session_data['username'];
        $this->db->select('permissions.Menu_id as menuId');
        $this->db->from('permissions');
        $this->db->join('users','permissions.Group_id=users.grupoId');
        $this->db->join('menu','permissions.Menu_id = menu.id');
        $this->db->where('users.username',$username);
        $resultdb  = $this->db->get();
        $folder = array();
        
        if($resultdb->num_rows()!=0){
            $in = '(';

            /* fetch associative array */
            foreach($resultdb->result_array() as $user){
                $in .=  $user['menuId'] . ",";
            }
            $in = substr($in, 0, -1).')' ;
                    
            /* free result set */
            $resultdb->free_result(); 
                   
            $resultdb = $this->db->query("SELECT * FROM MENU WHERE parent_id IS NULL AND id in". $in);
                        
            if ($resultdb->result_array()!=0) {
                foreach($resultdb->result_array() as $r){                    
                    
                    $sqlquery=$this->db->query("SELECT * FROM MENU WHERE parent_id=".$r['id']. " AND id in". $in);
                    // check if have a child node
                    if ($nodes = $sqlquery) {
                    
                        // determine number of rows result set
                        $count = $nodes->num_rows();
                                        
                        if ($count > 0){

                            // if have a child
                            $r['leaf'] = false;

                            $r['items'] = array();

                            foreach($nodes->result_array() as $item){
                                $item['leaf'] = true;
                                $r['items'][] = $item;
                            }

                        } else {
                            // if have no child
                            $r['leaf'] = true;
                        }
                        $folder[] = $r;
                        
                    }    

                }
            
            
            }
        
        }
        
        echo json_encode(array(
            "items" => $folder
        ));    
       
    
    }
    
}

 



0
Creo que debes mejorar tu query a la base de datos, ahora mismo estas haciendo demasiados ya que las consultas las tienes dentro de un loop. Te dejo un ejemplo de un query semejante, que construye un menu basado en roles y privilegios.

https://github.com/crysfel/Bleextop/blob/master/application/models/applicationdao.php#L7

Ese query básicamente me regresa todas las opciones del menu que el usuario tiene acceso, fijate que están agrupadas y ordenadas por el parent_id, al ordenarlas por el parent_id me permitirá tener al principio a los padres y luego a los hijos, esto me facilitará crear el árbol a partir de una lista. Por ejemplo, sí sería el resultado del query.

id  parent_id name
1   null          Catálogos
2   null          Informes
3   1              Alumnos
4   1              Maestros
5   2              Ventas
6   2              Compras
7   3              Egresados
8   3              Nuevo Ingreso

Una vez que tengo esa lista crear el árbol del menu es sencillo, porque en primer lugar están los nodos padres y los nodos hijos están posteriormente.

Para crear el árbol tengo esta clase que me permite hacerlo fácilmente: https://github.com/crysfel/Bleextop/blob/master/application/libraries/Tree.php

Lo único que hago es usar el método addChild, que recibe como parámetro un registro del listado que tengo y la columna que corresponde al padre de ese nodo, en este caso "parent_id". El método lo único que hace es verificar que parent_id contenga algo, si contiene algo entonces toma ese ID y busca si ya existe uno anteriormente (tengo implementado un cache para facilitar la búsqueda), si encuentra ese ID, entonces agrega el nodo al padre que encontró, de lo contrario lo agrega en la raíz del árbol.

Saludos

¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook

Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.