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

如何在Crafter CMS的FTL模板中列出组件文件夹下的所有siteItem?

问题原因

原有代码不生效主要有两个核心原因:

  1. siteItemService.getSiteItem() 获取到文件夹节点后,默认的 getChildItems() 方法只会返回已发布的页面类型内容,不会包含组件类型的内容项
  2. 未做兼容的空值处理,部分Crafter CMS版本中组件路径的匹配规则和页面存在差异

正确实现方案

方案1:修正现有API调用(适合遍历文件夹下的直接子组件)

调用支持指定内容类型的重载方法即可,代码如下:

<#assign componentFolder = siteItemService.getSiteItem("/site/components/folder1")!>
<#if componentFolder??>
    <!-- 第一个参数指定要获取组件类型内容,第二个参数false表示不递归遍历子文件夹 -->
    <#list componentFolder.getChildItems("component", false)![] as item>
        <p>${item.title_s!''}</p>
    </#list>
</#if>

方案2:搜索查询实现(更灵活,支持过滤、排序、递归查询)

如果需要筛选特定组件类型、自定义排序或者递归遍历所有子目录下的组件,用搜索服务的兼容性更强:

<#assign components = searchService.query({
    "query": {
        "bool": {
            "must": [
                {"match": {"path": "/site/components/folder1/*"}},
                {"match": {"content-type": "component"}}
            ]
        }
    },
    "sort": [{"title_s": "asc"}]
})!{}>

<#list components.items?? && components.items?size > 0 then components.items else [] as item>
    <p>${item.title_s!''}</p>
</#list>

补充说明

  • 如果你使用了自定义组件类型,把代码里的component替换成你自己的内容类型ID即可
  • 字段名要和组件定义的字段匹配,如果存储标题的字段不是title_s,修改为对应字段名即可
  • 本地测试时请确认组件已经发布,或者预览模式下开启了查看未发布内容的权限

内容的提问来源于stack exchange,提问作者Lana James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:06:07