Navegación con popup
La creación de popups varía según la implementación de JSF que utilicemos para cada proyecto. Cada implementación nos da la opción de crear popups modales o no modales. Hoy vamos a hablar sobre los popups en ADF, los cuales son modales.
Para crear un popup en ADF simplemente debemos definir una regla de navegación específica, la cual abrirá la nueva ventana en forma de popup, para ello, en el fichero faces-config.xml debemos escribir lo siguiente:
<navigation-rule>
<from-view-id>/ejemplo1.jspx</from-view-id>
<navigation-case>
<from-outcome>dialog:abrirPopup</from-outcome>
<to-view-id>/ejemplo2.jsxp</to-view-id>
</navigation-case>
</navigation-rule>
Al igual que cualquier otra regla de navegación, al ejecutar un metodo y devolver una cadena formateada como “dialog:abrirPopup” nos redirigirá a dicha página, pero esta vez en forma de popup.
Se puede dar el caso que queramos pasar valores a la nueva página que estamos abriendo, pues de igual modo que ocurriría si no fuera un popup, deberíamos llamar a la clase estatica AdfFacesContext y hacer lo siguiente en nuestro método asociado al action:
AdfFacesContext().getCurrentInstance().getProcessScope().put ( " key " , " objeto " );
Si desde el backing_bean asociado al popup quisieramos recoger dichos valores se haría de la misma manera, pero en vez de setear los valores los recogeríamos:
AdfFacesContext().getCurrentInstance().getProcessScope().get( " key " );
Lo único que nos quedaría por hacer sería asociarle una propiedad al botón que vaya a abrir el popup:
useWindow = true;
De esta manera habríamos creado un sencillo popup en nuestra página. Existen otros medios para poder pasarle valores al popup, y sería asociandole un evento de tipo launchEvent al botón, y lo único que habría que hacer es capturar el componente y pasarle los valores de manera similiar a como hemos explicado anteriormente. El problema a esto es que a veces, queremos que según que tipo de condición se realice en el método asociado al evento se realice una navegación u otra, o que no se abra ningún popup.
Puede ocurrir que tengamos en el evento una condición que según el tamaño de una lista, se le envíen al popup ciertos valores, nuestra intención sería que si esa lista está vacia no se lance el popup sino que se envíe un mensaje al FacesContext. Los parametros se asociarían accediendo al launchEvent, recogiendo el componente y ejecutando el método getDialogParameters().put(....);
A la misma vez, se esta asociando un action al botón que lanza el popup, que se ejecutaría antes que el evento anterior, por tanto, se está estableciendo ya la cadena que se debe de retornar para lanzar el popup (dialog:…).
Si se nos diera el caso que no debemos lanzar el popup, mandamos el mensaje de error al FacesContext, aparecería pintado en la pantalla, pero como se ha definido la regla de navegación antes que se ejecute el evento, se nos abre también el popup.
La solución al problema sería eliminar ese launchEvent y ejecutar la lógica en el action, y los valores del popup pasarlos a traves del AdfFacesContext como se explico al principio del tutorial.
Tags: ADF, Java ServerFaces