4

我有一个关于使用 Sightly 访问组件的子节点的问题。我有一个模板,它使用 data-sly-resource 引入基本图像组件,就像这样。

<div class="${wcmmode.edit ? 'image-edit image' : 'image'}" data-sly-resource="${ 'heroImage' @ resourceType='/libs/foundation/components/image', appendPath='image', selectors='fileReference' }"> </div>

我想做的是根据该图像组件是否实际具有图像集来更改 css 类。为此,我的计划是访问图像组件节点并读取其文件引用。类似的东西

<h1>${ properties["heroImage"] }</h1>

不幸的是,这不起作用。我的问题是如何从我的模板访问 heroImage 资源的 fileReference,将其视为子节点。

谢谢,哈利

4

2 回答 2

5

在 AEM6 中,如果不准备 Use-API 中的数据,就无法直接从 Sightly 模板访问子节点及其属性。

这是您准备数据的一种方式,因此在您的 CQ 组件中,您通常会有类似以下两个文件的内容。

<!-- template.html -->
<h1 data-sly-use.logic="Logic">
    ${logic.heroImage.fileReference}
</h1>

<!-- Logic.java -->
package apps.PATH.TO.YOUR.COMPONENT.FOLDER;

import com.adobe.cq.sightly.WCMUse;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ValueMap;

public class Logic extends WCMUse {
    private static final String CHILD_NODE = "heroImage";
    private ValueMap childProperties;

    @Override
    public void activate() throws Exception {
        Resource childResource = getResource().getChild(CHILD_NODE);
        childProperties = childResource.adaptTo(ValueMap.class);
    }

    public ValueMap getHeroImage() {
        return childProperties;
    }
}

您还可以将 Logic.java 文件移动到 OSGi 包中,然后您显然会更改包名称,并且在调用该类的模板中,您必须提供完全限定的包名称:<h1 data-sly-use.logic="com.PATH.TO.YOUR.PACKAGE.Logic">

希望有帮助,加布里埃尔

于 2014-12-01T12:04:04.790 回答
4

由于至少有 AEM 6.1(Sling API 捆绑包 2.7.0),因此 Sling资源APIgetValueMap()上有一个方法。所以你现在可以简单地使用:

${resource.valueMap.fileReference}

另请参阅这个较新的问题:如何在 Sightly 中访问 data-sly-list 项的属性?

于 2015-10-29T23:59:05.353 回答