我正在遍历所有子页面以显示其标题和链接。但我还需要显示第一个段落节点(如果存在)。
例如,哇我会从以下内容页面中检索第一个PAR节点吗?
/content
/foo
/jcr:content
/title
/par <- need this one
/par
/image
我认为Page class getProperties().get()
方法可行,但我只看到在jcr:content中返回属性的示例,而不是它下面的任何子节点。
ArrayList aChildren = new ArrayList();
String listroot = properties.get("listRoot", currentPage.getPath());
Page rootPage = pageManager.getPage(listroot);
if (rootPage != null) {
Iterator<Page> children = rootPage.listChildren(new PageFilter(request));
while (children.hasNext()) {
Page child = children.next();
out.println( child.getTitle() + "<br>" );
//Output first PAR tag of this page here
}
}
可以使用或其他特定于CQ的标记来完成,还是这是java函数的工作?
答案 0 :(得分:8)
您必须遍历子页面的子节点。
获取具有资源类型parsys的第一个节点。拥有该节点后,您可以获取其路径并将其包含在当前页面中。
Resource childResource = resourceResolver.getResource(child.getPath());
Node childNode = childResource.adaptTo(Node.class);
Node jcrContent = childNode.getNode("jcr:content");
NodeIterator childrenNodes = jcrContent.getNodes();
while(childrenNodes.hasNext()){
Node next = childrenNodes.nextNode();
String resourceType = next.getProperty("sling:resourceType").getString();
if(resourceType.equals("foundation/components/parsys")){
%><cq:include path="<%= next.getPath() %>" resourceType="foundation/components/parsys" /><%
break;
}
}
这将在当前页面上嵌入子页面上的第一个parsys组件。我没有对此进行测试,因此可能需要进行一些修改才能使其正常工作。
答案 1 :(得分:2)
你也可以试试这个:
<%@page session="false" import="com.day.cq.wcm.foundation.Paragraph,
com.day.cq.wcm.foundation.ParagraphSystem"%>
<%
ParagraphSystem parSys = ParagraphSystem.create(resource, slingRequest);
for (Paragraph par: parSys.paragraphs()){
通过这种方式,您可以遍历当前资源下的parsys节点。
答案 2 :(得分:1)
CQ5存储库中的每个节点都可以表示为Resource。您可以使用以下代码获取资源
//resolver being instance of org.apache.sling.api.resource.ResourceResolver
Resource paraResource = resolver.getResource("path of the paragraph");
然后你可以操纵资源
答案 3 :(得分:1)
如果您尝试将解析从一个页面引用到另一个页面,我会使用开箱即用的reference component。此组件接受站点上任何位置的组件路径,并将其显示在您选择的页面上。