====== Componente ValidateForm - FundeWeb 2.0 ====== ===== Requisitos ===== * Fundeweb tags 2.0.31 o superior ===== Resumen ===== En ocasiones es necesario comparar los valores de varios campos de un formulario, realizar sobre ellos una validación de forma conjunta o comprobar si existe un registro en base de datos que contiene todos los valores de los campos antes de realizar una acción. Para realizar esta validación hemos incorporado a FundeWeb el componente **validateForm**. Para utilizarlo solo es necesario incluir la etiqueta //****// al final del formulario a evaluar y crear un validador JSF personalizado que contendrá la lógica de la validación. Para aplicaciones con FundeWeb 1.5 acceda a la siguiente [[fdw:fdw-gt-validateform|wiki]]. ===== Propiedades ===== * **validatorId:** * Descripción: Identificador del validator JSF usado para la validación del formulario. * Requerido: **Sí** * **fields:** * Descripción: Lista de id's (separados por comas) de los componentes UIInput a comprobar en el validador. Si no se especifica estarán disponibles todos los componentes UIInput del formulario. * Requerido: No * **showFieldMessages:** * Descripción: Indica si el mensaje de validación se mostrará junto al campo. * Requerido: No * Tipo: booleano * Valor por defecto: false * **showGlobalMessages:** * Descripción: Indica si el mensaje de validación se mostrará de forma global (growl). * Requerido: No * Tipo: booleano * Valor por defecto: **true** * **manualValidation:** * Descripción: Indica que el estado de los componentes evaluados se actualizará desde el validador JSF cuando se produzca una excepción. Aumenta la flexibilidad del componente pero deja todo el control de la validación y generación de errores en manos del programador. Ver la clase UIValidateForm y preguntar a MNCS en caso de tener dudas sobre su uso. * Requerido: No * Tipo: booleano * Valor por defecto: false ===== Modo de empleo ===== Para utilizar el componente validateForm deberemos introducir en el encabezado de nuestra pantalla el espacio de nombres correspondiente a este tag: xmlns:fw="http://www.um.es/atica/fundeweb" ... ... Posteriormente, para poder utilizarlo lo primero que tenemos que hacer es crear un **formulario**, ya que es requerido para su funcionamiento. Una vez creado el formulario basta con utilizar el componente de la siguiente manera: Para finalizar, es necesario crear el validador JSF que realiza la validación. La clase java para el validador debe extender la clase abstracta **FormValidator** incluida en la librería Fundeweb Tags. La clase FormValidator implementa las interfaces javax.faces.validator.Validator y org.primefaces.validate.ClientValidator, y proporciona algunos métodos para simplificar el uso de los componentes y mensajes en el validador. @FacesValidator(ValidadorLocation.NAME) public class ValidadorLocation extends FormValidator { private Logger log = Logger.getLogger(ValidadorLocation.class); public static final String NAME = "locationValidator"; public static final String ID_STATE = "stateId"; public static final String ID_CITY = "cityId"; public static final String ID_ZIP = "zipId"; @Override public Map getMetadata() { return null; } @Override public String getValidatorId() { return ValidadorLocation.NAME; } @Override public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { try { // Establece la lista de componentes setComponentes((Map) value); // Recupera los componentes UIInput UIInput inputState = getComponente(ID_STATE); UIInput inputCity = getComponente(ID_CITY); UIInput inputZip = getComponente(ID_ZIP); // Recupera los valores introducidos (según el tipo de dato del value del componente) String state = (String) inputState.getValue(); String city = (String) inputCity.getValue(); long zip = (long) inputZip.getValue(); /** * LÓGICA DE LA VALIDACIÓN */ // Si la condición de validación no se cumple se lanza la excepción ValidatorException if (![condición validación]) { throw new ValidatorException(FacesMessages.createFacesMessage(FacesMessage.SEVERITY_ERROR, "ejemplo.mensaje.validacion", null, state, city, zip)); } } catch (ClassCastException c) { // Muestra mensaje de error en caso de no encontrar un ID throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "ejemplo.mensaje.classCastValue", null)); } } } * El valor del atributo //__validatorId__// del componente debe coincidir con el valor de la notación __//@FacesValidator//__ del validador JSF (en el ejemplo empleado este valor es "locationValidator"). * Deben sobreescribirse obligatoriamente los métodos //__getMetadata__//, //__getValidatorId__// y //__validate__//. * Al principio del método //__validate__// debe añadirse obligatoriamente la línea: setComponentes((Map) value); * Los valores introducidos en la pantalla se recuperan usando el método //__getComponente__// con el mismo //__id__// establecido en los componenets (en el ejemplo empleado: "stateId", "cityId", "zipId"). * Si las condiciones de la validación no se cumplen, es necesario lanzar la excepción //__ValidatorException__// para indicarle al componente validateForm que existe un problema y que establezca en la pantalla los mensajes de error correspondientes. Es posible utilizar __varias veces__ el componente **validateForm** en el __mismo formulario__. Cada componente usará su validador JSF propio. El orden en el que se definan los componentes en la pantalla, será el orden en el que se ejecuten las validaciones. Si un formulario tiene __diversas comprobaciones__ que realizar, es //recomendable// __realizar cada comprobación de forma independiente__ en un componente **validateForm** aparte (con sus correspondiente validador JSF), especificando en cada componente los campos exactos implicados en cada validación. Para más información, consulte con su MNCS (juanmiguel.bernal@ticarum.es, ramon.ginel@ticarum.es).