Liferay7: Как программно обновить страницу контента? - PullRequest
0 голосов
/ 03 апреля 2020

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

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

    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??? */
    }

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

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

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

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

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

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

...