我有一个sling模型,处理与article_details_component相关的数据(基本上是与文章相关的标题、文本和图像)。除了这些基本数据,我还需要创建一个对象列表(ArticleTeaser对象),它将显示在我的文章页面的推荐部分。
逻辑如下:我有一个名为newsPage的父页面,在这个页面下我可以创建任意数量的新闻文章。在这些页面中,我有基于我的新闻页面下的其他文章的推荐。推荐部分是一个基于article_details_component标题和image创建的预告片对象列表。
因此,我需要遍历页面jcr结构来获取文章页面的article_componenet并检索其标题和图像,以便创建我的预告片。
这是我的代码,但它不工作,我不认为这是最好的方法:
private void getAllAvailableArticles(List<Page> childPages) {
List<Page> articlePages = childPages.stream()
.filter(page -> !page.getPath().equals(currentPage.getPath())) //remove current article page
.filter(page -> {
ValueMap props = page.getProperties();
return Boolean.TRUE.equals(props.get("isTeasable", Boolean.class)); // check if the authore wants this article to be added to the recommendation section an other article
}).collect(Collectors.toList());
articlePages.forEach(page -> {
Node n = resolver.getResource(page.getPath()).adaptTo(Node.class);
Node jcrContent = null;
NodeIterator childrenNodes = null;
try {
jcrContent = n.getNode("jcr:content");
childrenNodes = jcrContent.getNodes();
while (childrenNodes.hasNext()) {
Node node = childrenNodes.nextNode();
String resourceType = node.getProperty("sling:resourceType").getString();
if (resourceType.equals("myproj/components/content/c06-news-internal/v1/c06-news-internal")) {
teasers.add(ArticleTeaser.builder().teaserTitle(node.getProperty("teaserTitle").getString()).build());
}
}
} catch (RepositoryException e) {
e.printStackTrace();
}
});
}
你知道我该怎么做吗?提前感谢
通过直接获取组件节点找到了解决方案。
@NotNull
private void createRecommendations(List<Page> childPages) {
List<Page> articlePages = childPages.stream()
.filter(page -> !page.getPath().equals(currentPage.getPath()))
.filter(page -> {
ValueMap props = page.getProperties();
return Boolean.TRUE.equals(props.get("isTeasable", Boolean.class));
}).collect(Collectors.toList());
articlePages.forEach(page -> {
Node n = resolver.getResource(page.getPath()).adaptTo(Node.class);
Node newsInternalCmpnt = null;
try {
newsInternalCmpnt = n.getNode("jcr:content/root/responsivegrid/c06_news_internal");
if (newsInternalCmpnt != null && newsInternalCmpnt.hasProperty("teaserTitle") && newsInternalCmpnt.hasNode("image")) {
ArticleTeaser teaser = createTeaser(newsInternalCmpnt);
this.teasers.add(teaser);
}
} catch (RepositoryException e) {
LOGGER.error("unable to get news internal component node");
e.printStackTrace();
}
});
}