CQ-使用 xtype="datetime" 将日期和时间作为原始字符串获取
CQ-Getting date and time as raw strings using xtype="datetime"
我是 CQ 的新手,我正在向现有表单添加一个新字段。
我想从组件对话框中接受日期和时间作为字符串。如果我分别使用 xtype="datefield" 和 xtype="timefield" ,我可以按照我需要的方式将日期和时间作为字符串获取。但是,UI 看起来很糟糕且不直观,两个单独的字段一个放在另一个下面。
dialog.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 到日期字段中。
dialog.xml
<startDateTime
jcr:primaryType="cq:Widget"
fieldLabel="Start Date & Time"
name="./startDateTime"
dateFormat="d/m/Y"
xtype="datetime"/>
Java 控制器中的代码:
@Property(path = "startDateTime")
private Date startDateTime;
这对我没有用,因为我需要原始字符串形式的日期和时间,以及它们的输入方式。需要将日期和时间作为字符串获取是由声明 'The author should be able to enter a specific date and time that an event starts and ends at a particular city. So the author enters the date, time and timezone of the event' 的要求驱动的。我需要在页面上显示日期和时间并添加日历 link。 valueAsString 选项看起来很有希望,但没有以字符串形式提供日期和时间。我怎样才能做到这一点?
提前致谢
更新:
使用@Sharath 建议的 xtype="compositefield",我可以实现所需的 UI 但不幸的是,当我编辑组件时,这些值会被保留。这些值输入准确,我可以在屏幕上显示它,但是当编辑组件时,字段又变回空的。 java 文件没有变化。
已更新dialog.xml:
<items jcr:primaryType="cq:WidgetCollection">
<eStart jcr:primaryType="cq:Widget"
xtype="compositefield"
fieldLabel="Start"
fieldDescription="Select event start date & 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) 使用 compositefield 并将日期和时间字段放入其中。 Compositefield 在水平行中显示其中的小部件。使用此方法,字段将像日期时间 xtype 一样显示,但仍将值独立存储为字符串。
2) 使用 datetime xtype 并将值读取为 String 而不是 Date,然后将值拆分为 "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 获取所需格式的日期。
您可以在对话框和输出中使用相同的格式。
另一个优点是您可以按日期筛选和排序此类节点,而不是将值保存为字符串。
我是 CQ 的新手,我正在向现有表单添加一个新字段。 我想从组件对话框中接受日期和时间作为字符串。如果我分别使用 xtype="datefield" 和 xtype="timefield" ,我可以按照我需要的方式将日期和时间作为字符串获取。但是,UI 看起来很糟糕且不直观,两个单独的字段一个放在另一个下面。
dialog.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 到日期字段中。
dialog.xml
<startDateTime
jcr:primaryType="cq:Widget"
fieldLabel="Start Date & Time"
name="./startDateTime"
dateFormat="d/m/Y"
xtype="datetime"/>
Java 控制器中的代码:
@Property(path = "startDateTime")
private Date startDateTime;
这对我没有用,因为我需要原始字符串形式的日期和时间,以及它们的输入方式。需要将日期和时间作为字符串获取是由声明 'The author should be able to enter a specific date and time that an event starts and ends at a particular city. So the author enters the date, time and timezone of the event' 的要求驱动的。我需要在页面上显示日期和时间并添加日历 link。 valueAsString 选项看起来很有希望,但没有以字符串形式提供日期和时间。我怎样才能做到这一点?
提前致谢
更新: 使用@Sharath 建议的 xtype="compositefield",我可以实现所需的 UI 但不幸的是,当我编辑组件时,这些值会被保留。这些值输入准确,我可以在屏幕上显示它,但是当编辑组件时,字段又变回空的。 java 文件没有变化。
已更新dialog.xml:
<items jcr:primaryType="cq:WidgetCollection">
<eStart jcr:primaryType="cq:Widget"
xtype="compositefield"
fieldLabel="Start"
fieldDescription="Select event start date & 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) 使用 compositefield 并将日期和时间字段放入其中。 Compositefield 在水平行中显示其中的小部件。使用此方法,字段将像日期时间 xtype 一样显示,但仍将值独立存储为字符串。
2) 使用 datetime xtype 并将值读取为 String 而不是 Date,然后将值拆分为 "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 获取所需格式的日期。 您可以在对话框和输出中使用相同的格式。
另一个优点是您可以按日期筛选和排序此类节点,而不是将值保存为字符串。