Uno de los típicos problemas en el diseño de aplicaciones web es el control de la navegación. Para ayudar en la resolución de este problema, el framework incorpora un mecanismo que facilita el uso de estos saltos entre páginas con el consiguiente paso de mensajes.
Para entender la problemática que implica los saltos entre páginas, vamos a destacar ciertos puntos que se deben considerar:
Paso de parámetros: evidentemente, se debe poder pasar información desde el origen hasta el destino. En nuestro caso desde una clase manejadora a otra. Para ello, tenemos que hacer uso de la SESSION.
Pila de saltos: de alguna manera, una vez volvamos de un salto debemos limpiar todo rastro del salto, para evitar colisiones con futuras operaciones.
Automatización del proceso: intentar que el proceso sea lo más limpio posible para el programador.
Teniendo en cuenta estas consideraciones, el framework ha implementado una clase y una serie de métodos con la intención de facilitar el proceso al programador. Hay que destacar que un salto puede ser tan simple como indicar una URL en el actionForward correspondiente; pero con ello perderiamos todo control sobre el retorno (no podríamos garantizar la "limpieza" de la SESSION).
Vamos a implementar un ejemplo. Tenemos un mantenimiento tabular en el que vamos a acumular fila a fila una serie de aspirantes a los que les queremos realizar una entrevista grupal. Estos aspirantes se obtienen a través de otra ventana (también tabular) en la que podemos buscar los aspirantes por sus perfiles y seleccionarlos para la entrevista. Una vez seleccionados los aspirantes deseados, se pulsa al botón "Citar para entrevista" disparando el proceso (envío de correos, inserción en el planning del entrevistador, ...).
Ficheros implicados:
Tabla 4.1. Ficheros implicados en implementación
clase manejadora | view | plantilla tpl | descripción |
---|---|---|---|
GeneradorEntrevistas.php | p_generadorEntrevistas.php | p_generadorEntrevistas.tpl | Generador de entrevistas. Origen del salto |
Aspirantes.php | p_aspirantes.php | p_aspirantes.tpl | Mantenimiento de aspirantes. |
Dando por hecho la creación de los dos mantenimientos vamos a ir, paso a paso, indicando como implementar el salto. En primer lugar, tenemos que ubicar un punto de disparo de la acción de salto. Puede ser bien un botón clásico:
{CWBoton id="saltoVisualizar" imagen="49" texto="SALTO" class="boton" accion="saltar"}
o un botón tooltip:
{CWBotonTooltip imagen="39" titulo="+" funcion="saltar" actuaSobre="ficha"}
Ahora, tenemos que crear en la clase manejadora origen del salto (GeneradorEntrevistas), un método que gestione el salto (si se debe saltar o no; si pasa parámetros). En este caso el framework proporciona un método para tal uso saltoDeVentana:
public function saltoDeVentana($objDatos, $objSalto){ //Nombre de la claseM destino del salto $objSalto->setNameTargetClass('Aspirantes'); //Nombre de la accion de entrada a la ventana $objSalto->setAccion('iniciarVentana'); //Nombre de la accion de retorno $objSalto->setAccionRetorno('iniciarVentana'); //Parametro: numero maximo de seleccionables $objSalto->setParam('numeroMaxSeleccionable',5); return 0; }
Como se puede ver, por un lado tenemos los datos relativos a la pantalla (objDatos) y por otro, los relativos al salto. El objeto salto es el que se deberá configurar, para indicar la clase destino del salto, setNameTargetClass(), con el método getNameSourceClass() podremos obtener el nombre de la clase origen, la acción de entrada en la nueva ventana (el mapeo correspondiente), setAccion(), también se estable la acción de retorno a la ventana origen con setAccionRetorno(). También se pueden añadir parámetros al salto usando el método setParam().
Este código, redireccionará la ejecución hacia la clase Aspirantes entrando con la acción iniciarVentana. Esto implica que en el fichero de mapeos (mappings.php) tenemos que definir el _AddMapping y los _AddForwards correspondientes.
Ahora, en la clase destino del salto, debemos recoger la información transmitida en el salto. Para ello, en el constructor añadiremos el siguiente código:
//Comprobamos si hay salto $objSalto = IgepSession::damePanel('saltoIgep'); if(is_object($objSalto)){ $this->parametros = $objSalto->getParams(); }
Tenemos que acceder a la zona de la SESSION donde el framework almacena la información del salto y recuperar el objeto con damePanel('saltoIgep') y con getParams() obtendremos los parámetros que nos pasará la clase origen.
Una vez realizado el salto, vamos a indicar como se realiza el retorno. Para ello primero vamos a ver en la tpl como indicar que vamos a lanzar una acción de retorno. En nuestro caso hemos añadido dos botones que controlan el retorno, uno acumula los seleccionados, el otro cancela la operación. En ambos casos la acción es volver, los diferenciamos a través del id.
{CWBoton id="acumular" imagen="49" texto="ACUMULAR" class="boton" accion="volver"} {CWBoton id="cancelarAcumular" imagen="42" texto="CANCELAR" class="boton" accion="volver"}
Este estímulo se recibirá en la clase objeto del salto (en nuestro ejemplo Aspirantes). En ella debemos sobre escribir el método regresoAVentana:
public function regresoAVentana($objDatos, $objSalto){
if($objSalto->getId()=='acumular'){
//Recogemos los datos seleccionados por el usuario en pantalla
$m_datos = $objDatos->getAllTuplas('seleccionar');
$objSalto->setParam('nuevosAspirantes',$m_datos);
$objSalto->setAccionRetorno('acumular');
}
return 0;
}
En nuestro ejemplo, en el caso de que el usuario haya seleccionado aspirantes y haya pulsado acumular, volveremos a la clase con la acción acumular, podremos saber si se ha pulsado el botón Acumular obteniendo su id con el método getId(). En caso contrario volveremos con la acción que se programó en el salto (iniciarVentana). Por supuesto, la clase origen del salto, tiene que tener en el fichero de mapeo el _AddMapping y los _AddForwards correspondientes (en nuestro caso GeneradorEntrevistas__acumular y GeneradorEntrevistas__iniciarVentana).
Hay una serie de métodos que no se han utilizado en este ejemplo pero que pueden ser de utilidad. Entre ellos destacamos el método getNameSourceClass que devuelve el nombre de la clase origen del salto.
Finalmente, en la clase origen del salto, tenemos que configurar el regreso del mismo. En el caso de un regreso por cancelación de acción, no tenemos que hacer nada, ya que se trata de una acción genérica del framework (iniciarVentana). En el caso de un regreso para acumular, se ha decidido realizar una acción no genérica: una acción particular. Se trata de la acción GeneradorEntrevistas__acumular.
Para tratarla tenemos que incorporar el siguiente código.
public function accionesParticulares($accion, $objDatos) { switch ($accion) { case 'acumular': $salto = IgepSession::damePanel('saltoIgep'); $nuevos = $salto->getParam('nuevosAspirantes'); $this->acumularAspirantes($nuevos); $actionForward = $objDatos->getForward('correcto'); break; } return $actionForward; }
En el método acumularAspirantes, se realizarán las acciones pertinentes según la lógica del caso de uso. En nuestro ejemplo tendriamos que añadir los nuevos aspirantes a los seleccionados previamente:
public function acumularAspirantes($nuevos) { $acumulados = $this->getResultadoBusqueda(); if($acumulados == '') $acumulados = array(); foreach($nuevos as $indice =>$linea) { $aspirante = array(); $aspirante["dni"] = $linea["dni"]; $aspirante["nombre"] = $linea["nombre"]; ... array_push($acumulados,$aspirante); } $this->setResultadoBusqueda($acumulados); // si en vez de mostrar los aspirantes seleccionados quisieramos modificarlos // directamente en la base de datos, luego podriamos refrescar la pantalla con: //$this->refreshSearch(); }
Con esto ya tenemos un ejemplo entero de saltos. Como antes indicábamos, en futuras versiones este mecanismo se revisará y mejorará.