JSF validators y Modal Panel de Richfaces

Esto es algo para gente que esté un poco avanzada ya con JSF, así que si no sabes nada… ¡mejor no leas!… Bueno está bien, echa un vistazo que te puede servir.

La cosa es así:

Cuando se usa un Modal Panel de Richfaces para mostrar un formulario de JSF, al ocurrir un error de validación, en vez de mostrarnos los mensajes que hayamos puesto, el Modal Panel (MP) se cierra sin más, lo cual no es ni de cerca el comportamiento que queremos. Si llegamos a abrir de nuevo el MP, podremos ver que los mensajes en realidad habían aparecido, pero al ocultarse el contenedor no pudimos verlos. Cuando pregunté a José Google acerca de esto, me dió la siguiente respuesta:

Keep Rich-Faces modal panel open when form validation errors occur

de la cual podemos extraer aún más soluciones al problema: una en la wiki de JBoss y otra en los foros de JBoss, ambas bastante similares en su forma de resolverlo.

La idea de estas dos últimas soluciones se basa en crear una función de JavaScript que se fije si el form tiene errores, mientras que la primera realiza algo similar utilizando un método del managed bean para verificar esto, e insertando este valor (booleano) en un hidden input.

Ahora, con tantas vueltas que dan estos muchachos ¿No se preguntan ustedes si no existe una forma más sencilla de realizar esto? ¿No debería ser esta forma aparte de sencilla, rápida y lógica? Pues la respuesta es que existe, y es totalmente sencilla, rápida y lógica.

Luego de pelear un rato con la opción de la wiki (la segunda de las tres que puse antes), y de darme cuenta de que tenía un comportamiento algo errático, comprendí que la solución real estaba en usar un botón de a4j como submit del form que haga un reRender del mismo, y no toda esa parafernalia de “un botón que llama a una función en JS que se fija si hay errores y entonces muestra mediante ajax el mensaje y sino le hace un hide al panel” . Como podrán apreciar a continuación, la solución que ofrezco es mucho más sencilla y lógica que las que había encontrado, e incluso me parece mucho más correcta. A pesar de esto, para ser sincere no he probado de cambiar diversos factores, ya sea poner un form a4j o cambiar algo en otros fields, pero lo importante es el botón a4j y el reRender, esa es la solución real. Ahí les va el ejemplo:

1
2
3
4
5
6
7
8
9
<h:form styleClass="form" id="loginForm">
	<h:outputText value="Nombre de usuario" styleClass="username" />
	<h:inputText value="#{loginBean.userName}" required="true" id="usernameInput" size="20" />
        <br />
	<h:message for="usernameInput" styleClass="error" /><br />
 
	<a4j:commandButton value="Entrar al sistema"
		reRender="loginForm" action="#{loginBean.logged}" styleClass="loginbutton" /><br />
</h:form>

Noten que el a4j:commandButton sólo hace reRender del form, con eso debería bastar para que el mismo muestre los mensajes de error en lugar de cerrarse sin más. El problema es que si agregamos un botón de “Cancelar”, al cerrarse el Modal Panel con mensajes de error mostrándose, éstos quedarán “abiertos” cuando mostremos el Modal Panel de nuevo. Si bien esto es fácil de solucionar, sería bueno que si alguien pasa por aquí deje su forma de hacerlo en un comentario, así participan del blog ;) . En caso contrario lo estaré publicando en una próxima entrada. Espero haber sido de utilidad ¡Nos vemos!

Geranio Bigotes

Tags: , ,

This entry was posted on Tuesday, May 27th, 2008 at 11:59 pm and is filed under Desarrollo Web, JSF. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

19 Responses to “JSF validators y Modal Panel de Richfaces”

Daniel June 30th, 2008 at 9:25 pm

Buenas tardes, quiero hacer una consulta xfavor. La solucion que das se aplicaria facil para un login, pero si tengo un dataGrid al que tengo que actualizar luego de grabar un registro en el modal Panel no creo que se aplicable esta solucion ya que en el ejmplo dado el reRender se aplica al form de modalPanel y hasta ahi funcionaria a la perfeccion pero el problema seria que pasa entonces si es que la validacion es correcta? (o sea que no hay error alguno) seguiria haciendo el reRender al mismo form y nunca se refrescaria la grilla a noser que presione F5, como puedo hacer en este caso ?????

