Tabla de contenidos
La manera de integrar un informe Jasper dentro de una aplicación gvHIDRA es similar a la que se utiliza para integrar otros informes (listadosOO, informesOD, listadosXML), o incluso más sencilla, puesto que la fuente de datos del informe se gestiona de forma interna (la consulta sql está embebida en el informe).
Supongamos que trabajamos en un proyecto que necesita nuestro proyecto se llama “pruebas-igep”, detallemos poco a poco los pasos a seguir:
Importar el proyecto Jasper. Para ello, el directorio “include” de nuestro proyecto, tendrá en su interior un directorio “jasper”. En dicho directorio, podremos encontrar tres subdirectorios básicos:
Directorio “ejemplos”: Distintos ejemplos disponibles.
Directorio “jars”: Clases Java que realizan la invocación del informe y la comunicación con las clases PHP.
Directorio “modulosPHP”: Clases PHP que se ofrecen al usuario (programador), encargadas de preparar la invocación.
Es importante que incluiyamos en el fichero .cvsignore del proyecto una línea con la palabar "jasper" para evitar que el proyecto jasper se incorpore a la versión del CVS de su proyecto.
Crear en el raíz de nuestro proyecto el directorio “plantillasJasper”, donde dejaremos los ficheros “.jasper” que vayamos compilando con el iReport (los informes compilados). Durante el desarrollo del proyecto, podemos colocar los ficheros "fuente" de los informes (extensión “.jrxml”) bien, en el mismo directorio o bien en un subdirectorio llamado "fuentes". Dichos ficheros son ficheros XML editables con el iReport. Es MUY IMPORTANTE no incluir dichos ficheros (los de extensión “.jrxml”) en la versión de produccion de la aplicación, dado que aparecen datos de conexión en su interior (usuario y contraseña de acceso a BD) en texto plano. Por lo tanto, cuando el responsable de una aplicación realice el despliegue o instalación de la misma en producción, debería eliminar los ficheros .jrxml” del directorio "plantillasJasper". La figura siguiente muestra la jerarquía de directorios de la que hemos hablado:
Copiar el fichero compilado (fichero de extensión “.jasper”) del informe dentro del directorio “plantillasJasper”.
Crear un mantenimiento de gvHIDRA siguiendo el patrón P1M1(FIL). Una vez creada la ventana, tenemos que incorporar en ella una accion particular para que el listado se lance. En nuestro ejemplo abrirListado.
1:<?php 2: 3:require_once('include/jasper/modulosPHP/informeJasper.php'); ···SIGUE··· 7:class claseDemo extends gvHidraForm 8:{ 9: 10: var $infJasper_demo; ···SIGUE··· 27: function accionesParticulares($str_accion, $objDatos) 28: { 29: $objDatos->setOperacion('external'); 30: $informeJ = new InformeJasper('DemoFacturas'); 31: $informeJ->setDataSourceType('sgbd'); 32: $conf = ConfigFramework::getConfig(); 33: $g_dsn = $conf->getDSN('g_dsn'); 34: $informeJ->importPearDSN($g_dsn); 35: //Si la conexión es distinta podemos especificarlo, por ejemplo: 36: /* 37: $informeJ->setDBType('pgsql'); $informeJ->setDBHost('localhost'); 38: $informeJ->setDBPort('5432'); $informeJ->setDBDatabase('marte'); 39: $informeJ->setDBUser('prueba'); $informeJ->setDBPassword('foo'); 40: */ 41: $informeJ->setJasperFile('./plantillasJasper/DemoFacturas.jasper'); 42: //Comprobamos los parámetros del informe y los pasamos... 43: if ($objDatos->getValue('anyo')!='') 44: { 45: $informeJ->addParam('Anyo', $objDatos->getValue('anyo'), 'String'); 46: } ··· Comprobación del resto de parámetros ··· 61: $this->infJasper_demo = & $informeJ; 62: $actionForward = $objDatos->getForward('mostrarListado'); 63: $this->openWindow($actionForward); 64: $this->showMensaje('APL-10'); 65: $actionForward = $objDatos->getForward('correcto'); 66: return $actionForward; 67: }//Fin accionesParticulares ···SIGUE··· 123:}//Fin 124:?>
Del código anterior debemos destacar:
Línea 10: Declaramos un atributo de la clase que será una referencia al informe Jasper. Se crea como atributo de la clase, porque es la manera más sencilla de hacerlo accesible a la vista.
Líneas 30-34: Declaramos un nuevo informe, de tipo SGBD (acceso a BD relacional) e importamos los parámetros de conexión que necesita desde la conexión PEAR activa. Si el informe se conectase a una BD distinta, podríamos especificarla también usando las funciones que hay comentadas en las líneas 35-39.
Línea 41: Declaramos el nombre del fichero compilado (fichero de extensión “.jasper”) que hemos colocado dentro del directorio “plantillasJasper” que queremos que se abra.
Lineas 43-46: Si el informe jasper tiene parámetros de entrada, en esta línea vemos cómo podemos dar valor a uno de los parámetros que espera el informe jasper. Los parámetros de la función son:
Nombre del parámetro: deberá coincidir con el nombre que hemos dado de alta en iReports
Valor del parámetro: enviaremos el valor (ojo con tipos complejos, como las fechas, eque en PHP son objetos).
Valor del parámetro: enviaremos el valor (ojo con tipos complejos, como las fechas, eque en PHP son objetos).
Tipo de Datos: En general, debe coincidir con el tipo que hemos definido para el parámetro dentro del informe iReport (tipos Java). Puede ser: Date, Time, String, Boolean, Int, Long, Double. Auqnue podemos apoyarnos en la potencia de las expresiones de iReport/jasperreport para "forzar" un tipo. En el apartado de Recomendaciones y generalidades sobre integración gvHidra y Jasper podemos encontrar más información al respecto.
Línea 61: Guardamos la referencia al objeto en un atributo de la clase manejadora para poder acceder al mismo en la vista.
Líneas 62-66: obtenemos un forward para el listado (una views que ahora luego veremos) y lo abrimos en una ventana nueva (método openWindow). Finalmente devolvemos el forward normal de la acción particular mostrando un mensaje en pantalla.
De las últimas líneas comentadas anteriormente, deducimos que el fichero mappings.php debe contener el siguiente código:
... $this->_AddMapping('claseDemo__iniciarVentana', 'TinvListFacturaJasper'); $this->_AddForward('claseDemo__iniciarVentana', 'gvHidraSuccess', 'index.php?view=views/listados/p_demoJasper.php'); $this->_AddForward('claseDemo__iniciarVentana', 'gvHidraError', 'index.php?view=igep/views/aplicacion.php'); $this->_AddMapping('claseDemo__abrirListado', 'TinvListFacturaJasper'); $this->_AddForward('claseDemo__abrirListado', 'correcto', 'index.php?view=views/listados/p_demoJasper.php'); $this->_AddForward('claseDemo__abrirListado', 'mostrarListado', 'index.php?view=views/listados/l_demoJasper.php'); ...
Continuemos ahora con el último paso, la vista. Para integrar el listado generado con la ventana, hemos utilizado una llamada al forward mostrarListadoEn nuestro ejemplo l_facturaJasper.php
1: <?php 1: require_once('include/jasper/modulosPHP/informeJasper.php'); 2: 3: 4: if (IgepSession::existeVariable("claseDemo","infJasper_demo")) 9: { 10: $informeJ = & IgepSession::dameVariable("claseDemo","infJasper_demo"); 11: $informeJ->createResultFile('pdf'); 12: } 13: IgepSession::borraVariable("claseDemo","lanzarInforme"); 14: 15: ···SIGUE···
Del código anterior destacan:
Linea 10: Recuperamos el atributo que referencia al listado de la sesión.
Linea 11: Invocamos la creación del informe.