我试图做一个搜索功能,其中我有多个字段,至少需要其中一个字段或一组字段。
我在StackOverflow上找到的唯一答案是:How to validate if at least one of multiple input fields is entered?
那里有两个解决方案:一个使用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- type + number + year
2- number2 + state
3-实体
4- documentType + documentNumber
所以当我单击commandButton时,我需要这个来检查这些组(1,2,3或4)中的一个是否被填充。
此外,这些群体本身需要被要求,即我们说我已经填满了实体&#39;,而且我也填补了这一年,它不能让我从一年起进步需要伴随着&#39;类型&#39;和&#39;数字&#39;。
答案 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;
}
由于所有这些都在支持bean中,我可以将此函数放在命令按钮的actionListener上,而action函数仍然在控制器中。
<p:commandButton value="Search" icon="ui-icon-search"
actionListener="#{backingBean.checkRequiredFields}"
action="#{controller.searchButtonClicked}"/>
现在在required
参数中,我只关联了所有这些参数上的相应布尔值和masterRequired。例如。在type
,number
和year
输入中,我按要求提供了以下内容:
required = "backingBean.typeNumberYear and backingBean.masterRequired"
此解决方案的唯一缺点是,在界面中,将在上面指出的所有字段上显示星号,但如果您只是输入实体,它将按预期进行搜索,然后它会更新并删除星号。