2017-08-23 181 views
1

我试图做一个搜索功能,我有多个领域,至少需要其中一个,或他们的一组。JSF所需的至少一个/多个字段组

我StackOverflow上发现的唯一的答案是这样的一个:How to validate if at least one of multiple input fields is entered?

而且有2个解决方案有:一是使用Omnifaces(我不能因项目要求使用),另一种是不优雅,因为当字段数量很大时它会增长很多。

我有这些领域例如:

   <p:selectOneMenu value="#{backingBean.type}"id="type"> 
        <f:selectItem itemLabel="#{constantsController.SELECT_TYPE_HEADER}" 
         itemDisabled="true" /> 
        <f:selectItems 
         value="#{constantsController.getTypes().entrySet()}" 
         var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" /> 
       </p:selectOneMenu> 

       <p:inputText id="number" value="#{backingBean.number}"/> 

       <p:inputText id="year" value="#{backingBean.year}"/> 

       <p:inputText id="number2" value="#{backingBean.number2 }"/> 

       <p:selectOneMenu value="#{backingBean.state}" 
        id="state" filter="true" filterMatchMode="startsWith"> 
        <f:selectItem itemLabel="Choose its state" disabled="true" /> 
        <f:selectItems value="#{constantsController.getStates().entrySet()}" 
         var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" /> 
       </p:selectOneMenu> 

       <p:selectOneMenu id="entity" 
        value="#{backingBean.entity }"> 
        <f:selectItem itemLabel="Select entity" 
         itemDisabled="true" /> 
        <f:selectItem itemLabel="Entity1" itemValue="1"></f:selectItem> 
        <f:selectItem itemLabel="Entity2" itemValue="2"></f:selectItem> 
       </p:selectOneMenu> 

       <p:selectOneMenu id="documentType" 
        value="#{backingBean.documentType}"> 
        <f:selectItems 
         value="#{constantsController.getDocumentTypes().entrySet()}" 
         var="entry" itemValue="#{entry.key}" itemLabel="#{entry.value}" /> 
       </p:selectOneMenu> 
       <p:inputText id="documentNumber" value="#{backingBean.documentNumber}"/> 

因此,大家可以看到,我有多个领域。和要求决定了我需要以下要求(我会写的id)之一:

1类型+编号+年

2 - 数字2 +状态

3-实体

4-文档类型+文档编号

所以我当我点击commandButton时,我需要这个来检查这些组中的一个(1,2,3或4)是否被填充。

此外,这些组本身也需要被要求,也就是说我已经填充了“实体”,并且我还填写了“年份”,它不能让我提前进行,因为年份需要伴随'类型'和'数'。

+1

您可以在Java(服务器端)检查所需的字段/组,而不是在客户端检查 –

+0

是的,这是我的解决方案。感谢您的帮助。 –

回答

0

我通过将backing bean中的布尔值与每个字段/字段组相关联来解决此问题。这不是一个优雅的解决方案,但我没有找到任何其他解决方案。

所以我所做的就是通过字段组中的支持Bean的布尔与true值初始化定义:

private boolean typeNumberYear = true; 
private boolean number2State = true; 
private boolean entityRequired = true; 
private boolean documentTypeDocumentName = true; 
private boolean masterRequired = true; 

然后验证它们:

public void checkRequiredFields(){ 

    if(!type.equals("") && number != 0 && year != 0) 
     typeNumberYear = false; 
    if(number2 != 0 && !state.equals("")) 
     number2State = false; 
    if(!entity.equals("")) 
     entityRequired= false; 
    if(!documentType.equals("") && documentNumber != 0) 
     documentTypeDocumentName = false; 

    if(!typeNumberYear || !number2State || !entityRequired || !documentTypeName) 
     masterRequired = false; 
} 

因为这一切都是在支持bean,我可以将这个函数放在命令按钮的actionListener上,而动作函数仍然在控制器中。

<p:commandButton value="Search" icon="ui-icon-search" 
       actionListener="#{backingBean.checkRequiredFields}" 
       action="#{controller.searchButtonClicked}"/> 

现在在required参数我只是相关的各自的布尔和masterRequired上所有的人。例如。在typenumberyear投入,我把所需的如下:

required = "backingBean.typeNumberYear and backingBean.masterRequired"

唯一的缺点这种解决方案是,在接口方面,会出现在所有的领域出现一个星号如上所述,但是如果你只是输入实体,它会搜索它应该的,然后它会更新并删除星号。

相关问题