如何在Crafter CMS的FTL模板中列出组件文件夹下的所有siteItem?
问题原因
原有代码不生效主要有两个核心原因:
siteItemService.getSiteItem()获取到文件夹节点后,默认的getChildItems()方法只会返回已发布的页面类型内容,不会包含组件类型的内容项- 未做兼容的空值处理,部分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
相关产品推荐
相关产品推荐

