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
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.




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