DataGrid con Zend Framework
Por zsamer en Septiembre 11, 2008
Recuerdo en mi primer post, donde había prometido una serie de temas que iría tratando a lo largo del camino, afortunadamente se han ido cumpliendo las promesas, pero aun queda mucho.
Hoy es el día de compartir unos de mis proyecto que he estado trabajando desde hace algún tiempo, se trata del primero de la lista de promesas de mi 1º post, el Data Grid.
A pesar de que ya lo había terminado hace meses aun faltaba darle mayor facilidad de uso y hacer refactoring en algunos componentes para que quedara lo mejor posible.
Si aun estas interesado en como implementar un Data Grid con Zend Framework continua leyendo.
Zend Framework Data Grid es un proyecto/componente escrito en PHP5, desarrollado especialmente para trabajar con Zend Framework, tiene como finalidad generar grillas o listados a partir de un Data Source tales Zend_Db_Table, Zend_Db_Select, Zend_Db_Adapter, Propel, Array, etc. Con funcionalidades de ordenar por columnas (sort/order by), paginado y un render adecuado según el tipo de columna.
Puedes descargar las librerías mediante SVN en el siguiente link, o bien descargarlo directamente aquí.
Una ves que hayan hecho checkout o descargado y tengan una copia del repositorio deben copiar la carpeta Core dentro de la carpeta library de nuestro proyecto (donde mismo está Zend Framework, etc).
Bueno, muchos se preguntaran porque diablos la librería esta dentro de un package/namespace llamado Core y no Zsamer como en mi anterior proyecto Implementar ORM en Zend Framework Db Table, mmm en realidad una muy buena pregunta, pero la respuesta tambien es buena. La respuesta es porque yo utilizo namespace Zsamer para todas mis librerias que extienden directamente de alguna clase/componente de Zend Framework y además de los Helpers View, Helpers Action y Plugins. Mientras que el namespace Core es donde yo guardo mis propios componentes, que no extienden ni sobrescriben a los componentes de ZF aunque si los utilizan.
Por defecto utiliza Zend_View, esto implica que hay que agregar el script-path de la vista del Data Grid (grid.phtml) al objeto Zend_View, esto puede ser en el index/Bootstrap o bien en el metodo init de nuestro controlador:
-
<?php
-
class Cms_GridController extends Zend_Controller_Action
-
{
-
public function init()
-
{
-
$this->view->baseUrl = $this->_request->getBaseUrl();
-
$this->view->addScriptPath(Core::getBaseDir() . DIRECTORY_SEPARATOR . 'skins/scripts/datagrid/');
-
}
-
}
Cada columna del Data Grid es un objeto que implementa cierta interfaz, cada objeto tiene cierta definición en su tipo de dato, según este es como será mostrado (render). Entre los tipos de columnas tenemos los siguientes: String (por defecto), Text (Long Text), Números, Options, Links(url) y Acciones (Ver, Editar, Eliminar). Quedando la posibilidad de agregar más tipos de render a medidas como podría ser un Fecha(Date/DateTime), Precio(Currency), ComboBox(Select Options) etc.
Por defecto si no se especifican los objetos de las columnas se crearan estos objetos según las columnas/campos de la Tabla(Base de Datos) o Array, etc, en general del Data Source, con el tipo/formato(type) string.
Clase Model Project
-
<?php
-
class Project extends Zend_Db_Table
-
{
-
protected $_primary = 'id';
-
-
protected $_name = 'project';
-
}
Ejemplo con Zend_Db_Table
-
<?php
-
require 'cms/models/Project.php';
-
-
class Cms_GridController extends Zend_Controller_Action
-
{
-
public function init()
-
{
-
$this->view->baseUrl = $this->_request->getBaseUrl();
-
-
$this->view->addScriptPath(Core::getBaseDir() . DIRECTORY_SEPARATOR . 'skins/scripts/datagrid/');
-
}
-
-
public function testAction()
-
{
-
$grid = new Core_DataGrid(new Core_DataGrid_DataSource_Table(new Project()), 5);
-
-
$grid->setDefaultSort('title')
-
->setDefaultDir("asc");
-
-
/* Si necesitamos agregar algún criterio o condición */
-
/* podemos obtener el objeto Zend_Db_Table_Select */
-
$grid->getSelect()->where('is_active = ?', 1);
-
-
echo $grid;
-
}
-
}
Ejemplo de uso con Zend_Db_Select con Columnas
-
<?php
-
class Cms_GridController extends Zend_Controller_Action
-
{
-
public function init()
-
{
-
$this->view->baseUrl = $this->_request->getBaseUrl();
-
-
$this->view->addScriptPath(Core::getBaseDir() . DIRECTORY_SEPARATOR . 'skins/scripts/datagrid/');
-
}
-
-
public function testAction()
-
{
-
$grid = new Core_DataGrid(new Core_DataGrid_DataSource_DbSelect(), 5);
-
-
$grid->setDefaultSort('title')
-
->setDefaultDir("asc");
-
-
$grid->getSelect()->from('project');
-
-
$titulo = new Core_DataGrid_Column('link', 'Title', null , 'left');
-
-
$titulo->setLinks($this->view->baseUrl . '/cms/grid/view/id/$id/');
-
-
$grid->addColumn('title', $titulo);
-
-
$grid->addColumn('description', new Core_DataGrid_Column('text', 'Description', null , 'left'));
-
-
$grid->addColumn('updated_at', new Core_DataGrid_Column('text', 'Last Modified', 180));
-
-
'width' => 80,
-
'type' => 'options',
-
1 => 'Enabled')));
-
-
echo $grid;
-
-
}
-
}
Más ejemplos los encontraran en el sitio web del proyecto, específicamente en la wiki del proyecto.
Ahora solo nos falta la hoja de estilo para darle un look and feel adecuado:
-
#paginglinks{
-
margin: 5px auto 5px auto;
-
clear: both;
-
}
-
-
.pagelink,
-
.pagelinklast,
-
.pagecurrent{
-
background: transparent;
-
border: 1px solid #212121;
-
padding: 1px 3px 1px 3px;
-
}
-
-
.pagelinklast{
-
background: #999;
-
}
-
-
.pagecurrent{
-
background: #999;
-
}
-
-
div.grid-header-button {
-
background-color: transparent;
-
text-align: right;
-
padding: 0;
-
margin: 0;
-
}
-
-
div.grid-header-button input{
-
margin: 5px;
-
}
-
-
table.grid{
-
border-top: 1px solid #DFDFDF;
-
border-right: 1px solid #DFDFDF;
-
width: 100%;
-
}
-
-
tr.rowHead {
-
background-color: #eee;
-
}
-
-
tr.rowHead th.first-cell{
-
border-left: 1px solid #DFDFDF;
-
}
-
-
tr.rowHead th{
-
padding: 5px;
-
color: #000;
-
font-size: 9pt;
-
font-weight : bold;
-
border-top: 3px solid #F7F5EE;
-
border-bottom: 3px solid #FEBE47;
-
border-left: 1px solid #fff;
-
background-color: #ECE9D8;
-
}
-
-
tr.rowHead th:hover{
-
background-color: #FAF9F4;
-
color: #ccc;
-
}
-
-
tr.rowHead th a{
-
display: block;
-
}
-
-
tr.rowFoot {
-
background-color: #eee;
-
}
-
-
tr.rowFoot td{
-
padding: 2px;
-
color: #000;
-
font-size: 9pt;
-
font-weight : bold;
-
/*border-top: 3px solid #F7F5EE;*/
-
border-bottom: 2px solid #FEBE47;
-
border-left: 1px solid #fff;
-
background-color: #ECE9D8;
-
}
-
-
tr.rowFoot td.first-cell{
-
border-left: 1px solid #DFDFDF;
-
}
-
-
tr.rowEven {
-
background-color: #eee;
-
}
-
-
tr.rowEven:hover {
-
background-color: #FFFFDD;
-
color: #000000;
-
}
-
-
tr.rowEven td{
-
border-bottom: 1px solid #99BAF3;
-
border-left: 1px solid #DFDFDF;
-
padding: 5px;
-
}
-
-
tr.rowOdd {
-
background-color: #fff;
-
}
-
-
tr.rowOdd:hover {
-
background-color: #D9E8F9;
-
color: #000000;
-
}
-
-
tr.rowOdd td{
-
border-bottom: 1px solid #99BAF3;
-
border-left: 1px solid #DFDFDF;
-
padding: 5px;
-
}
Los iconos de view, edit y delete vienen en el repositorio del proyecto en la carpeta "/public/images".
El resultado del DataGrid quedaría así:
Por supuesto que cada uno puede modificar el css y personalizar el estilo, diseño y colores del DataGrid.
Cualquier duda, problema, comentarios, criticas, sugerencias, errores/bugs etc, serán muy bienvenidos.
Lamentablemente hemos llegado al final del artículo, pero como siempre vienen más en camino. Para el próximo post tienen que estar atentos ya que veremos como implementar Bread Crumb (Miguitas de Pan) con un Zend View Helper
Espero que haya sido de utilidad.
Comentarios
45 Responses to “DataGrid con Zend Framework”
Deja tu comentario


