以编程方式安排Aem 6.4中的内容

时间:2019-03-19 10:50:12

标签: java adobe aem cq5 aem-6

每个人。我是aem的新手。我正在使用aem 6.4。我的任务是根据JSON文件的内容,以编程方式对cq:projectaem的内容进行排序。 JSON文件的内容应设置为初始子项,而不是按其创建日期排序的子项。

这是我的cq:page的当前结构。如果child2是JSON文件中指示的那个,则它应该是要显示的第一个。 JSON文件的内容只是一个孩子的名字,因此,即使有10个孩子,JSON文件的内容也应始终是列表中的第一个孩子。

enter image description here

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

2 个答案:

答案 0 :(得分:0)

这可能有帮助-

  1. 从父节点获取子节点。(您将获得“迭代器”,将其转换为此处的列表,{-Convert Iterator to ArrayList
  2. 立即删除所有子节点。并保留以上列表的备份。 遍历列表,确定要首先放置的节点(通过标题或其他属性),然后将其添加到单独的集合中(LinkedHashSet-以保持顺序)。
  3. 现在将其余项/节点以相同的顺序添加到上述集合中的特定节点之后。(您可能需要再次迭代)
  4. 现在,此Set包含您想要的顺序的节点/资源,可以迭代,创建节点并保存更改。

答案 1 :(得分:0)

据我了解,您想要一种将cq:Page的命名子项排序为列表中第一项的方法。

  

这是可能的,因为cq:Page是orderable节点。否则这是不可能的。您可以在CRX资源管理器中检查任何节点类型。

我认为添加有关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

的基本思路