在 aem 6.4 中以编程方式安排内容

Programmatically arranging contents in aem 6.4

各位。我刚接触 aem。我正在使用 aem 6.4。我的任务是根据 JSON 文件的内容以编程方式对 aemcq:project 的内容顺序进行排序。 JSON 文件的内容应设置为初始 child 而不是按创建日期排序的 children。

这是我的 cq:page 当前的结构。如果 child2 是 JSON 文件中指示的那个,它应该是第一个显示的。 JSON文件的内容只是一个child的名字所以即使有10个children,JSON文件的内容应该总是第一个在列表中。

尽管我仍然找不到任何解决方案,但我已经花了数小时研究如何实现它。关于我应该如何创建它的任何见解?谢谢!

这可能会有所帮助 -

  1. 从parent节点获取children。(你会得到'iterator'将其转换为列表-Convert Iterator to ArrayList
  2. 立即删除所有 child 个节点。并保留以上清单的备份。 遍历列表,确定要首先放置的节点(按标题或其他 属性)将其添加到单独的集合(LinkedHashSet- 以保持顺序)。
  3. 现在将剩余的items/nodes以相同的顺序添加到上述集合中的特定节点之后。(您可能需要再次迭代)
  4. 现在这个 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

的一般想法