Sin duda un proyecto a tener en cuenta. Para mí la cosa estará entre esto y/o la integración con ExtJs. No termino de congeniar con YUI aunque quizás sí para algunos componentes aislados como el YCalendar. Buen trabajo, enhorabuena!
DataGrid con Zend Framework…
Zend Framework Data Grid es un proyecto/componente escrito en PHP5, desarrollado especialmente para trabajar con Zend Framework, tiene como finalidad generar grillas o listados a partir de un Data Source tales Zend_Db_Table, Zend_Db_Select, Zend_Db_Ada…
Excelente trabajo !!, todo es muy bueno aca, la programación, los ejemplos, las explicasiones, un programador promedio puede hacer grandes cosas después de pasar por aca ;). Ya mismo estoy haciendo chechout e implementandolo en un proyecto.
Felicidades por el lanzamiento !
gracias lisandro, feliz de compartir mis trabajos y experiencias.
un abrazo.
Andrés, como dije antes, lo estoy usando en un proyecto y funciona perfecto, tuve que hacerle una pequeña modificación para incluir una imagen Thumb en uno de los campos (guardo el nombre en la db) asi que tomé como referencia lo de ->setLinks() y queria saber si es posible que en el futuro incluyas algo similar ?
gracias.
Si, ningún problema incluirlo, a groso modo sólo basta con agregar una nueva clase en Column_Render y del tipo image (Core_DataGrid_Column_Renderer_Image) y el método render deberá hacer render correspondiente incluyendo el tag html img.
Muy bueno, espero poder utilizarlo pronto
Gracias.
Exelente proyecto! estaba muy acostumbrado al datagrid de pear y la verdad q encontrar esto para zend es fantasito..
me gustaria saber si planeas documentar los metodos mas ma fondo tambien
Desde ya muchas gracias
Gracias Martín, en algún momento pienso documentar los métodos y atributos de las clases.
saludos,
zsamer, te molesto una ves mas con esto
el problema que estoy teniendo ahora es el siguiente, x ejemplo si en mi db tengo una fecha guardada en unix timestamp cuando la quiero mostrar en la columna quiero aplicarle un formato, estube un rato probando con el metodo format pero no logre exito alguno… recuerdo q en el caso de pear cuando definias las columnas podias indicarle un metodo externo a llamar para darle formato a los datos de esa columna..
me gustaria saber si es que estoy usando mal el metodo format, si talves implementastes o es simple de implementar la posiblidad de llamar a un metodo externo para darle formato a los datos de una columna talves.. o si en realidad darle ese formato tendria que hacerlo en el modelo de mi tabla y no en el datagrid (soy nuevo en MVC y aun tengo dudas)
en el caso del unix timestamp creando un metodo Core_DataGrid_Column_Renderer_unixTimestamp podria solucionarlo, pero mi pregunta es mas general, dado que necesito dar formato a distintos datos..
Saludos y desde ya muchas gracias
Martin
Many thanks for your grid class. I am using Smarty for page rendering in my ZF system. Does anyone have a Smarty version of the ‘grid.phtml’ template file. It’s all that is stopping the page displaying right now.
Spanish courtesy of Google Translate:
Muchas gracias por su red de clase. Estoy utilizando la página Smarty para hacer en mi sistema ZF. ¿Alguien tiene una versión de Smarty el ‘grid.phtml’ archivo de plantilla. Es todo lo que es detener la página que muestra ahora.
hi Ashley, you have to create the smarty class render and this has to implement the interface render an extends the abstract class:
see to example:
class Core_DataGrid_Render_Smarty extends Core_DataGrid_Render_Abstract implements Core_DataGrid_Render_Interface
{
protected $_template = null;
public function init()
{
$this->setTemplate(’grid.tpl’);
}
public function setTemplate($templateName)
{
$this->_template = $templateName;
return $this;
}
public function getTemplate()
{
return $this->_template;
}
public function render()
{
// here the code for smarty
if (!$templateName = his->getTemplate())
{
return ”;
}
$smarty = new Smarty();
$smarty->template_dir = ‘/myProject/skins/scripts/datagrid’;
$baseUrl = Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl();
$smarty->assign(’baseUrl’,$baseUrl);
$smarty->assign(’grid’,$this->getGrid());
$smarty->assign(’pager’,$this->getGrid()->renderPager());
// return the display not print
//return $smarty->display($templateName);
return $smarty->fetch($templateName);
}
}
Finally you have to create the template grid.tpl
look the ZendView template (skins\scripts\datagrid\grid.phtml) and transform to smarty.
In the controller
/* etc… bla bla bla*/
// echo $grid (anymore)
//now
echo $grid->render(’Smarty’);
Hola Martin ,
puedes crearte una clase Column_Render y del tipo unixtimestamp (Core_DataGrid_Column_Renderer_UnixTimestamp) y el método render podrá implementar el formato.
ej:
class Core_DataGrid_Column_Renderer_UnixTimestamp extends Core_DataGrid_Column_Renderer_Abstract
{
public function render($row)
{
$text = parent::_getValue($row);
// dar formato a $text
return $text;
}
}
Luego en la clase Core_DataGrid_Column tienes que agregar en el método _getRendererByType en el case lo siguiente:
case ‘unixtimestamp’:
$rendererClass = ‘Core_DataGrid_Column_Renderer_UnixTimestamp’;
break;
y listo.
zsamer, te agradesco tu respuesta, eso ya lo habia echo x ejemplo para renderear imagenes.. lo que me gustaria saber es si es posible x ejemplo.. decirle que el render de una columna dada va a ser una funcion/metodo auxilar..
x ejemplo:
$miColumnaConRenderAux = new new Core_DataGrid_Column(’text’, ‘Col con render raro’, null , ‘left’, acaLlamarAMiFuncionQueRenderea(’$id’));
no se si se entiende. voy a buscar en la Doc de pear un ejemplo de lo que digo…
Muchas gracias x tus respuestas, estas en algun foro (zzform.es FdW o algun otro donde te pueda encontrar?)
I found I didn’t need to create any new classes.
I created my smarty template file as:
{assign var=numColumns value=$grid->getColumnCount()}
{foreach from=$grid->getColumns() item=_column}
getHtmlProperty()} />
{/foreach}
{foreach from=$grid->getColumns() item=_column}
getHeaderHtmlProperty()}>
{$_column->getHeaderHtml()}
{/foreach}
{if $grid->count()>0}
{foreach from=$grid->getIterator() key=_index item=_item}
{foreach from=$grid->getColumns() item=_column name=coldata}
getStyleProperty()} class=”{$_column->getCssProperty()} {if $smarty.foreach.coldata.iteration==$numColumns}last{/if}”>
{if $_column->getRowField($_item)!=”}{$_column->getRowField($_item)}{else} {/if}
{/foreach}
{/foreach}
{elseif $grid->getEmptyText()}
grid->getEmptyTextClass()}” colspan=”100″>
{$grid->getEmptyText()}
{/if}
{if $pager}
{$pager}
{/if}
and that worked for me!
Actually the blog just screwed my code in \
no that didn’t work either. give me an email address and I’ll send you teh code block so you can add it in your blog for others to use..
Estimado, felicitaciones por la pagina. Baje el archivo DataGrid y al intentar probarlo integrarlo en un proyecto y probarlo con una query propia,
me tira un error.
Warning: Zend_Loader::include_once() [function.include]: Failed opening ‘Core.php’ for inclusion (include_path=’.;C:\wamp\www\miproyecto/lib/;C:\wamp\www\miproyecto/application/models;C:\wamp\www\ZendFrameworkExample\library.;C:\wamp\php\PEAR’) in C:\wamp\www\miproyecto\lib\Zend\Loader.php on line 83
Obviamente, Core::getBaseDir() tienes que cambiarlo por tu propio directorio base del poryecto.
Yo uso la clase Core para estos efectos en mi framework, si necesitas saber sobre esta clase y sus métodos leete el anterior post , ahí esta su implementación:
http://bolsadeideas.cl/zsamer/2008/05/bootstrap-class/
Hola
Your work is very good and works perfectly !!!
i have a few questions for you:
1)
But I’m looking for something witch could help me using the Edit fonction ! For example, if I click on the Edit link, I’d like to modify the datas of my row ! Something like that ! Can you explain me (and for everybody who is looking for doing this thing) how could I do this ?
2)
I’d like to put some radio button, check box, input select… in my grid ! Is there a way to do that in your frammework ? Or how I could I do this from my controller ?
Gracias para tu trabajo y para tu consejos !
nicolas
(re)
regarding the first question (how to use the edit fonction), I’d like that some appears in my grid for change the datas
Thanks a lot !!
Hola Nicolas:
1) Example Zend_Db_Table whith Columns and Controls (View, Edit, Delete):
http://code.google.com/p/zend-framework-datagrid/wiki/ExampleTable
2) for now is’t implemented
Muchas gracias Zsamer, he estado haciendo todos los tutoriales de tu blog y me han ido geniales. Desde ya estas en mi lector de feeds.
Muchas gracias y sigue así.
Daniel, un gusto leer tu comentario. Gracias a ti por ser mi lector
Estoy haciendo el ejemplo, pero donde consigo el cms/models/Project.php
no esta en el svn del data grid
Son ejemplos de modelo, el quie usé para el ejemplo es
class Project extends Zend_Db_Table
{
protected $_primary = ‘id’;
protected $_name = ‘project’;
}
Saludos zsamer, muy bueno tu grid, he podido integrarlo con mi aplicacion sin mucho problema y soy nuevo al ZF.
Una pregunta, como puedo cambiar el texto de: Next, Prev, Ir a Pagina y No records found?
Gracias de antemano
Hola amarcucci:
En la clase Core_DataGrid_Pager_Abstract puedes cambiar el texto de los atributos directamente:
protected $_next = ‘Siguiente»’;
protected $_previous = ‘« Atrás’;
Después voy hacer este tema más configurable y fácil, como obtener del objeto grid el objeto paginador y hacer los setter y getter respectivos.
Respecto a No records found:
$grid->setEmptyText(”no hay registros”);
Super buen trabajo zsamer, hace un tiempo andaba en busca de algo asi y tuve que hacer una tabla. pero este componente esta super bueno.
No se si planeas seguir desarrollandolo por ahora, pero algunas recomendaciones para el futuro serian.
1 .- Pasar el DataSource a Zend_Paginator y crear adaptadores de DataSource en funcion de Zend_Paginator, por ejemplo, configurar arrays, DBSelect, o DBTableSelect, antes de pasarselo al Paginador.
2.- Pasar el render a partials, en vez de desplegarlos directamente desde el componente, asi pueden ser manejados por el mismo objeto view.
por ejemplo: $grid->setDefaultViewScript(’grid.phtml’)
3.- Los Column_Render, podrias pasarlos a Grid_View_Helper_
mmm te comentaria mas cosas pero el lugar no es muy optimo.
De todas maneras muy buen trabajo y saludos.
[...] DataGrid con Zend Framework [...]
Hola zsamer muy bueno el post estamos tratando de hacer algo asi hasta que encontramos este blog, mira he tenido un problema me sale el siguiente error
Catchable fatal error: Argument 1 passed to Zend_View_Helper_PaginationControl::paginationControl() must be an instance of Zend_Paginator, instance of Core_DataGrid given in D:\MobiusWS\Quantum\library\Zend\View\Helper\PaginationControl.php on line 88
alguna idea de el porque estare agradecido?
disculpa por el post anterior el error era mio estaba usando el paginator y no estaba cambiando la vista correcta
pero ahora si este error debe de ser algo de pats pero no encuentra mi grid.phtml
Warning: script ‘grid.phtml’ not found in path (user-manager\_partials\;D:\MobiusWS\Quantum\\application\default\views\scripts\) in D:\MobiusWS\Quantum\library\Core\DataGrid\Abstract.php on line 273
que podra ser?
Todo esta okey gracias pero tengo una duda mas
mira es que resulta que quiero dar acciones con javascrpit desde un colum (editar) para ello debo recuperar la id de lo que este editando como en el ejemplo pero como o de donde recupero ese id?
gracias
una ves mas gracias el id lo consigo simplemente de las columnas de la consulta a la base de datos y ya
Como utilizo la lib core con ZF 1.8??
me tira este error:
Class ‘Core_DataGrid’ not found
ya lo solucione jejeje… en el Bootstrap.php
debo crear algo asi:
protected function _initLibraryNamespaces()
{
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Places_');
$loader->registerNamespace('Core_');
}
Hola, gracias por todos los tutos y tus proyectos.
queria saber como hacer para saber el Id para agregarlo a la url:
$titulo->setLinks($this->view->baseUrl . ‘/post/?id=$id’);
espero q me puedan ayudar…
gracias
Buenas Zsamer.
He sido alumno suyo en el curso de iniciación al ZF, el cual no puder terminar al 100% por motivos familiares, pero ya me he puesto bastante al día. Ahora estaba probando tu grid, algo que me parece fantástico y super útil.
No obstante, hecho en falta un par de aspectos:
a) exportación de los listados a pdf, excel, word, html, impresión… bla bla bla (cuando termine de echarle un ojo general y mi miniproyecto de prueba esté listo me pongo con ello)
b) Filtros. Es decir, dar la posibilidad de que en la primera fila de la tabla, antes de las cabeceras, haya algunos input para poner texto y que filtre por ellos. ¿Esto segundo se puede hacer ya y no lo he visto?
Gracias por tu tiempo!
Carlos.
Estimado Zsamer, felicidades por el excelente trabajo que has realizado.
Dos preguntas:
1. ¿Hay disponible algún manual?
2. ¿Cómo puedo implementar columnas tipo “action” como las que pones en tus ejemplos imágenes y links si pulsa la imagen pero “donde no aparezca ni la imagen ni el link si el valor del campo es NULL”?
Gracias anticipadas por tu respuesta.
Hola Zsamer, felicidades por el excelente aporte. En un proyecto que realice con ZF 1.7 utilice apliamente el Datagrid, me funciono a la perfección. Pero lamentablemente en este momento estoy realizando otro trabajo, con ZF 1.9.2 pero me arrojo este error al utilizar cualquier datasource.
Me puedes dar una mano para determinal cual puede ser el problema.
adjunto un trozo del codigo de pruebas.
Core_DataGrid_Exception: Invalid Parmas for DataGrid: ‘page’: You must give a non-empty value for field ‘page’ in /var/siulnet/pagoagil/library/Core/DataGrid.php on line 113
$grid = new Core_DataGrid(
new Core_DataGrid_DataSource_Table(
new Model_DbTable_Usuarios()), 10);
$grid->setDefaultSort(’id’)
->setDefaultDir(”asc”);
$this->view->grid = $grid;
De antemano gracias por su tiempo y ayuda.
Saludos Cordiales.
Hola yesid… no se si has podiso solucionar tu problema de una manera mas elegante ( de ser asi agradezco publiques la solucion ) pero yo lo solucione modificando el archivo “library/Core/DataGrid.php”
Cerca de la linea donde te sale el error modicala la clase para que queda asi.. con eso arregle mi problema, espero q tambien te sirva!!!
if(empty($_params)){
$_params = Zend_Controller_Front::getInstance()->getRequest()->getParams();
$_params["page"] = (int)$_params["page"];
}
Buenos días,
Soy nuevo en esto y tengo el siguiente problema:
He descargado el Zend Framework Quickstart y he conseguido que me funcione correctamente, pero
¿como hago para añadir este genial Grid al proyecto para poder usarlo?
Desde ya gracias
Muy bueno. Hace poco empece con el zend, y esto me solucionó un problema en minutos. Voy a ir estudiando el codigo para mejorar mi experiencia en Zend Framework.
Hay algun parametro que le pueda pasar a grid para que me acepte los como [enters] en vez de aplicarle la funcion htmlspecialchars().
Mill Gracias igual MUY BUENO
James Stuart impecable
Hola, quisiera saber como funciona la tipo ‘option’
ya que quiero saber si funciona como condicional es decir que me despliegue cierta informacion segun los datos que traiga de la bd.
Tengo que decir que el proyecto es genial, muy buen trabajo!