Gracias de ante mano…. :D

Daniel July 3rd, 2008 at 1:51 pm

El caso que yo tengo es distinto ya que despues de un login uno pasa a otra pagina sinembargo en mi formulario todo esta en una sola pagina usando modalpanel’s. Cuando creo un nuevo registro 1) debe de validad 2) si la validacion devuelve true se cierra el modalPanel refrescando a la grilla de la pagina 3) si la validacion devuelve false no se cierra el modal panel sino que se muestran los mensajes de error.

estuve haciendolo con una funcion javaScript e incluso probe con esta solucion (q me parecio haberla probado antes) y los resultados fueron:
** Con el javascript (evento onComplete) funciona bien la validacion y todo estaria bien si no fuera que no entra a la parte en donde devuelve la cadena para cerrar el modalPanel, tambien refresacaba los datos en la grilla pero el problema es que no se cerraba el modal Panel.
** Con el resultado de este foro tambien validaba bien pero ni cierra ni actualiza por que para actualizar simplemente usaba un reRender desde el boton hasta la grilla. Luego puse el Richfaces.hideModalPanel() en el onComplete del form y tambien le añadi el reRender del form a la grilla pero ni aun asi cerraba aunke si actualizaba.

xfavor si tienen sugerencias se los agradecere.

Atte.
Daniel

The Doctor July 7th, 2008 at 9:36 am

Hola Daniel. ¿Probaste simplemente haciendo reRender tanto del form como de la grilla que necesitas actualizar? La sintaxis sería algo como esto

reRender=”loginFormId, grillaId”

Espero que con eso lo puedas solucionar. No debería ser necesario ningun tipo de JS, ya que RichFaces está (supuestamente) preparado para este tipo de cosas, aunque nunca se sabe. Si no funciona esto, lee un poco más de a4j y busca la solución por el lado de ajax. Cuando logres hacerlo funcionar no olvides compartirlo! :D

Saludos!, GB…

PD: Esto no es un foro, es un Blog :D

Andrea Castillo August 24th, 2008 at 8:03 pm

Hola,

Estoy trabajando con RichFaces, pero me preguntaba si se pude utilizar en Linux, o si da lo mismo trabajarlo en Windows que en Linux-….Gracias

The Doctor August 25th, 2008 at 8:35 am

Hola Andrea,

RichFaces puede utilizarse tanto en Windows como en Linux. El entorno de desarrollo que yo prefiero es Eclipse, que puede usarse en cualquiera de estos sistemas operativos, y despliego las aplicaciones sobre un JBoss que tambien puede ser instalado en ambos. Si tenés en cuenta que RichFaces es para desarrollo de aplicaciones web, es (casi) obvio que debería funcionar de la misma forma tanto en Windows como en Linux (cosa que no puedo decir del Eclipse :P ). Espero que eso haya respondido tu pregunta.

Saludos!

G.O.D. September 19th, 2008 at 7:54 pm

La solución es muy simple, creen el modal panel en su propio form independiente del form principal y problema solucionado

<h:form>
<rich:modalPanel>

</rich:modalPanel>
</h:form>

<h:form>

</h:form>

The Doctor September 22nd, 2008 at 1:00 am

G.O.D. Gracias por comentar. La idea es justamente para enviar el form. Si lo separas en otro form, a ese lo tendrías que enviar igual (en el caso que presento en el post), de modo que la validación existe igual. Al existir validación, el problema persiste por más q uses otro form. Saludos!

michael 'demonio' rodas August 5th, 2009 at 3:36 am

Saludos, disculpen soy nuevo esto, cómo puedo validar los campos del jsp a continuación? surespuesta me sería muy útil
muchas gracias de antemano

¿QUIERES RECIBIR INFORMACION ACERCA DE LA ALIANZA FRANCESA ?
Por favor llena los siguientes campos

Andrei September 22nd, 2009 at 1:25 am

