• No se han encontrado resultados

Clave Ajena (salto modal)

In document Manual Usuario gvhidra. Versión (página 144-148)

II. Elementos de gvHidra

4. Elementos de pantalla avanzados

4.4. Control de la Navegación Saltando entre ventanas

4.4.2. Clave Ajena (salto modal)

Tal y como comentamos en la introducción de este punto, este tipo de salto responde a la necesidad de operar con una tabla asociada (típicamente a través de una clave ajena) en el transcurso de una operación de inserción/edición. gvHIDRA contempla este tipo de saltos desde su versión 4.0.0.

El ejemplo más claro es el de factura/proveedor. Imaginemos que un usuario que ha iniciado la introducción de una factura y, a mitad de introducción, cuando tiene que indicar el CIF del proveedor detecta que no está dado de alta en la BD. Esto, sin salto, supondría salir de la ventana, perder todos los datos insertar el proveedor y volver a empezar. Con el siguiente ejemplo, podremos insertar el proveedor sin necesidad de perder la información.

Clave Ajena (salto modal) • Ventana modal: al no poder perder la edición del usuario, necesitamos abrir el salto en una ventana emergente.

Esta debe ser modal para que el flujo de trabajo quede delimitado a lo que deseamos.

• Retorno con una acción de interfaz: al regresar a la ventana, querremos recoger el paso de mensajes y operar con ellos pero sin recargar la ventana. Para ello, necesitamos que el regreso del salto se realice a través de una acción de interfaz.

• Reutilización del mantenimiento: como hemos dicho, queremos poder operar con el mantenimiento de la clase correspondiente a la clave ajena, pero nos interesa poder aprovechar el mantenimiento ya existente.

Ficheros implicados:

Tabla 4.2. Ficheros implicados en implementación

clase manejadora view plantilla tpl descripción

Facturas.php p_facturas.php p_facturas.tpl Mantenimiento de facturas

Proveedores.php p_proveedores.php p_proveedores.tpl Mantenimiento de provee- dores.

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_facturas.tpl). A diferencia del ejemplo anterior, este salto sólo tiene sentido ser lanzado a través de un Botontooltip ubicado en el cwficha o cwfila de la plantilla origen (p_facturas.tpl), por lo tanto, como se ha indicado arriba, el parámetro actuaSobre tendrá el valor del campo afectado:

{cwficha} ...

{cwcampotexto nombre="ediCif" size="9" editable="true" label="CIF" dataType= $smty_dataType_Facturas.ediCif}

{cwbotontooltip id="addProveedor" titulo="+" accion="saltar" actuaSobre="ediCif"} ...

{/cwficha}

Ahora, tenemos que crear en la clase manejadora origen del salto (Facturas), 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) { if($objSalto->getId()=='addProveedor') {

$objSalto->setNameTargetClass('Proveedores'); //Entramos en modo insercion

$objSalto->setTargetAction('nuevo');

//Indicamos que abra en modo modal estricto $objSalto->setModal(true,true);

$objSalto->setSizeModal(1000,500);

//Indicamos que debe volver lanzando la acción de interfaz. $objSalto->setReturnAsTriggerEvent(true);

return 0; }

return -1; }

Ahora , configuraremos el objeto salto: para indicar la clase destino del salto, setNameTargetClass(). Con el método setTargetAction() fijamos la acción a ejecutar cuando realicemos el salto. Indicamos que se trata de un salto Modal (lo que hará que el navegador abra una ventana emergente) con el método setModal(boolean,boolean), esta venta- na modal la podemos redimensionar a nuestro gusto con el método setSizeModal(). Y, finalmente, indicamos que queremos que al regresar ejecute una acción de interfaz con el método setReturnAsTriggerEvent (la acción a ejecutar corresponderá al id del salto: addProveedor).

Clave Ajena (salto modal) setModal(boolean,boolean) El primer parámetro indicará si queremos que la ventana sea modal o se abra en la misma página del navegador, y el segundo, indicará si se trata de una ventana emergente modal estricta (true) o en cambio será una ventana emergente no estricta (false)

Nota: al realizar los saltos modales podemos encontrar problemas con algunos navegadores y el bloqueo de ventanas emergentes. Concretamente en Mozilla Firefox debemos comprobar que está permitido el lanzamiento de este tipo de ventanas para el servidor donde se ubique la aplicación.

Con esto, al pulsar el botón de salto addProveedor, el sistema realizará el salto a la ventana de mantenimiento de Proveedores entrando al modo de inserción directamente (estado nuevo). En este caso, nos interesa que el usuario inserte un nuevo proveedor y vuelva; es decir, que no pueda realizar ninguna operación más. Para controlar esto, utilizaremos la variable de presentación smty_modal en la tpl. Por ellos en la plantilla realizaremos estos cambios:

<!--*********** PANEL fil ******************-->

