Подтвердите группу полей, если требуется, когда по крайней мере один из них заполнен

На основном экране регистрации (с регистрами кнопок записывается экран) есть две панели:

Панель данных:

enter image description here

Адресная панель:

enter image description here

Я могу зарегистрироваться, заполнив только панель данных. Нет необходимости заполнять панель "Адрес". Однако, если заполнено хотя бы одно поле панели "Адрес", необходимо указать все остальные поля на той же панели.

enter image description here

Как я могу это достичь?

Ответ 1

Вам нужно проверить атрибут required, если другие входы отправили непустое значение. Так как это может привести к довольно некоторому шаблону, вот пример запуска с тремя входными компонентами.

<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(), чтобы проверить их для следующих компонентов (компоненты обрабатываются в порядке, как они появляются в дереве компонентов). Таким образом, вам не нужно жестко кодировать идентификаторы клиентов. Вам нужно только убедиться, что имена привязок не конфликтуют с существующими именами управляемого 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}" />

Ответ 2

Сначала вы должны добавить метод для резервного копирования 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 listener на каждый компонент ввода на панели адреса, который обрабатывает этот компонент и обновляет адресную панель.