2017-08-23 180 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"

唯一的缺點這種解決方案是,在接口方面,會出現在所有的領域出現一個星號如上所述,但是如果你只是輸入實體,它會搜索它應該的,然後它會更新並刪除星號。

相關問題