{*Mostramos el filtro y el tabular si hemos entrado a la ventana de forma normal*} {*Cuando es modal, solo mostramos el modo edi que es donde realizará la inserción*}

{if $smty_modal neq 1}

{cwpanel id="fil" action="buscar" method="post" estado="$estado_fil" claseManejadora="Proveedores"}

{cwbarrasuppanel titulo="Mantenimiento de proveedores"} ...

{/if}

<!-- ****************** PANEL edi ***********************--> {cwpanel id="edi" tipoComprobacion="envio"

action="$smty_operacionFichaProveedores"

method="post" estado="$estado_edi" claseManejadora="Proveedores" accion= $smty_operacionFichaProveedores}

...

{cwbarrainfpanel}

{cwboton label="Guardar" class="button" accion="guardar"}

{*Si la abrimos como modal que al cancelar cierre la ventana. Sino que se comporte normal*}

{if $smty_modal eq 1}

{cwboton label="Cancelar" class="button" accion="cancelar" action="cancelarModal"}

{else}

{cwboton label="Cancelar" class="button" accion="cancelar" action="cancelarEdicion"}

{/if}

{/cwbarrainfpanel} ...

Nota: Este cambio es opcional, es para ajustarse a las necesidades del ejemplo.

Arriba vemos que se definen dos botones (cwboton), uno para cuando la ventana es modal y otro para cuando no lo es. En el caso de encontrarnos que es una ventana modal hay que definir en el mappings la entrada correspondiente:

$this->_AddMapping('Proveedores__cancelarModal', 'Proveedores');

$this->_AddForward('Proveedores__cancelarModal', 'correcto', 'index.php?view=views/ p_proveedores.php&panel=listar');

Ahora tenemos que configurar la clase manejadora destino del salto (Proveedores). Básicamente tenemos que imple- mentar el control del flujo cuando estamos en modo modal. En estos casos, tras realizar la operación, queremos que se cierre la ventana. Para ello tenemos que sobrecargar el método postInsertar (después de insertar, cerraremos la ventana) y la acción particular cancelarModal que hemos creado en la plantilla para cancelar el salto.

Clave Ajena (salto modal) • isModal: método que indica si la ventana está en modo modal o no.

• closeModalWindow: método que lanza las instrucciones para cerrar la ventana modal. • setParam: método del objeto salto para el paso de mensajes entre ventanas.

public function postInsertar($objDatos) {

//Si se estamos en una ventana modal cerramos la ventana al salir if($this->isModal()) { $m_datosInsertados = $objDatos->getAllTuplas(); $objSalto = IgepSession::dameSalto(); $objSalto->setParam('nuevo',$m_datosInsertados[0]); $this->closeModalWindow(); } return 0; }

//Accion particular que cierra la ventana modal

public function accionesParticulares($str_accion, $objDatos) { if($str_accion=='cancelarModal') { $this->closeModalWindow(); $fw = $objDatos->getForward('correcto'); return $fw; } }

/*************** REGRESO A VENTANA MODAL **********************/ public function regresoAVentana($objDatos, $objSalto) {

$m_datosVisibles = $objDatos->getAllTuplas('visibles'); $objSalto->setParam('nuevo',$m_datosVisibles[0]);

return 0; }

Finalmente, vemos que aparece el método regresoAVentana. Este método es el que se ejecutará para lanzar el regreso a la ventana. En él, vemos como se prepara un paso de parámetros con el método setParam (la identificiación del nuevo proveedor insertado).

Con esta implementación, al pulsar Guardar o Cancelar en la ventana modal, cerraremos dicha ventana y regresaremos a la ventana origen en el punto en el que la habíamos dejado ejecutando la acción de interfaz que asociemos al salto (addProveedor). Para lanzar esta acción de interfaz incorporamos en el constructor el comando y el método que resulve su ejeucción.

public function __construct() { ...

$this->addTriggerEvent('addProveedor','cargarProveedor'); ...

}

public function cargarProveedor($objDatos) { $salto = IgepSession::dameSalto();

$proveedor = $salto->getParam('nuevo');

if(!empty($proveedor['ediCif']) and !empty($proveedor['ediOrden'])) { $this->showMessage('APL-32',array($proveedor['ediCif'],

Carga dinámica de clases

$objDatos->setValue('ediCif',$proveedor['ediCif']); $objDatos->setValue('ediOrden',$proveedor['ediOrden']);

$res = $this->consultar("select nombre as \"nombre\" from tinv_donantes ". "where cif = '".$proveedor['ediCif']."' and orden = ".

$proveedor['ediOrden']); if($res!=-1) $objDatos->setValue('ediNombre',$res[0]['nombre']); } IgepSession::borraSalto(); return 0; } //Fin de cargarProveedor

El resultado final es una ventana como la siguiente:

In document Manual Usuario gvhidra. Versión (página 144-148)

Documento similar