Vamos a implementar el ejemplo de un salto con recarga en el retorno. 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
Acumulador/Operador 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 aspiran- tes.
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 en el origen del salto (p_generadorEntrevistas.tpl). Puede ser bien un botón clásico:
{cwboton id="saltoVisualizar" label="SALTO" class="boton" accion="saltar"}
o un botón tooltip. Si elegimos esta opción hay que tener en cuenta dónde se va a ubicar dicho botón:
• Podemos querer que el botón actúe de forma general al registro, por lo tanto se pondrá en la barra superior del panel. A destacar que el parámetro actuaSobre, en este caso, debe ser "ficha" o "tabla".
{cwbarrasuppanel}
{cwbotontooltip titulo="+" accion="saltar" actuaSobre="ficha"} {/cwbarrasuppanel}
• En cambio nos puede interesar que el salto modal afecte a uno o varios campos en concreto, entonces el botón tooltip se encontraría dentro de la ficha o fila, según el caso. Aquí el parámetro actuaSobre debe contener el nombre del campo al que vaya a afectar.
{cwficha} ...
{cwcampotexto nombre="ediCif" size="9" editable="true" label="CIF" dataType= $smty_dataType_Personas.ediCif}
{cwbotontooltip titulo="+" accion="saltar" actuaSobre="ediCif"} ...
{/cwficha}
En este ejemplo nos quedamos con la primera opción.
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->setTargetAction('iniciarVentana'); //Nombre de la accion de retorno
$objSalto->setReturnAction('iniciarVentana'); //Parametro: numero maximo de seleccionables $objSalto->setParam('numeroMaxSeleccionable',5);
Acumulador/Operador
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), setTargetAction(), también se estable la acción de retorno a la ventana origen con setReturnAction(). 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 correspon- dientes.
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::dameSalto(); 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 dameSalto() 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" label="ACUMULAR" class="boton" accion="volver"}
{cwboton id="cancelarAcumular" label="CANCELAR" class="boton" accion="volver"}
Este estímulo se recibirá en la clase objeto del salto (en nuestro ejemplo Aspirantes). En ella debemos sobreescribir el método regresoAVentana del framework que nos permitirá gestionar el regreso de este salto.
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->setReturnAction('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).
$this->_AddMapping('GeneradorEntrevistas__acumular', 'GeneradorEntrevistas'); $this->_AddForward('GeneradorEntrevistas__acumular', 'correcto', 'index.php? view=views/p_generadorEntrevistas.php');
Nota: 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.
Clave Ajena (salto modal) 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 (iniciarVen- tana). 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->getResultForSearch(); if($acumulados == '')
$acumulados = array();
foreach($nuevos as $indice =>$linea) { $aspirante = array(); $aspirante["dni"] = $linea["dni"]; $aspirante["nombre"] = $linea["nombre"]; ... array_push($acumulados,$aspirante); } $this->setResultForSearch($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();
}
Como podemos observar al ejecutar, al regresar del salto, recargamos la ventana de origen. En este caso es necesario ya que hemos modificado el resultado de su búsqueda. Este ejemplo, se puede realizar con un salto clásico (como hemos visto), o con el uso de una ventana modal. En el siguiente ejemplo veremos como realizar un salto con ventana modal.