Подтвердите ах: выбирайтеBooleanCheckbox, только если все остальные входные данные верны - PullRequest
2 голосов
/ 29 февраля 2020

У меня есть форма регистрации в JSF, и я хочу подтвердить, если новый пользователь согласился с условиями только после того, как все остальные поля формы будут действительными. Есть ли способ проверить это в JSF? Вот пример моего кода.

    <h:form id="registerForm">
        <table>

            //Other fields
            <tr>
                <td><h:outputText value="Username " /></td>
                <td><h:inputText id="fusername"
                        value="#{registerUser.username}">
                        <f:validator for="fusername" validatorId="usernameValidator" />
                    </h:inputText></td>
                <td><h:message for="fusername" style="color:red" /></td>
            </tr>

            <tr>
                <td><h:outputText value="Password: " /></td>
                <td><h:inputSecret id="fpassword"
                        value="#{registerUser.password}">
                        <f:validator for="fpassword" validatorId="passwordValidator" />
                    </h:inputSecret></td>
                <td><h:message for="fpassword" style="color:red" /></td>
            </tr>

            <tr>
                <td><h:outputText value="Repeat Password " /></td>
                <td><h:inputSecret id="repeatPassword"
                        value="#{registerUser.repeatPassword}">
                            <f:validator for="repeatPassword" validatorId="repeatPasswordValidator"/>
                            <f:attribute name="originalPassword" value="fpassword" /> 
                        </h:inputSecret></td>
                <td><h:message for="repeatPassword" style="color:red" /></td>
            </tr>
            <tr>
                <td><h:selectBooleanCheckbox
                        value="#{registerUser.agreeTermsAndConditions}" required="true"/></td>
                <td>I agree with the terms and condition.</td>
            </tr>


            <tr>
                <td />
                <td><h:commandButton action="#{registerUser.saveUser}"
                        value="Register" /></td>
            </tr>

        </table>
    </h:form>


</f:view>

Ответы [ 2 ]

4 голосов
/ 29 февраля 2020

При условии, что флажок "Я согласен" является последним UIInput компонентом формы (в среднем дизайне пользовательского интерфейса это обычно так и есть!), Тогда вы можете просто сделать это:

<h:selectBooleanCheckbox ... required="#{not facesContext.validationFailed}" />

А именно, JSF обрабатывает входные компоненты сверху вниз, в том же порядке, в котором они объявлены в представлении. Когда JSF собирается обработать этот флажок, он повторно оценит атрибут required. И в этом случае, когда нет других UIInput компонентов над флажком вызвало ошибку проверки, тогда FacesContext#isValidationFailed() вернет false и, следовательно, компонент будет рассматриваться как требуется.

Но есть и другая проблема: атрибут required для <h:selectBooleanCheckbox> по умолчанию вообще не имеет никакого эффекта. Потому что, когда флажок снят, отправленное значение станет false, а не null. omnifaces.RequiredCheckboxValidator решает эту специфическую проблему.

Итак, всего:

<h:selectBooleanCheckbox ... required="#{not facesContext.validationFailed}">
    <f:validator validatorId="omnifaces.RequiredCheckboxValidator" />
</h:selectBooleanCheckbox>
2 голосов
/ 29 февраля 2020

Вы можете вручную подтвердить свой флажок в вашем методе сохранения, потому что вы прошли проверку. Обратите внимание, что вы хотите установить идентификатор для вашего флажка, чтобы найти его.

public void saveUser(){
  if (!agreeTermsAndConditions) {
    FacesContext context = FacesContext.getCurrentInstance();
    // Tell JSF validation has failed
    context.validationFailed();
    // Get the component
    UIComponent component = context.getViewRoot().findComponent("registerForm:agreeTermsAndConditions");
    // Set it to invalid
    ((EditableValueHolder)component).setValid(false);
    // Create a message
    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "You must agree with the terms and conditions.", null);
    // Register the message for the component
    context.addMessage(component.getClientId(), message);
  }
  else {
    // Agreed, so save the user here
    ...
  }
}

И в вашем представлении добавьте идентификатор, используемый для поиска компонента, и h:message для отображения установленного сообщения.

<h:form id="registerForm">
  <table>
    ...
    <tr>
      <td><h:selectBooleanCheckbox id="agreeTermsAndConditions"
                                   value="#{registerUser.agreeTermsAndConditions}"/></td>
      <td>I agree with the terms and condition.</td>
      <td><h:message for="agreeTermsAndConditions" style="color:red" /></td>
    </tr>
    ...
  </table>
</h:form>

Если вы просто хотите установить флажок независимо от других полей, см .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...