【问题标题】:Programmatically arranging contents in aem 6.4在 aem 6.4 中以编程方式排列内容
【发布时间】:2019-08-09 20:58:22
【问题描述】:

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

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

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

【问题讨论】:

  • 我很难听懂你的问题。什么是 JSON 文件?它与节点结构有何关系?您能否提供订购前和订购后的节点结构以及示例 JSON,以便我们进一步提供帮助?
  • JSON 文件包含的配置应该是我正在创建的下拉列表的默认配置。目前,下拉列表获取“父项目”的子项的顺序,如图所示。如果json文件包含'child2',它应该是parent-proj的第一个孩子。

标签: java adobe aem aem-6


【解决方案1】:

据我了解,您希望有一种方法可以将 cq:Page 的命名子代排在列表的首位。

这是可能的,因为 cq:Page 是一个 orderable 节点。否则这是不可能的。您可以在 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 的一般想法

【讨论】:

  • 我只是稍微调整了一下,它就奏效了。谢谢!
【解决方案2】:

这可能会有所帮助 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多