2017-08-23 9 views
1

私は複数のフィールドを持ち、少なくとも1つが必要な検索機能、またはそれらのグループを検索しようとしています。JSFで少なくとも1つの/複数のフィールドのグループが必要です

私はStackOverflowの上で見つかった唯一の答えはこの1つである: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が必要であることを決定づける:

の1-タイプ+番号+年

2 - number2の+状態

、3-エンティティ

4-文書タイプ+文書番号

私はcommandButtonをクリックすると、これらのグループ(1,2,3または4)のいずれかが満たされているかどうかを確認する必要があります。

また、グループ自体が必要とされる必要があります。つまり、既に「エンティティ」を満たしているとしましょう。また、年を入力してください。年は「タイプ」を伴っていなければなりません。 '数'。

+1

クライアント側ではなく、Java(サーバー側)で必要なフィールド/グループを確認できます –

+0

はい、それは私の解決策でした。ご協力ありがとうございました。 –

答えて

0

私は、バッキング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; 
} 

このすべてが入っているので、私はちょうどアクション関数がコントローラ内にある間、私はちょうどコマンドボタンのactionListenerにこの関数を置くことができます。

私はちょうどそれらのすべてにそれぞれのブールとmasterRequired関連 requiredパラメータで今
<p:commandButton value="Search" icon="ui-icon-search" 
       actionListener="#{backingBean.checkRequiredFields}" 
       action="#{controller.searchButtonClicked}"/> 

。例えば。

required = "backingBean.typeNumberYear and backingBean.masterRequired"

このソリューションの唯一の欠点は、インターフェイスで、あるすべてのフィールドにアスタリスクが登場するということである次のようtypenumberyear入力で、私が必要と置きます例えば上記のエンティティを入力しただけの場合は、それが想定どおりに検索され、アスタリスクが更新されて削除されます。

関連する問題