Explorador de archivos para el servidor Más videos
Descripción del tema
Demostración del tutorial
Material de apoyo
El material de apoyo es el código que escribimos en el tutorial anterior, trabajaremos sobre lo hecho para evitar explicaciones, no modificaremos el archivo PHP que lee los archivos, solo modificaremos el JavaScript. Una vez que copiemos todos los archivos que descargamos podremos ver algo como la siguiente imagen en nuestro explorador:Utilizamos el código del tutorial anterior
Creando el Layout
Primero vamos a crear el layout que tendrá nuestra aplicación, necesitamos que en la parte izquierda aparezca el TreePanel y en la parte derecha aparezca el panel donde cargaremos el contenido de cada archivo. Vamos a modificar el código de la ventana de la siguiente manera.var win = new Ext.Window({ title:'Reading files example', layout:'border', // Step 1 width:600, // Step 2 height:400, items: tree }); win.show();En el paso uno cambiamos el layout de “fit” a “border”, recordemos que con el valor “fit” el contenido de la ventana se ajustará a las dimensiones de la misma ventana, pero ahora si usamos el layout “border” podremos crear “regiones” dentro de la ventana, en tutoriales siguientes explicaré más a detalle esto, por ahora es suficiente. En el paso dos cambiamos las dimensiones de la ventana, dando espacio para agregar el panel donde se desplegará el contenido de cada archivo.
Crear las regiones
Cuando usamos un layout de tipo “border” es necesario definir las regiones que contendrá, es importante mencionar que debemos crear una región “center” obligatoriamente, de lo contrario aparecerá un error como el siguiente:uncaught exception: No center region defined in BorderLayout ext-comp-1002El layout de tipo “border” cuenta con cinco regiones, norte (north), sur (south), este (east), oeste (west) y centro (center), ya sabemos que la región central es obligatoria, para este ejemplo usaremos la región “oeste” para colocar el TreePanel y la región “central” para poner el contenido del archivo seleccionado.
var tree = new Ext.tree.TreePanel({ region:'west', // Step 1 border: false, autoScroll:true, dataUrl:'get-files.php', root: new Ext.tree.AsyncTreeNode({ id:'.', text: 'User files' }) }); var main = new Ext.Panel({ region:'center', // Step 2 layout:'fit', border:false }); var win = new Ext.Window({ title:'Reading files example', layout:'border', width:600, height:400, items: [tree,main] // Step 3 });En el paso uno le asignamos al TreePanel la región “west”, con esto se alineará en la parte izquierda de la ventana contenedora. En el paso dos creamos el panel central, aquí no hay nada diferente solamente la región es lo que debemos poner atención. En el paso tres le asignamos a la ventana los dos elementos que necesitamos que contenga, si creamos más regiones aquí las asignaríamos.
Layout border con dos regiones
Permitir que se redimensione el TreePanel
Vamos asignarle algunas otras configuraciones al TreePanel con el fin de que el usuario pueda cambiar su tamaño y que también lo pueda ocultar.var tree = new Ext.tree.TreePanel({ region:'west', split:true, // Step 1 collapsible:true, // Step 2 title:'Files', // Step 3 width:130, border: false, autoScroll:true, dataUrl:'get-files.php', root: new Ext.tree.AsyncTreeNode({ id:'.', text: 'User files' }) });En el paso uno hicimos que el panel se pueda redimensionar, con esto permitimos que el usuario tenga la capacidad de cambiar el ancho del panel. En el paso dos hacemos que el panel pueda colapsarse, esto permite que pueda ocultarse para tener más espacio y ver mejor el contenido principal. En el paso tres le asignamos un título y también hemos cambiado la dimensión inicial. Al actualizar el explorador podremos redimensionar el TreePanel y veremos algo como la siguiente imagen:
Redimencionar el TreePanel
Ocultar el TreePanel
Desplegando el contenido de los archivos
Hasta ahora nuestra aplicación no hace nada, solo despliega los archivos que el servidor nos permite ver, necesitamos agregar más interacción para el usuario y esto lo logramos asignándole los eventos adecuados a los componentes.tree.on('click',function(node){ // Solicitar el contenido del nodo seleccionado });En el código anterior estamos asignándole un listener al evento “click” del TreePanel, de esta manera cuando el usuario seleccione un archivo la función que definimos será ejecutada y recibirá como parámetro el “nodo” seleccionado. Lo siguiente es desplegar el archivo seleccionado, para esto usaremos un “iframe” al cual le asignaremos la “url” que contiene el nodo.
// Step 1 var el = Ext.get(Ext.DomQuery.select('.x-panel-body',main.el.dom)[0]); el.createChild({ // Step 2 tag:'iframe', src:'files/'+node.id, style:'border:none;width:100%;height:100%;' });En el paso uno obtenemos el div del panel central, este div es necesario pues ahí es donde colocaremos el “iframe”. En el paso dos creamos un “iframe” dentro del div que tomamos anteriormente, este “iframe” que apunta hacia el documento seleccionado, también le agregamos algunos estilos.
Mostrar el contenido de los archivos
tree.on('click',function(node){ var el = Ext.get(Ext.DomQuery.select('.x-panel-body',main.el.dom)[0]); while (el.dom.childNodes[0]){ // Step 1 el.dom.removeChild(el.dom.childNodes[0]); //Step 2 } el.createChild({ tag:'iframe', src:'files/'+node.id, style:'border:none;width:100%;height:100%;' }); });En el paso uno creamos un ciclo que se estará ejecutando hasta que no haya más elementos dentro del div principal. En el paso dos eliminamos el primer nodo del div principal.
Mostrar los archivos seleccionados
Conclusión
En este tema vimos como crear una layout de tipo “border”, no entramos en detalles sobre este tipo de layout ya que la idea es hacerlo más adelante, también vimos como utilizar el evento “click” en un TreePanel. Síguenos en Twitter para estar al tanto de las actualizaciones en el sitio.Te gustaría recibir más tutoriales como este en tu correo?
Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.
Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!
Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.
Regístrate a este curso
Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.
Tendrás acceso a descargar los videos, códigos y material adicional.
Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.
Llevarás un registro de tu avance.
20Comentarios
Poco apoco nos vamos acercando a lo mero bueno sigue así Crys
var el = Ext.get(Ext.DomQuery.select('.x-panel-body',main.el.dom)[0]); Que hace esto exactamente?
Ext.DomQuery.select('.x-panel-body',main.el.dom)[0] Busca los elementos que contengan la clase '.x-panel-body' tomando como root el elemento 'main.el.dom', luego toma el primer elemento del arreglo que regrese, en este caso la busqueda siempre regresará un elemento solamente ya que la ventana tiene un solo panel. var el = Ext.get(...) Toma el elemento encontrado y lo convierte en un Ext.Element
Muchas Gracias por la explicación Crys
Muy bien el ejemplo sigue asi por.
Hola muy bueno el post, disculpa si vamos hacer aplicaciones con php + jsExt
Ayer esta probando unas cosas, regresar html con ajax, todo mis links funcionan con un evento que les asigno, pero los que regresa ajax no tienen ese evento :S y otra duda como agregar filas a un grid, desde ya gracias un saludo desde colombia
Manolo puedes usar Delegación de Eventos para tu problema o un callback, todo depende de como este tú código.
tendrías que agregar los eventos a los nuevos elementos mediante un callback.
Con el callback funciona muy bien, Gracias Crys e Imfael pero como es eso de la delegación en Ext :S?
Crys solo me funciona en local, en mi servidor no me funciona, que puedeser?? en los archivos get-files.php y tree-files.js ya le cambie la ruta y je deje en '/' para ver los archivos que tengo en el hosting pero se queda en el root no muestra mas... porque sera? de ante mano gracias
Hola Crysfel! ¿Cómo tendría que hacer si en lugar de usar layout quisiera renerizar el treepanel en un TabPanel? o en su defecto ¿Cómo asigno el Layout a un tabPanel, para que me lo muestre sólo cuando cliqueo la pestaña correspondiente? Muchas gracias! Excelente tutorial!
Amigo, sabes que el ejemplo hace que se cuelge mozilla, esto ocurre cuando selecciono un archivo pdf y luego el html sabes por que podria psar esto? ---- MUchas gracias por los tutoriales siempre me sirven de ayuda sigue asi, y que siga creciendo esta comunidad
Excelente tutorial, además si sigues los pasos con tiempo y tranquilamente se aprende para luego poder personalizar y hacer cosas parecidas.
Hola Crysfel!!Como seria en caso de que el contenido de cada opción del menu se abra en diferentes pestañas? Excelente tutorial, muchas gracias!!
Muchsisimas gracias por el material y por tu tiempo... Estoy desarrollando un aplicativo en donde tengo un border Layout y en la region center quiero insertar este aplicactivo pero se me presenta q cuando inicio a explorar el arbol al momento de cargar aparecen los iconos de carpetas y archivos pero una vez terminada (cargada menos de 1 seg) este es reemplazado por un icono no conocido y me parece q es "unknow-icon", en la raiz aparece dos (el signo mas y el simbolo de carpeta) de este icono, a un segundo nivel se presentan 3 iconos la sgte carpeta, y a un tercer nivel se presentan 4 iconos he seguido todos los pasos y no encuentro porq sucede esto... . Ejm.[i]= icono [i][i]User files [i][i][i]docs [i][i][i][i]ebook.pdf de antemano agradesco cualquier ayuda es importante para mi gracias
Hola muy buen sitio, y la dedicacion que hay en el mismo..... Estoy iniciandome en este mundo extjs. y tengo que realizar como primera medida lo siguiente..... un Panel con menu, desplegable , cuando hago click necesito que me muestre la info en un iframe, El tema es que no uso codeigniter.... tambien..... y no quiero leer el menu desde una carpeta...... me entienden..... gracias
Crys me sale el siguiente mensaje en las herramientas de desarrolladores de Google Chrome ebook.pdfGET http://quizzpot.com/demos/extjs/tree/files/docs/ebook.pdf 200 (OK) ebook.pdf:-1Resource interpreted as Document but transferred with MIME type application/pdf. una consulta y si digamos si en un archivo de texto io quiero modificarlo?
Muchas gracias por tu ejemplo, pero como puedo visualizar lols archivos de word o excel en el mismo panel
Hola buen trabajo, tengo una pregunta quisiera que el Explorador de archivos, no se carge automaticamente en el html sino que abra desde un boton en la misma pagina, Porfavor Alguna Sujerencia, Gracias