You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:15:29