¿Cómo dejar que la validación dependa del botón presionado?
-
27-10-2019 - |
Pregunta
He creado el formulario y quiero mostrar elementos existentes anteriores en una mesa mientras uno nuevo está creando. Me gustaría mostrar los elementos coincidentes ya que el formulario se está llenando. Pero cuando intento filtrar la lista sin completar el formulario, aparecen los mensajes de validación y la tabla no se actualiza.
No sé si es posible, pero lo que quiero hacer algo como esto:
<h:form id="form">
<h:outputText value="Name: "/>
<p:inputText value="#{itemsBean.name}" id="name" required="true"/>
<br/>
<h:outputText value="Description: "/>
<p:inputText value="#{itemsBean.description}" id="description" required="true"/>
<p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
<p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.
<p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">
<p:column>
<h:outputText value="#{item.name}"/>
</p:column>
<p:column>
<h:outputText value="#{item.description}"/>
</p:column>
</p:dataTable>
</h:form>
Soy muy nuevo en JSF.
Solución
Entiendo que quieres filtrar según el name
campo de entrada. los <p:commandButton>
envía por defecto una solicitud AJAX y tiene un process
Atributo en el que puede especificar qué componentes le gustaría procesar durante el envío. En su caso particular, debe procesar solamente la name
campo de entrada y el botón actual (para que se invoque su acción).
<p:commandButton process="@this name" ... />
los process
El atributo puede tomar una colección separada de espacio de ID (relativas) del cliente de los componentes, en el que @this
se refiere al componente actual. Predeterminado es en caso de <p:commandButton>
a @form
(que cubre todos los campos de entrada del formulario actual y el botón presionado), por eso todos fueron validados en su intento inicial. En el ejemplo anterior, todos los demás campos de entrada no se procesarán (y por lo tanto tampoco se validan).
Sin embargo, si tiene la intención de omitir el required
validación para todos campos siempre que se presione el botón en cuestión, para que eventualmente pueda procesar múltiples campos que no necesariamente necesitan ser todos Llenado, entonces necesitas hacer el required="true"
En su lugar, un condicional que verifica si el botón se ha presionado o no. Por ejemplo, déjelo evaluar true
Solo cuando se ha presionado el botón Guardar:
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" value="Save" ... />
De esta manera no se validará como required="true"
Cuando se presiona un botón diferente. El truco en el ejemplo anterior es que el nombre del botón presionado (que es esencialmente la ID del cliente) se envió como parámetro de solicitud y que podría verificar su presencia en el mapa de parámetros de solicitud.
Ver también:
Otros consejos
He probado esto con envíos que no son de AJAX:
<p:inputText ... required="#{not empty param.includeInSave1}" />
...
<p:inputText ... required="true" />
...
<p:commandButton value="Save1" ajax="false">
<f:param name="includeInSave1" value="true" />
</p:commandButton>
<p:commandButton value="Save2" ajax="false" />
La primera entrada se requiere validada solo en el botón Save1 envío.
Además de la respuesta de Balusc (muy útil y completa) quiero agregar que cuando use un <h:commandButton />
validará (requerido, validaciones personalizadas) todos los campos en el <h:form />
Cuando se encuentra el botón de comando, por lo tanto, cuando necesita usar más de un botón de comando, puede considerar que es una buena práctica usar diferente <h:form />
a diferentes responsabilidades para evitar un comportamiento inesperado en las acciones de envío de los botones de comando. Se explica bien en una respuesta de Balusc: Múltiples h: formulario en una página JSF
Si su formulario tiene validaciones y no actualiza el <h:form />
O no muestra mensajes, puede obtener dolor de cabeza pensando que el <h:commandButton />
no está disparando su acción, pero probablemente es un problema de validación que no se ha mostrado.
Cambie su comando Filter Button de la misma manera para ignorar la validación:
<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>
EDITAR:
La publicación relacionada en So, creo que esto también resolverá su problema.