¿Cómo dejar que la validación dependa del botón presionado?


He creado un formulario y quiero mostrar elementos existentes anteriores en una tabla mientras se crea uno nuevo. Me gustaría mostrar los elementos coincidentes a medida 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 es 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.

Author: ROMANIA_engineer, 2011-12-04

4 answers

Entiendo que desea filtrar en función del campo de entrada name. El <p:commandButton> envía por defecto una solicitud ajax y tiene un atributo process en el que puede especificar qué componentes desea procesar durante el envío. En su caso particular, debe procesar solo el campo de entrada name y el botón actual (para que se invoque su acción).

<p:commandButton process="@this name" ... />

El atributo process puede tomar una colección separada por espacios de ID de cliente (relativos) de los componentes, en donde @this se refiere al componente actual. Por defecto en el caso de <p:commandButton> a @form (que cubre todos los campos de entrada del formulario actual y el botón presionado), es por eso que 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 validarán).

Sin embargo, si tiene la intención de omitir la validación required para todos los campos cada vez que se presione el botón en cuestión, de modo que eventualmente pueda procesar múltiples campos que no necesariamente tienen que ser todos rellenados, entonces necesita hacer el required="true" un condicional en su lugar que comprueba si el botón se ha presionado o no. Por ejemplo, deje que evalúe 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 presione un botón diferente. El truco en el ejemplo anterior es que el nombre del botón presionado (que es esencialmente el ID del cliente) se envía como solicitud parámetro y que solo puede comprobar su presencia en el mapa de parámetros de solicitud.

Véase también:

 57
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:24

Además de la respuesta BalusC (muy útil y completa) quiero añadir que cuando se utiliza un <h:commandButton /> validará (obligatorio, validaciones personalizadas) todos los campos en el <h:form /> donde se encuentra el botón de comando, por lo tanto, cuando se necesita utilizar más de un botón de comando se podría considerar que es una buena práctica utilizar diferentes <h:form /> a diferentes responsabilidades para evitar un comportamiento inesperado en las acciones de envío de los botones de comando. Está bien explicado en una respuesta 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, podría tener un dolor de cabeza pensando que el <h:commandButton /> no está disparando su acción, pero es probable que sea un problema de validación que no se ha mostrado.

 6
Author: Cristian Arteaga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:57

He probado esto con envíos no 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 validado solo en Save1 botón enviar.

 5
Author: mnesarco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-09 14:38:22

Cambie el botón de comando de filtro de esta manera para ignorar la validación:

<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>

EDITAR:

El post relacionado en SO, creo que esto resolverá su problema también

JSF 2.0: ¿Cómo omitir la validación de JSR-303 bean?

 2
Author: mprabhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:24