我对AEM和6.1版本相对较新。我试图根据一个authorable文件路径列出孩子,但似乎无法弄明白。以前,我有类似
的东西<sly data-sly-list.child="${currentPage.getParent.listChildren}" data-sly-unwrap>...</sly>
它按预期工作。现在,我需要使它更通用,但
<sly data-sly-list.child="${properties.filePath.listChildren}" data-sly-unwrap>...</sly>
没有迭代。我想我需要使用&#34;资源&#34;对象,但不知道如何。我可以直接在我的通话中使用它吗?或者我是否必须创建/编辑当前的java文件?提前谢谢!
答案 0 :(得分:2)
我建议您使用Sling Model
将子项列表返回到HTL模板。以下代码是基于您提供的少量信息的此类模型的简单版本:
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.models.annotations.Optional;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;
import org.apache.sling.models.annotations.injectorspecific.OSGiService;
import java.util.Collections;
@Model(adaptable = Resource.class)
class MyModel {
@ValueMapValue
@Optional
private String filePath;
@OSGiService
private ResourceResolver resourceResolver;
public Iterator<Resource> getChildren() {
if (this.filePath == null || this.filePath.isEmpty()) { // Use StringUtils.isBlank() if you can.
return Collections.emptyIterator();
}
final Resource resource = this.resourceResolver.getResource(this.filePath);
if (resource == null) {
return Collections.emptyIterator();
}
return resource.listChildren();
}
}
您的HTL模板可能如下所示:
<sly data-sly-use.model="my.package.MyModel">
<sly data-sly-list.child="${model.children}" data-sly-unwrap>...</sly>
</sly>
说明:
filePath
应为@Optional
,因为在您的组件尚未配置但实例化模型时存在边缘情况。例如:编辑器将组件添加到页面但尚未打开并保存编辑对话框。该组件将被渲染,模型被实例化,但filePath
将是null
。答案 1 :(得分:0)
由于properties.filePath
返回String
,并且您在String类中没有listChildren
方法,因此您无法在HTL中直接执行此操作。< / p>
早些时候currentPage.getParent
会返回Page
,在调用Iterator<Page>
方法时会返回listChildren
。
由于HTL目前不允许您使用参数调用方法,因此您可能需要使用Java Use API或JS Use API来处理此场景。
要详细了解HTL和使用API,请参阅this doc。