Foro

Extjs 4 tree

0
Hola, no se si solo me pasa a mi, pero estoy completamente perdido en cuanto al manejo de los ext.tree, ext.tree.panel y demas en la version 4, alguien sabe de una guia con ejemplos completos sobre este tema, o tal vez podriamos armar la guia aqui en este post :P. Lo que necesito desarrollar es un tree que se cargue desde una base de datos, recibiendo una cadena Json, pero que no cargue todo el arbol, si no que al hacer click en cada nodo, este vaya a un webmethod y cargue los child correspondientes, ¿alguna idea?
1
Tengo una duda yo desarrolle un Tree Panel de similar que al hacer click sobre una hoja carga el store de un segundo arbol dependiente el problema es que con el listener "itemclick" al hacer "doble click" en el árbol secundario carga los dos store y luego causa un error y deja de funcionar el segundo árbol. //Este es el metodo que utilizo arbolSecundario.store.load({params:{idArbolPrimario:record.data.id}}); //Este es el store del arbol secundario function obtieneStoreSecundario(){ var datos= Ext.create('Ext.data.TreeStore', { proxy: { type: 'ajax' , url: '../../Comunes/Modulos/unegocio_obtieneArbol.php' }, root: { text: 'Arbol Unegocio', expanded: true } }); return datos; } Nota al hacer click normal funciona correctamente. he probado usando los listeners click y dblclick pero no puedo obtener correctamente los datos de la hoja seleccionada funciona aveces y otras veces cae lo mas probable es que este mal el metodo para obtener el nodo pinchado. //uso para estos listeners var record = Ext.getCmp('idArbolPrimario').getSelectionModel().selected.items[0]; si alguien me pudiera indicar como capturar correctamente el nodo seleccionado en ExtJs4 se lo agradecería enormemente. Saludos
0
Por ultimo lo que no he podido hacer con este Tree Panel es expandir el arbol hasta una hoja especifica de la cual conozco el id.
0
En la base de datos creas una tabla con los siguientes campos: id = es el identificador unico del nodo text = Aqui va el texto o nombre del nodo (Enero, febrero, Viernes 03, etc) leaf = es un boleano TRUE o FALSE si es TRUE este nodo del arbol no tendra mas ramificaciones parent = Aqui va el ID del papá de este nodo, si hace parte de los nodos principales va un 0 de esta manera los primeros nodos que se cargan son los que tienen un parent = 0 y al expandir el nodo, se envia el id del nodo al PHP, que lo recibe y consulta que "hijos pertenecen a dicho nodo y asi se va cargando el arbol.
0
Bueno tras mucho buscar, publico lo que encontré, espero que a alguno le sea útil: 1. se define el datamodel Ext.define('Menu', { extend: 'Ext.data.Model', fields: ['id', 'text', 'leaf', 'url'] }); aquí se especifican los campos que vamos a manejar al retornar los nodos del arbol, los explico, el 'id' es el identificador unico del nodo, el 'text' es el nombre que le damos al nodo, el 'leaf' muy importante, nos dira si el nodo tiene child o no, y por ultimo 'url' es un campo adicional (podría ser url o lo que sea) 2. se crea el Store para el tree var store = Ext.create('Ext.data.TreeStore', { model: 'menu', idProperty: 'id', autoLoad: true, proxy: { type: 'ajax', url: 'treesearch.php', root: 'modulos', reader: { type: 'json', root: 'modulos' } } }); el model lleva el nombre del modelo de datos que se definio anteriormente el idProperty lleva el campo con el cual se identifican los nodos el autoLoad esta configurado en true para que se cargue el nodo inicial o root el proxy, se define como todos los proxy de ajax, pero se especifica el root 3. El tree var tree = Ext.create('Ext.tree.Panel', { title: 'Simple Tree', width: 200, height: 150, store: store, rootVisible: false, listeners:{ itemclick:function(node, rec, item, index, e){ console.log(node); console.log(rec); console.log(item); console.log(index); console.log(e); var nd = console.log(rec); Ext.Msg.alert(rec.get('text','internalid')); } } }); en este caso he decidido agregar un listener, para que ocurra algo al hacer clic en un nodo, allí se puede agregar la acción deseada hasta aquí va el árbol, mas adelante publico el treesearch.php para tener una idea de como se trae la información desde la base de datos de manera asyncrona.
0
bueno, continuando, este es el php que permite traer datos de la base de datos y enviarlos en cadena Json 0) { $i = 0; $total = mysql_num_rows($result); while($i < $total){ $obj[] = mysql_fetch_object($result); $i++; } echo '{modulos:'.json_encode($obj).'}'; } else{ Echo '{success: false}'; } ?> Espero que haya servido de algo.
0
Esto es lo que quiero hacer yo... pero no me queda claro el formato de la DB ni tmpoco como hacer que se carguen sub-modulos digamos. Yo quiero cargar primero modulos que digan los meses: ENERO, FEBRERO, ETC. Al hacer click, buscar los dias que hay para esos meses (no son todos, los tengo en una db) VIERNES 03, LUNES 06, etc. Al hacer click que me despliegue los usuarios de esos dias en particular: JUAN PEDRO, etc. Tenés idea como hacerlo? y que valores en la db diferencian en que lugar va cada registro? Saludos.
0
me salio perfecto, cargue mi arbol desde la base de datos. Ahora mi problema es como recupero el valor del campo 'url' cuando hago click en un nodo: Ext.Msg.alert(rec.get('text')); -> esto recuper el texto del nodo Ext.Msg.alert(rec.get('url')); -> no me muestra nada... o hay alguna forma de capturar ese valor. Saludos desde lima peru
0
Hola, escribo para ayudarte en la duda que tienes. Para que puedas obtener ese dato, así como cualquier otro dato que necesites de un nodo, primeramente tienes que haber definido dicho campo en el modelo, por ejemplo: Ext.define('Menu', { extend: 'Ext.data.Model', fields: ['id', 'text', 'leaf', 'url'] }); ahora cuando devuelves los datos desde el php por supuesto envias ese campo, ejemplo: $datos = new stdClass(); $datos->id = 1; $datos->text = 'Nodo 1'; $datos->leaf = true; $datos->url = 'http://miurl.com'; echo json_encode($datos); Si todo ha ido bien deberías poder obtener los datos desde el record en Ext. Saludos y espero sea de ayuda el post.

¿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.