Ayuda en treepanel, children.
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 )); } }
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
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.