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

OpenCms与JSTL自定义contentload:按日期降序列表文件问题求助

问题描述

刚接触OpenCms与JSTL,需要列出带有"data"属性字段的文件,尝试了以下代码:

<c:forEach items="<%=folderFilesList%>" var="folderFile" varStatus="counterFile">
    <c:set var="fileName">${fn:toLowerCase(folderFile.getName())}</c:set>
    <c:set var="fileUri">${fn:replace(folderFile.getRootPath(),'/sites/default','')}</c:set>
    <c:set var="fileDate"><cms:property name="data" file="${fileUri}"/></c:set>
    <c:if test="${folderFile.getTypeId() == 4000}">
        <cms:contentload collector="singleFile" param="${fileDate}" pageIndex="${page}"  pageSize="${pagesize}" editable="false">

但未得到预期结果,报错提示无法访问资源或参数为空(尽管已正确设置)。由于无法直接在平台调试,请问如何实现资源读取并按日期降序列出文件?

解决方案

1. 修复资源属性读取逻辑

你的代码存在两个核心问题:

  • 混合Java脚本变量<%=folderFilesList%>与JSTL标签,容易引发上下文冲突,建议统一使用OpenCms原生标签处理资源。
  • <cms:property>获取属性时,无需手动替换根路径,直接传入folderFile(需为CmsResource实例)即可:
    <c:set var="fileDate"><cms:property name="data" resource="${folderFile}" /></c:set>
    

2. 用OpenCms Collector高效筛选排序

无需手动遍历所有文件,直接通过cms:contentload标签筛选带data属性的资源并排序,这是OpenCms推荐的做法:

<cms:contentload 
    collector="allInFolder" 
    param="/你的目标文件夹路径|typeId:4000|property:data" 
    sortBy="data" 
    sortOrder="desc"
    pageIndex="${page}" 
    pageSize="${pagesize}" 
    editable="false">
    <!-- 输出资源信息 -->
    <div>
        名称:${cms:resource().getName()}
        日期:<cms:property name="data" resource="${cms:resource()}" />
        路径:${cms:resource().getRootPath()}
    </div>
</cms:contentload>

参数说明:

  • collector="allInFolder":遍历指定文件夹下的所有资源
  • param:用|分隔条件,依次为目标文件夹、资源类型ID(4000)、存在data属性
  • sortBy="data":按data属性排序
  • sortOrder="desc":降序排列

3. 过滤属性为空的资源

如果部分资源的data属性可能为空,添加判断过滤:

<cms:contentload 
    collector="allInFolder" 
    param="/你的目标文件夹路径|typeId:4000" 
    pageIndex="${page}" 
    pageSize="${pagesize}" 
    editable="false">
    <c:set var="fileDate"><cms:property name="data" resource="${cms:resource()}" default="" /></c:set>
    <c:if test="${not empty fileDate}">
        <p>${cms:resource().getName()} - ${fileDate}</p>
    </c:if>
</cms:contentload>

4. 无调试环境下的验证方法

  • 在页面输出关键变量,确认数据是否正确:
    <c:out value="资源对象:${folderFile}" />
    <c:out value="data属性值:${fileDate}" />
    
  • 确保data属性是标准可排序日期格式(如yyyy-MM-dd HH:mm:ss),否则排序会失效。

内容的提问来源于stack exchange,提问作者Numero 21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:50:39