PrimeFaces 3.0 - нужно исправить или обойти«добавить 6 лет» дефект - PullRequest
3 голосов
/ 08 июля 2011

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

Сообщается о дефекте в системе отслеживания проблем PrimeFaces. Добавьте звезду, чтобы отдать свой голос команде разработчиков PrimeFaces, чтобы исправить это: ссылка на дефект в их трекере проблем

Обсуждается здесь на форуме поддержки PrimeFaces.

По-прежнему существует в PrimeFaces 3.0-M3-SNAPSHOT

ПРОБЛЕМА:

Я использую элемент управления PrimeFaces 3.0 <p:calendar>, чтобы позволить пользователю просматривать и редактировать Date объекты, которые содержат как дату, так и время. Кажется, что в элементе управления JavaScript есть какой-то дефект, который заставляет его добавлять странное смещение к дате где-то около +6 лет.

Я настроил некоторый код для демонстрации проблемы.

В первом <p:calendar> я использую управляемый компонент Date, который изначально равен нулю. Контроль в порядке с этим. Он откроет и установит начальное значение на текущую дату с обнулением часа / минуты / секунды. Я могу использовать ползунки для обычной установки часов, минут и секунд.

Associated with initially null managed bean property - displays ok

Associated with initially null managed bean property - opens ok

Во втором <p:calendar> я использую управляемый компонент Date, который изначально установлен на new Date(). Это создаст новый объект Date с текущим временем сервера. Элемент управления не хорошо с этим. Хотя дата / время, отображаемые в поле <p:calendar>, изначально выглядят корректно, в будущем они будут изменены на какое-то странное значение, когда откроется элемент управления JavaScript. При закрытии элемента управления выбора дата на управляемом бине устанавливается в странное значение.

Associated with initially populated managed bean property - displays ok

Associated with initially populated managed bean property - opens NOT ok

Другая проблема, которая может или не может быть связана, когда я пытаюсь использовать пользовательский format для даты:

ddHHmm'Z'MMMyy

Этот формат используется моим клиентом в его домене, и мне нужно как-то его поддерживать. Средство JavaScript <p:calendar> даже не открывается, когда я пытаюсь щелкнуть по полю. Что-то в паттерне (который прекрасно работает в Java SimpleDateFormat) ломает его. В документации PrimeFaces об этом ничего не говорится.

Associated with initially null value and has custom pattern - cannot open control!

ВОПРОС: У кого-нибудь есть обходной путь для этих <p:calendar> проблем?

ОБНОВЛЕНИЕ - исходный код:

Составной компонент, обертывающий <p:calendar>:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:p="http://primefaces.prime.com.tr/ui"
        xmlns:composite="http://java.sun.com/jsf/composite">

    <composite:interface 
            displayName="calendar"
            shortDescription="Wrapper for a PrimeFaces p:calendar">
        <composite:attribute 
            name="dateValue" 
            displayName="dateValue"
            type="java.util.Date"
            required="true"
            shortDescription="EL expression that evaluates to a java.util.Date on a backing bean" />
        <composite:attribute 
            name="pattern" 
            displayName="pattern"
            type="java.lang.String"
            default="dd/MM/yyyy HH:mm:ss"
            shortDescription="Pattern used to format the underlying Date value. See SimpleDatePattern class documentation for pattern syntax. NOTE: p:calendar does not appear to support some complex patterns." />
        <composite:attribute
            name="ajaxRenderTargets"
            displayName="ajaxRenderTargets"
            type="java.lang.String"
            default="@none"
            shortDescription="Space-separated list of element ids that need to be rendered by Ajax when the calendar value changes. See f:ajax render attribute documentation." />
        <composite:attribute 
            name="tooltip" 
            displayName="tooltip"
            type="java.lang.String"
            default=""
            shortDescription="String to be used as the tooltip for this component" />
        <composite:attribute 
            name="label" 
            displayName="label"
            type="java.lang.String"
            default=""
            shortDescription="Label for this component. May be used in FacesMessages." />
        <composite:attribute 
            name="required" 
            displayName="required"
            type="java.lang.Boolean"
            default="false" />
    </composite:interface>

    <composite:implementation>
        <p:calendar
                id="pCalendarInsideCC"
                value="#{cc.attrs.dateValue}" 
                pattern="#{cc.attrs.pattern}"
                readOnlyInputText="true"
                showButtonPanel="false"
                popupIconOnly="false"
                showOn="focus"
                mode="popup"
                navigator="true"
                pages="1"
                showOtherMonths="true"
                selectOtherMonths="false"
                alt="#{cc.attrs.tooltip}"
                title="#{cc.attrs.tooltip}"
                required="#{cc.attrs.required}"
                label="#{cc.attrs.label}">
            <p:ajax 
                    event="valueChange"
                    update="#{cc.attrs.ajaxRenderTargets}" />
            <p:ajax 
                    event="change"
                    update="#{cc.attrs.ajaxRenderTargets}" />
        </p:calendar>
    </composite:implementation>
