Как сделать конкретный c selectItem из p: selectOneMenu обязательным? - PullRequest
0 голосов
/ 29 января 2020
    <p:selectOneMenu id="console" value="#{selectOneMenuView.console}" style="width:125px">
        <f:selectItem itemLabel="Select One" itemValue="" />
                <c:if test="${javaMB.pageTypeId eq 1}">
                    <f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />                                              
                </c:if>             
                <c:if test="${javaMB.pageTypeId eq 2}">
                    <f:selectItem itemLabel="PS4" itemValue="PS4" />
                    <f:selectItem itemLabel="Sega" itemValue="Sega" />                          
                </c:if>
                <c:if test="${javaMB.pageTypeId eq 3}">
                    <f:selectItem itemLabel="Wii" itemValue="Wii" />                                                
                </c:if>
    </p:selectOneMenu>  

Как сделать selectItem в selectOneMenu необходимым?

Если пользователь заходит на страницу 2, тогда мне нужно указать требуемое значение Sega?

Я пытался

                    <f:selectItem itemLabel="Sega" itemValue="Sega" required="true"/>

Также я пытался

                    <f:selectItem itemLabel="Sega" itemValue="Sega" required="javaMB.write"/>

Этот элемент является обязательным для пользователя, чтобы выбрать условие "javaMB.write", если он использует page2

Мне не нужно указывать весь p: selectOneMenu.

1 Ответ

0 голосов
/ 29 января 2020

Когда проверка поля ввода зависит от некоторых пользовательских и сложных условий (очень необычно для вас), одним из решений будет определение пользовательского FacesValidator для поля ввода (при передаче дополнительных значений в качестве компонента f:attribute) и реализуйте свои собственные правила проверки.

x html пример

<h:form id="form">
    <p:messages id="messages"/>

    <p:selectOneMenu id="console" value="#{javaMB.console}" 
                     validator="customValidator">

        <f:attribute name="pageTypeId" value="#{javaMB.pageTypeId}" />

        <f:selectItem itemLabel="Select One" itemValue="" />
        <c:if test="${javaMB.pageTypeId eq 1}">
            <f:selectItem itemLabel="Xbox One" itemValue="Xbox One" />                                              
        </c:if>             
        <c:if test="${javaMB.pageTypeId eq 2}">
            <f:selectItem itemLabel="PS4" itemValue="PS4" />
            <f:selectItem itemLabel="Sega" itemValue="Sega" />                          
        </c:if>
        <c:if test="${javaMB.pageTypeId eq 3}">
            <f:selectItem itemLabel="Wii" itemValue="Wii" />                                                
        </c:if>
    </p:selectOneMenu>  

    <p:commandButton  value="Submit" process="@form" update=":form:messages"/>

</h:form>

Валидатор пользовательских лиц

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(value = "customValidator")
public class CustomValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        //get input field value
        String consoleName = (String) value;

        //get some other value passed as component's attribute
        int pageTypeId = (Integer) component.getAttributes().get("pageTypeId");

        System.out.printf("Page type: %d, Console: %s\n", pageTypeId, consoleName);

        //if input is required (not null) for page 2, check if input is null
        if (pageTypeId == 2 && consoleName == null) {
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Input is required", ""));
        }

        //then implement any logic based on your requirements. For your unusual case,
        if (pageTypeId == 2) {
            if (!consoleName.equals("Sega")) {
                throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_WARN, "Sega is required for page type 2", ""));
            }
        }
    }
}

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

С другой стороны, если честно, когда-то у меня было похожее требование: некоторые юристы настаивали на том, что все «выпадающие» опции всегда перечислены, и что пользователь явно информирован, если «неправильный / недопустимый» параметр выбран. Это было так странно для меня с инженерной точки зрения, но я думаю, это имело смысл с юридической точки зрения.

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