Me quedé esperando el siguiente post.
Tengo una pantalla similar al ejemplo, varios campos obligatorios. Y un boton de cancelar que basicametne lo que hace es cerrar el panel.
Pero al abrirlo de nuevo para crear otro elemento con otroos datos, sorpresa, los datos anteriores que fallaron en la validacion siguen… bueno.. es obvio, siguen los datos que escribi, pero si eran varios obligatorios… pues los que escribí siguen.
Peor aún en un formulario de edición, si sucede el problema con la validacion, al seleccionar otro elemento para editar, tengo problemas porque no refresca la nueva inforamcion, tiene la informacion con la que falló la validación…
Sigo a la espera del posteo de esta aclaración.

Gracias.

The Doctor September 22nd, 2009 at 8:50 am

Hola Andrei.

Como verás, hace mucho no escribo nada relacionado con JSF, y la razón es que me dí cuenta de que esta tecnología no me satisface para nada. Te recomiendo usar en su lugar algo como Django (Python) o Ruby on Rails.

Pero para responder a tu consulta, lo más probable es que tengas algún problema con el backing bean, ya que si los datos que cargaste antes se siguen viendo, es muy posible que te falte inicializar (o limpiar) las variables en algún lugar del bean (por ejemplo en el constructor; depende de cómo tengas tu lógica).

Ahora, en caso de que no sea eso y tengas problemas con la validación al momento de presionar “Cancelar”, esto se arregla muy fácil seteando el atributo “immediate” del botón cancelar a “true” (esto es: immediate=”true”) De esta forma, al presionar el botón Cancelar, las validaciones son pasadas por alto y el formulario no se envía.

Espero que te haya servido. =)

Jim Ollero Ore January 7th, 2010 at 6:06 pm

todas las soluciones son una mala practica la manera mas optima que he encontrado es :
usando el atributo oncomplete que se ejecuta despues acabado el metodo en el cual se le puede decir que se cierre el MP o no y mostrando el mensaje en un cuadro de texto

public String getFlagpu() {
if(flagpu==null )
flagpu=”return false;”;
else
flagpu=”Richfaces.hideModalPanel(‘editar’);”;
return flagpu;
}

Jim Ollero Ore January 7th, 2010 at 6:10 pm

a4j commandButton id=”b” actionListener=”solicitudOSAction.add” reRender=”mensajeEroor” value=”Agregar” oncomplete=”solicitudOSAction.flagpu”

The Doctor February 1st, 2010 at 12:08 pm

Jim: La solución original del post, no es “mala práctica”, ya que aprovecha directamente RichFaces, sin hacer uso de ningún “hack” en javascript. Si estuvieras haciendo una página sin los recursos de Richfaces es otro tema, pero si querés hablar de buenas o malas prácticas, la forma correcta de hacerlo es usando las herramientas que tenés. =)

alexis March 12th, 2010 at 8:07 pm

tengo problemas con mi popup cuando abro el papup chévere pero el problema es qu no se cierra ni se oculta.. estoy intentando hacer así

Carlos July 2nd, 2010 at 3:47 pm

De acuerdo con el Doc! : )

Rodrigo Mercader May 9th, 2011 at 8:38 pm

Sos un kappo, me salvaste la cabeza. Dias buscando una solución…Tengo un modalpanel para mostrar mensajes de exito/error luego de un click de un par de a4j:commandbutton. El primer boton trae datos, y el segundo los salva. Ambos botones generan mensajes de exito/error. Tanto el mensaje de exito como el de error se corresponden con una propieadad de un backing bean. El modal panel se muestra solo si alguno de estas propiedades es distinto de “”. Y en cada a4j:commandButton tengo oncomplete=”#{rich:component(‘modalPanel’)}.show();return false;” en donde modalPanel es el id del modalpanel.

Luz Adriana May 17th, 2011 at 11:06 am

Hola, miren tengo un problema con el modalpanel. tengo un formulario de tres campos, pero al enviarselos al bean, no llega nada y por lo tanto mi metodo de guardar no funciona. No se q problema haya.
mi codigo

The Doctor May 17th, 2011 at 8:07 pm

Hola, hace años que no uso JSF y por suerte ya olvidé cómo se hacían esas cosas. Ahora uso PHP y soy feliz! Saludos!

Leave a Reply