CQ-使用 xtype= 获取日期和时间作为原始字符串= "datetime"



我是CQ的新手,我正在向现有表单添加一个新字段。我想接受组件对话框中的日期和时间作为字符串。如果我分别使用 xtype="datefield" 和 xtype="timefield",我可以按照我需要的方式将日期和时间作为字符串获取。但是,UI 看起来很糟糕且没有意义,两个单独的字段一个放在另一个下面。

对话框.xml:

<startDate
    jcr:primaryType="cq:Widget"
    fieldLabel="Event Start Date"
    fieldDescription="Select a date "
    emptyText="Event start date "
    name="./startDate"
    format="d/m/Y"
    xtype="datefield" />
<startTime
    jcr:primaryType="cq:Widget"
    fieldLabel="Event Start Time"
    fieldDescription="Select a time "
    emptyText="Event start time "
    name="./startTime"
    xtype="timefield" />

控制器中的 Java 代码:

@Property(path = "startDate")
private String startDate;
@Property(path = "startTime")
private String startTime;

如果我使用 xtype="datetime",UI 看起来就像我喜欢的那样,但值会转换为 UTC 到日期字段。

对话框.xml

<startDateTime
   jcr:primaryType="cq:Widget"
   fieldLabel="Start Date &amp; Time"
   name="./startDateTime"
   dateFormat="d/m/Y"
   xtype="datetime"/>

控制器中的 Java 代码:

@Property(path = "startDateTime")
private Date startDateTime;

这对我来说没有用,因为我需要日期和时间作为原始字符串,输入它们的方式。获取日期和时间作为字符串的需求是由以下要求驱动的:"作者应该能够输入事件在特定城市开始和结束的特定日期和时间。因此,作者输入事件的日期,时间和时区。我需要在页面上显示日期和时间,并添加一个日历链接。valueAsString 选项看起来很有前途,但没有给期和时间作为字符串。我怎样才能做到这一点?

提前致谢

更新:使用 @Sharath 建议的 xtype="compositefield",我可以实现所需的 UI,但不幸的是,当我编辑组件时,这些值被保留了。输入的值准确,我可以在屏幕上显示它,但是当编辑组件时,字段将恢复为空。java 文件中没有更改。

更新的对话框.xml:

<items jcr:primaryType="cq:WidgetCollection">
    <eStart jcr:primaryType="cq:Widget"
            xtype="compositefield"
            fieldLabel="Start"
            fieldDescription="Select event start date &amp; time">
        <items jcr:primaryType="cq:WidgetCollection">
            <startDate
                jcr:primaryType="cq:Widget"
                emptyText="Event start date "
                name="./startDate"
                format="d/m/Y"
                xtype="datefield"
                width="240"/>
            <startTime
                jcr:primaryType="cq:Widget"
                emptyText="Event start time "
                name="./startTime"
                xtype="timefield"
                width="180"/>
        </items>
    </eStart>
     *
     *
</items>

有两种方法可以做到这一点:

1) 使用复合字段并将日期和时间字段放在其中。复合字段在水平行中显示其中的小部件。使用此方法,字段将像日期时间 xtype 一样显示,但仍将值独立存储为字符串。

2) 使用日期时间 xtype 并将值读取为字符串而不是日期,并将值拆分为"T"。(我会选择1)

我认为我对复合字段的看法是错误的,它显示并存储值,但下次不会读回值(尽管向返回这些值的节点发出了 get 请求)

这是一个替代方案

{
  xtype:"panel",
  border:false,
  layout:"hbox",
  jcr:  primaryType:"cq:Widget",
  items:{
    jcr:    primaryType:"cq:WidgetCollection",
    label:{
      flex:"30",
      xtype:"label",
      jcr:      primaryType:"cq:Widget",
      text:"Date Time"
    },
    datefield:{
      flex:"40",
      xtype:"datefield",
      name:"./date",
      jcr:      primaryType:"cq:Widget"
    },
    timefield:{
      flex:"30",
      xtype:"timefield",
      name:"./time",
      jcr:      primaryType:"cq:Widget"
    }
  }
}

我认为日期时间是更简单的选择。使用 Date 对象,可以使用 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html 获取所需格式的日期。您可以在对话框和输出中使用相同的格式。

另一个优点是可以按日期对这种类型的节点进行筛选和排序,而不是将值另存为字符串。

最新更新