在 aem 6.4 中以编程方式安排内容
Programmatically arranging contents in aem 6.4
各位。我刚接触 aem
。我正在使用 aem 6.4
。我的任务是根据 JSON 文件的内容以编程方式对 aem
中 cq:project
的内容顺序进行排序。
JSON 文件的内容应设置为初始 child 而不是按创建日期排序的 children。
这是我的 cq:page
当前的结构。如果 child2 是 JSON 文件中指示的那个,它应该是第一个显示的。 JSON文件的内容只是一个child的名字所以即使有10个children,JSON文件的内容应该总是第一个在列表中。
尽管我仍然找不到任何解决方案,但我已经花了数小时研究如何实现它。关于我应该如何创建它的任何见解?谢谢!
这可能会有所帮助 -
- 从parent节点获取children。(你会得到'iterator'将其转换为列表-Convert Iterator to ArrayList)
- 立即删除所有 child 个节点。并保留以上清单的备份。
遍历列表,确定要首先放置的节点(按标题或其他 属性)将其添加到单独的集合(LinkedHashSet- 以保持顺序)。
- 现在将剩余的items/nodes以相同的顺序添加到上述集合中的特定节点之后。(您可能需要再次迭代)
- 现在这个 Set 有 nodes/Resources 按您想要的顺序迭代,创建节点并保存您的更改。
据我了解,您需要一种方法来将 cq:Page
的已命名子项排在列表的第一位。
This is possible because cq:Page is an orderable
node. This would not be possible otherwise. you chan check any nodetype in CRX Explorer.
我认为添加有关 JSON 的内容会使问题复杂化。您只需要一个简单的方法,例如:
private void orderAsFirstChild(String childName, Node parentNode) throws RepositoryException {
if (parentNode.hasNode(childName)) {
// find current first child name
String firstChildName = Optional.ofNullable(parentNode.getNodes())
.map(NodeIterator::nextNode)
.map(node -> {
try {
node.getName();
} catch (RepositoryException e) {
e.printStackTrace();
}
return (String) null;
}) //
.orElse(null);
parentNode.orderBefore(childName, firstChildName);
}
}
你可能应该稍微清理一下,但这是使用 Node#orderBefore
的一般想法
各位。我刚接触 aem
。我正在使用 aem 6.4
。我的任务是根据 JSON 文件的内容以编程方式对 aem
中 cq:project
的内容顺序进行排序。
JSON 文件的内容应设置为初始 child 而不是按创建日期排序的 children。
这是我的 cq:page
当前的结构。如果 child2 是 JSON 文件中指示的那个,它应该是第一个显示的。 JSON文件的内容只是一个child的名字所以即使有10个children,JSON文件的内容应该总是第一个在列表中。
尽管我仍然找不到任何解决方案,但我已经花了数小时研究如何实现它。关于我应该如何创建它的任何见解?谢谢!
这可能会有所帮助 -
- 从parent节点获取children。(你会得到'iterator'将其转换为列表-Convert Iterator to ArrayList)
- 立即删除所有 child 个节点。并保留以上清单的备份。 遍历列表,确定要首先放置的节点(按标题或其他 属性)将其添加到单独的集合(LinkedHashSet- 以保持顺序)。
- 现在将剩余的items/nodes以相同的顺序添加到上述集合中的特定节点之后。(您可能需要再次迭代)
- 现在这个 Set 有 nodes/Resources 按您想要的顺序迭代,创建节点并保存您的更改。
据我了解,您需要一种方法来将 cq:Page
的已命名子项排在列表的第一位。
This is possible because cq:Page is an
orderable
node. This would not be possible otherwise. you chan check any nodetype in CRX Explorer.
我认为添加有关 JSON 的内容会使问题复杂化。您只需要一个简单的方法,例如:
private void orderAsFirstChild(String childName, Node parentNode) throws RepositoryException {
if (parentNode.hasNode(childName)) {
// find current first child name
String firstChildName = Optional.ofNullable(parentNode.getNodes())
.map(NodeIterator::nextNode)
.map(node -> {
try {
node.getName();
} catch (RepositoryException e) {
e.printStackTrace();
}
return (String) null;
}) //
.orElse(null);
parentNode.orderBefore(childName, firstChildName);
}
}
你可能应该稍微清理一下,但这是使用 Node#orderBefore