</html>

Страница, содержащая ссылки на составные компоненты:

<ui:composition template="/templates/primefaces/masterLayout.xhtml">

    <ui:param name="title" value="#{bundle.primeFacesCalendarCC_description}" />

    <ui:define name="content">
        <h:form id="contentForm">
            <h:panelGrid columns="3">
                <h:outputText
                        value="Initially empty Date reference on managed bean" />
                <sandbox:primeFacesCalendar
                        id="calendarCC1"
                        dateValue="#{primeFacesTestBean.userSubmittedDateTime}"
                        ajaxRenderTargets="messagesCalendar1 :ajaxRenderTargetsInTemplate"
                        required="true" />
                <p:messages 
                        id="messagesCalendar1" 
                        showSummary="false" 
                        showDetail="true" />

                <h:outputText
                        value="A 'new Date()' reference on managed bean" />
                <sandbox:primeFacesCalendar
                        id="calendarCC2"
                        dateValue="#{primeFacesTestBean.newDateInstance}"
                        ajaxRenderTargets="messagesCalendar2 :ajaxRenderTargetsInTemplate"
                        required="true" />
                <p:messages 
                        id="messagesCalendar2" 
                        showSummary="false" 
                        showDetail="true" />

                <h:outputText
                        value="Initially empty Date using ddHHmm'Z'MMMyy pattern" />
                <sandbox:primeFacesCalendar
                        id="calendarCC3"
                        dateValue="#{primeFacesTestBean.userSubmittedDateTime}"
                        ajaxRenderTargets="messagesCalendar2 :ajaxRenderTargetsInTemplate"
                        pattern="ddHHmm'Z'MMMyy"
                        required="true" />
                <p:messages 
                        id="messagesCalendar3" 
                        showSummary="false" 
                        showDetail="true" />

            </h:panelGrid>
        </h:form>
    </ui:define>

</ui:composition>

<ui:composition template="/templates/primefaces/masterLayout.xhtml">

    <ui:param name="title" value="#{bundle.primeFacesCalendarCC_description}" />

    <ui:define name="content">
        <h:form id="contentForm">
            <h:panelGrid columns="3">
                <h:outputText
                        value="Initially empty Date reference on managed bean" />
                <sandbox:primeFacesCalendar
                        id="calendarCC1"
                        dateValue="#{primeFacesTestBean.userSubmittedDateTime}"
                        ajaxRenderTargets="messagesCalendar1 :ajaxRenderTargetsInTemplate"
                        required="true" />
                <p:messages 
                        id="messagesCalendar1" 
                        showSummary="false" 
                        showDetail="true" />

                <h:outputText
                        value="A 'new Date()' reference on managed bean" />
                <sandbox:primeFacesCalendar
                        id="calendarCC2"
                        dateValue="#{primeFacesTestBean.newDateInstance}"
                        ajaxRenderTargets="messagesCalendar2 :ajaxRenderTargetsInTemplate"
                        required="true" />
                <p:messages 
                        id="messagesCalendar2" 
                        showSummary="false" 
                        showDetail="true" />

                <h:outputText
                        value="Initially empty Date using ddHHmm'Z'MMMyy pattern" />
                <sandbox:primeFacesCalendar
                        id="calendarCC3"
                        dateValue="#{primeFacesTestBean.userSubmittedDateTime}"
                        ajaxRenderTargets="messagesCalendar2 :ajaxRenderTargetsInTemplate"
                        pattern="ddHHmm'Z'MMMyy"
                        required="true" />
                <p:messages 
                        id="messagesCalendar3" 
                        showSummary="false" 
                        showDetail="true" />

            </h:panelGrid>
        </h:form>
    </ui:define>

</ui:composition>

Управляемый компонент:

@ManagedBean(name="primeFacesTestBean")
@SessionScoped
public class PrimeFacesTestBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Date userSubmittedDateTime = null;
    private Date newDateInstance = new Date();

    public void setUserSubmittedDateTime(Date userSubmittedDateTime) {
        this.userSubmittedDateTime = userSubmittedDateTime;
    }

    public Date getUserSubmittedDateTime() {
        return userSubmittedDateTime;
    }

    public void setNewDateInstance(Date newDateInstance) {
        this.newDateInstance = newDateInstance;
    }

    public Date getNewDateInstance() {
        return newDateInstance;
    }

    public void calendarValueChangeHandler(AjaxBehaviorEvent event) {
        //System.out.println("calendar value has been changed (Ajaxified)");
    }

}

1 Ответ

1 голос
/ 25 августа 2011

Исправлено по состоянию на 18 августа в 3.0-M3-SNAPSHOT:
http://code.google.com/p/primefaces/issues/detail?id=2215

Подтверждено, что оно работает правильно в моем веб-приложении, используя 3.0-M3-SNAPSHOT от 23 августа.1006 * ПРИМЕЧАНИЕ. Проблема с нестандартным форматом не устранена.Я не уверен, что это исправлено или все еще проблема.

...