Liferay7: Как программно обновить страницу содержимого?

Я пытаюсь создать инициализатор для программного обновления всех страниц всего сайта. Не только для создания нового сайта (это было бы легко, мне просто нужно было бы взглянуть на код инициализатора сайта, например, темы фьорда), но и для переустановки существующего сайта в зависимости от того, где находится содержимое страницы. набор обновлений.

Это хорошо работает, если страница (также известная как Layoutв лексике бэкэнда Liferay) раньше не существовало. Примерно аналогично инициализатору сайта в теме фьорда, этот код здесь работает для создания страницы содержимого с некоторыми подготовленными фрагментами страницы:

    LayoutPageTemplateEntry layoutPageTemplateEntry =
        addOrUpdateLayoutPageTemplateEntry(
            layoutPageTemplateCollectionId, pageTemplateName, dataFilePath, serviceContext);

    for (FragmentEntry fe : fragmentEntries) {
      _log.debug("Using FragmentEntry " + fe.getName() + "[" + fe.getFragmentEntryId() + "/"
          + fe.getFragmentEntryKey() + "]: " + fe.getContent());
    }
    long[] fragmentEntryIds = ListUtil.toLongArray(
        fragmentEntries, FragmentEntryModel::getFragmentEntryId);
    _log.debug("Using FragmentIds: " + Arrays.toString(fragmentEntryIds));

    layoutPageTemplateEntry = _layoutPageTemplateEntryLocalService.updateLayoutPageTemplateEntry(
        layoutPageTemplateEntry.getLayoutPageTemplateEntryId(), sanitizedPageTemplateName,
        fragmentEntryIds, StringPool.BLANK, serviceContext);

    Map<Locale, String> nameMap = new HashMap<>();
    nameMap.put(LocaleUtil.getSiteDefault(), name);

    Map<Locale, String> friendlyUrlMap = new HashMap<>();
    for (Locale locale : LanguageUtil.getAvailableLocales(serviceContext.getScopeGroupId())) {
      friendlyUrlMap.put(locale, friendlyURL);
    }

    Layout layout = _layoutLocalService.fetchLayoutByFriendlyURL(serviceContext.getScopeGroupId(),
        privateLayout, friendlyURL);

    if (layout == null) {
      /* Layout for this friendlyURL does not exist yet, so create it! */
      layout = _layoutLocalService.addLayout(
          serviceContext.getUserId(),
          serviceContext.getScopeGroupId(),
          privateLayout,
          parentLayoutId,
          _portal.getClassNameId(LayoutPageTemplateEntry.class),
          layoutPageTemplateEntry.getLayoutPageTemplateEntryId(),
          nameMap,
          nameMap,
          new HashMap<>(),
          new HashMap<>(),
          new HashMap<>(),
          LayoutConstants.TYPE_CONTENT,
          null,
          hidden,
          false,
          friendlyUrlMap,
          0,
          serviceContext);
      _log.info("Added Layout " + layout.getNameCurrentValue() + " (" + layout.getLayoutId() + ")");

      final Layout finalLayout = layout;
      TransactionCommitCallbackUtil.registerCallback(
        () -> {
          Layout draftLayout = _layoutLocalService.fetchLayout(
              _portal.getClassNameId(Layout.class), layout.getPlid());

          if (draftLayout != null) {
            _layoutCopyHelper.copyLayout(draftLayout, layout);
            _log.debug("Copied draftLayout into Layout " + layout.getName("de_DE") + "["
                + layout.getPrimaryKey() + " ("
                + layout.getFriendlyURL() + ")");
          } else {
            _log.warn("draftLayout is null when trying to copy it into " + layout.getName() + " ("
                + layout.getFriendlyURL() + ")");
          }

          _layoutLocalService.updateLayout(
              layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(),
              new Date());
          _layoutLocalService.updateStatus(serviceContext.getUserId(), finalLayout.getPlid(),
              WorkflowConstants.STATUS_APPROVED, serviceContext);
          return null;
        });
    } else {
      /* Layout for the given friendlyURL already exists -> update it! */
      /* But HOW??? */
    }

Мой вопрос в основном таков: что мне нужно сделать в последнем блоке else? Как обновить содержимое страницы содержимого?

Или другими словами: где документация о том, как заполнить Layoutпрограммно (могу только предположить, что его не существует)? Какие существуют варианты заполненияLayout в Liferay 7?

Исходя из моего опыта работы с Liferay, я предположил, что для каждого addModelObject метод, соответствующий updateModelObjectметод будет существовать. Согласно моим тестам, здесь этого не происходит.

Пробовал методы обновления от LayoutLocalServiceи закончилась без изменений или пустая страница; Я попытался удалить весь LayoutSet, чтобы создать его заново, что совершенно не понравилось Liferay; Я пробовал создатьLayout заново, чтобы заменить старые Layoutкаким-то образом, что закончилось конфликтом дружественных URL-адресов; Я попытался полностью удалить все дружественные URL-адреса, прежде чем создавать макеты заново, в результате чего остались пустые страницы (хорошо, не совсем пустые: страница содержит только три пустых<section>теги потом); Я попытался создать черновик макета (опуская дружественный URL-адрес) и скопировать его в старый макет, который закончился с помощью ConstraintViolation (вероятно, из-за неперехваченного конфликта дружественных URL-адресов).

Все, что я пробовал, приводило к тому, что я наталкивался на одну из следующих стен: а) полученная страница была пустой; б) результирующая страница исчезла из навигации и пуста, в) конфликт дружественных URL-адресов вызвал исключение, г) БД пожаловалась на ConstraintViolation.

(Дополнительная информация: я пишу все это для ситуаций, когда экспорт / импорт LAR не работает, поэтому любые решения, использующие импорт LAR, здесь не обсуждаются).

0 ответов

Другие вопросы по тегам