Liferay 7:如何在Freemarker的Asset Publisher类型ADT中获取DDLRecord动态属性
我来帮你解决这个问题——在Asset Publisher的显示模板(ADT)里用Freemarker获取DDLRecord的动态属性,同时处理日期属性展示最新记录的需求。既然你必须用Asset Publisher的筛选器,那我们可以把筛选配置和Freemarker代码结合起来实现。
一、先通过Asset Publisher筛选器配置,锁定最新日期的记录
首先在Asset Publisher的配置页面完成基础筛选和排序设置:
- 切换到筛选标签,选择目标动态数据列表(DDL)作为资产来源
- 切换到排序标签,选中你的日期类动态属性作为排序字段,设置排序规则为降序(这样最新日期的记录会排在返回结果的最前面)
- 如果只需要展示单条最新记录,可以在显示设置里把「要显示的资产数量」设为1
这样配置后,Asset Publisher会先帮我们把符合要求的DDLRecord筛选出来,接下来只需要在ADT里用Freemarker提取动态属性即可。
二、在Freemarker ADT中获取DDLRecord的动态属性
在Asset Publisher的Freemarker ADT里,遍历的资产对象是通用的${asset}(即AssetEntry),我们需要先把它转换为DDLRecord对象,再操作动态属性。
1. 转换AssetEntry为DDLRecord
先判断当前资产是否为DDLRecord类型,再通过getModel()方法获取对应实例:
<#assign className = asset.getClassName() /> <#if className == "com.liferay.dynamic.data.lists.model.DDLRecord"> <#assign ddlRecord = asset.getModel() /> <!-- 这里可以开始操作ddlRecord对象 --> </#if>
2. 获取动态属性值
DDLRecord的动态属性存储在对应字段中,有两种常用获取方式:
方式一:按字段名精准获取
如果你知道目标动态属性的字段名(比如日期字段叫activityDate),可以直接用getFieldValue()方法:
<#assign latestDate = ddlRecord.getFieldValue("activityDate") /> <p>最新活动日期:${latestDate?date("yyyy-MM-dd HH:mm")}</p>
注意:
getFieldValue()返回的是Serializable类型,日期类型需要用Freemarker的?date指令格式化展示。
方式二:遍历所有动态字段
如果需要批量展示所有动态属性,可以用getFieldValues()方法获取字段集合后逐个处理:
<#assign fieldValues = ddlRecord.getFieldValues() /> <ul class="ddl-properties"> <#list fieldValues as fieldValue> <li>${fieldValue.getName()}: ${fieldValue.getValue()?string}</li> </#list> </ul>
这里
fieldValue.getName()是动态字段的定义名称,fieldValue.getValue()是字段值,可根据类型做对应格式化(比如日期、数字等)。
三、完整示例代码
把上述步骤整合,一个可用的ADT示例如下:
<#assign entries = entries![] /> <#list entries as asset> <#assign className = asset.getClassName() /> <#if className == "com.liferay.dynamic.data.lists.model.DDLRecord"> <#assign ddlRecord = asset.getModel() /> <div class="ddl-record-card"> <h4>${ddlRecord.getTitle(locale)}</h4> <p class="record-date">最新日期:${ddlRecord.getFieldValue("activityDate")?date("yyyy年MM月dd日")!""}</p> <p class="record-location">活动地点:${ddlRecord.getFieldValue("activityLocation")!""}</p> <p class="record-desc">活动描述:${ddlRecord.getFieldValue("activityDesc")!""}</p> </div> </#if> </#list>
注意事项
- 确保动态字段名称拼写和DDL定义完全一致(区分大小写)
- 字段值可能为空时,记得用
!""做空值处理,避免页面报错 - 日期格式化模式可按需调整,比如
"MM/dd/yyyy"或"yyyy-MM-dd"
内容的提问来源于stack exchange,提问作者Cenobyte321

