我正在使用 Adobe CQ5。我制作了两个相互独立的组件。但是,我想在另一个组件中使用来自一个组件的数据。我如何实现这一目标?如何使两个组件相互交互?
提前致谢。
有许多选项,取决于组件的耦合程度(例如,两者总是同时放置在页面上?它们是硬连接到模板中,还是由编辑器放置等)
如果两个组件在同一页面上,最简单的可能是在一个组件中设置一个变量并在另一个组件中读取它,例如:
foo.jsp
<c:set var="globalFooTitle" value="${properties.title}" scope="request"/>
酒吧.jsp
<c:out value="${globalFooTitle}">[Optional fallback value]</c:out>
虽然@kmb 的回答没有任何问题,但我几乎总是更喜欢使用更高级别的 API 而不是更低级别的 API。对于 CQ,这意味着使用 sling 资源 API 而不是 JCR 节点 API。
这看起来像这样,假设单个页面上的 2 个组件的结构与他布置的相同。
Resource r = resourceResolver.getResource(currentResource, "../component2");
if(r != null) {
ValueMap props = r.adaptTo(ValueMap.class);
String somePropertyValue = props.get("someProperty", "");
}
您可以使用javax.jcr.Node
和javax.jcr.Property
接口来获取另一个组件的属性。例如,您已将 component1 和 component2 添加到 page1。在存储库中,您应该具有类似于以下的结构:
/content
/project
/page1
/jcr:content
/parsys
/component1
/...some properties
/component2
/...some properties
如果你想在 component1 中获取 component2 的属性,你可以使用类似的东西:
Node parsys = currentNode.getParent();
if(parsys.hasNode("component2")) {
Node component2 = parsys.getNode("component2");
if(component2.hasProperty("someProperty"))
Property someProperty = component2.getProperty("someProperty");
}