AEM从路径列出孩子

时间:2017-05-11 23:51:39

标签: aem

我对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文件?提前谢谢!

2 个答案:

答案 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>

说明:

  1. filePath应为@Optional,因为在您的组件尚未配置但实例化模型时存在边缘情况。例如:编辑器将组件添加到页面但尚未打开并保存编辑对话框。该组件将被渲染,模型被实例化,但filePath将是null
  2. 显然,您的HTL模板可能看起来有点不同。

答案 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