При необходимости проверьте группу полей, если заполнено хотя бы одно из них.
На базовом экране регистрации (с кнопкой регистрации записей экрана) есть две панели:
Панель данных:
Адресная панель:
Я могу зарегистрироваться, заполнив только панель данных. Нет необходимости заполнять адресную панель. Однако, если заполнено хотя бы одно поле панели "Адрес", то все остальные поля в той же панели должны быть обязательными.
Как мне этого добиться?
2 ответа
Вы должны проверить в 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()
проверить их на наличие следующих компонентов (компоненты обрабатываются именно в том порядке, в котором они отображаются в дереве компонентов). Таким образом, вам не нужно жестко кодировать идентификаторы клиентов. Вам нужно только убедиться, что имена привязок не конфликтуют с существующими именами управляемых компонентов.
<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>
валидатор для точной цели. Смотрите также живую демонстрацию. Исходя из ваших тегов квестов, вы используете 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}" />
Сначала вы должны добавить метод для поддержки бина примерно так:
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 на каждый компонент ввода на адресной панели, который обрабатывает этот компонент, и обновите адресную панель.