基本的な登録画面(ボタン登録で画面を記録)には、2つのパネルがあります。
データパネル:
アドレスパネル:
データパネルだけで登録できます。アドレスパネルに入力する必要はありません。ただし、アドレスパネルの少なくとも1つのフィールドが入力されている場合は、同じパネルの他のすべてのフィールドが必要です。
どうすればこれを達成できますか?
基本的な登録画面(ボタン登録で画面を記録)には、2つのパネルがあります。
データパネル:
アドレスパネル:
データパネルだけで登録できます。アドレスパネルに入力する必要はありません。ただし、アドレスパネルの少なくとも1つのフィールドが入力されている場合は、同じパネルの他のすべてのフィールドが必要です。
どうすればこれを達成できますか?
required
他の入力が空でない値を送信した場合は、属性をチェックインする必要があります。これによりかなりの定型文が作成される可能性があるため、入力コンポーネントが3つしかないキックオフの例を次に示します。
<h:form id="form">
<h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" />
<h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" />
<h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" />
</h:form>
別の方法は、コンポーネントをビューにバインドしUIInput#getValue()
、前のコンポーネントの値UIInput#getSubmittedValue()
をチェックし、次のコンポーネントをチェックするために使用することです(つまり、コンポーネントは、コンポーネントツリーに表示される順序で処理されます)。このように、クライアントIDをハードコーディングする必要はありません。バインディング名が既存のマネージドBean名と競合しないことを確認する必要があるだけです。
<h:inputText binding="#{input1}" value="#{bean.input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" />
<h:inputText binding="#{input2}" value="#{bean.input2}" required="#{empty input1.value and empty input3.submittedValue}" />
<h:inputText binding="#{input3}" value="#{bean.input3}" required="#{empty input1.value and empty input2.value}" />
コンポーネントが増えると、これによって醜い定型文が作成されることがわかります。JSFユーティリティライブラリOmniFacesには<o:validateAllOrNone>
、正確な目的のためのバリデーターがあります。ライブデモもご覧ください。quesitonタグに基づいて、OmniFacesを使用しているため、次のように設定されているはずです。
<o:validateAllOrNone components="input1 input2 input3" />
<h:inputText id="input1" value="#{bean.input1}" />
<h:inputText id="input2" value="#{bean.input2}" />
<h:inputText id="input3" value="#{bean.input3}" />
まず、バッキングBeanに次のようなメソッドを追加する必要があります。
public boolean isAddressPanelRequired() {
// Check if at least one field is entered
// and return true if it is and false othervise
}
アドレスパネルの各入力要素には、required="#{backingBean.addressPanelRequired}"
次に、そのコンポーネントを処理するアドレスパネルの各入力コンポーネントにonblur ajaxリスナーを追加し、アドレスパネルを更新します。