Программная компоновка содержимого в aem 6.4 - PullRequest
2 голосов
/ 19 марта 2019

все.Я новичок в работе с aem.Я использую aem 6.4.Моя задача - программно отсортировать порядок содержимого cq:project в aem в зависимости от содержимого файла JSON.Содержимое файла JSON должно быть установлено в качестве начального дочернего элемента, а не дочерних элементов, отсортированных по дате их создания.

Это текущая структура моего cq:page.Если child2 - это тот, который указан в файле JSON, он должен отображаться первым.Содержимое файла JSON - это просто имя одного дочернего элемента, поэтому, несмотря на 10 дочерних элементов, содержимое файла JSON всегда должно быть первым в списке.

enter image description here

Я часами изучал, как я могу это реализовать, хотя я до сих пор не могу найти никакого решения.Любое понимание того, как я должен создать это?Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Насколько я понимаю, вы хотите, чтобы способ, чтобы именованный потомок 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

0 голосов
/ 21 марта 2019

Это может помочь -

  1. Получить дочерние элементы из родительского узла. (Вы получите 'iterator', преобразующий его в список здесь - Преобразовать Iterator в ArrayList )
  2. Удалить все дочерние узлы сейчас. И держите резервную копию вышеупомянутого списка. итерируйте по списку, определите узел, который вы хотите поместить первым (по названию или другому свойству), добавьте его в отдельный набор (LinkedHashSet - для поддержания порядка).
  3. Теперь добавьте оставшиеся элементы / узлы в том же порядке после вашего конкретного узла в указанном выше наборе (возможно, вам придется повторить итерацию)
  4. Теперь в этом наборе есть узлы / ресурсы в том порядке, в котором вы хотите, итерируете, создаете узлы и сохраняете ваши изменения.
...