Для формы я установил валидатор для окна редактирования, например:

<xp:inputText
    id="inpRiskFactors" 
    styleClass="inputEscalation"
    value="#{matterBean.matter.escRiskFactors}" 
    validator="#{matterValidators.valEscRiskFactors}"...

Вот отрывок из моего метода проверки:

public void valEscRiskFactors(FacesContext facesContext, UIComponent component, Object value) {        
        utils.printToConsole(this.getClass().getSimpleName().toString() + " - valEscRiskFactors(...), value = " + value.toString());
        String msg = null;
        if (value.toString().replaceAll("\\s+","").equals("")){
            msg = matterProp.getProperty("msg_valid_esc_risk_factors");
            FacesMessage message = new FacesMessage(msg);
            throw new ValidatorException(message);
        }       
    }

Мне было интересно, могу ли я изменить / установить свойство styleclass вызывающего компонента (компонент UIComponent) из этого метода?

Для пользователя было бы неплохо применить некоторый CSS к элементам управления xp:, которые необходимы и не проходят проверку.

Кто-нибудь знает, как этого добиться?

0
Patrick Kwinten 21 Сен 2018 в 09:08

2 ответа

Лучший ответ

Явный вызов метода setStyleClass для UIComponent, приведенный к XspInputText, работает для меня

((XspInputText)component).setStyleClass("my-class");

Если вы не хотите преобразовывать, но хотите применить styleClass к любому компоненту, поддерживающему такое свойство, отражение Java может помочь:

try {
    Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
    if (setStyleClass != null) {
        setStyleClass.invoke(component, "my-class");
    }
} catch (SecurityException e) {} 
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}

Вы можете добавить styleClass вместо замены

try {
    String styleClass = null;
    Method getStyleClass = component.getClass().getMethod("getStyleClass");
    if (getStyleClass != null) {
        styleClass = (String)getStyleClass.invoke(component, (Object[])null);
    }
    Method setStyleClass = component.getClass().getMethod("setStyleClass", String.class);
    if (setStyleClass != null) {
        String newStyleClass = StringUtil.isNotEmpty(styleClass) ? styleClass.concat(" my-class") : "my-class";
        setStyleClass.invoke(component, newStyleClass);
    }
} catch (SecurityException e) {} 
catch (NoSuchMethodException e) {}
catch (IllegalArgumentException e) {}
catch (IllegalAccessException e) {}
catch (InvocationTargetException e) {}
1
Stanislaw Guzik 21 Сен 2018 в 07:28

Большинство (все?) Стандартных элементов управления XPages используют для проверки стандарт WAI-ARIA и поэтому автоматически получает для свойства aria-invalid значение "true", когда элемент управления недействителен.

Это означает, что вы можете использовать CSS для стилизации элемента управления вводом. Вы можете, например, изменить стиль фона и границы, если элемент управления недействителен:

[aria-invalid=true] {
    background-color: #fee;
    border-color: red;
} 
5
Per Henrik Lausten 21 Сен 2018 в 06:20