如何在 Liferay 中使用 Freemarker 显示纯 HTML 的 Web 内容

How to display plain HTML of Web Content with Freemarker in Liferay

在 Liferay Portal 7.2 中,我有作为 Web 内容的元素列表。对于此列表中的每个 Web 内容,我想获得在 Web 内容本身中定义的 HTML 结果。

将 ADT 限制为具有默认模板的一个结构,以列出它为我工作的每个 Web 内容:

<#list entries as entry>                    
        
    <#if hasCategoryId(entry, selectedYearCategoryId) &&
            hasCategoryId(entry, selectedTipoNormativaCategoryId)>
            

        <#assign assetRenderer = entry.getAssetRenderer()/>
        <#assign journalArticle = assetRenderer.getAssetObject()/>

            <@liferay_journal["journal-article"]
                articleId=journalArticle.getArticleId()
                groupId=journalArticle.getGroupId()/>                                    

    </#if>

</#list>

“hasCategoryId”是一个自定义函数,此 ADT 嵌入需要重新加载整个页面,将参数传递给自身 URL。

我想知道我是否想使用 Ajax 并在 MVCRenderCommand MVCResourceCommand 中执行此操作,是否存在将 Web 内容转换为 HTML 给出 structureId、articleId、...

类似于:

JournalArticle.getHTML(structureId, templateId);

如果您要进入 Ajax,请使用 Headless API。您可以轻松获取 JSON 或 HTML.

的内容

抱歉,我对 Ajax 和 MVCRenderCommand 的引用有点困惑...

重读您的问题,我建议您根据 https://docs.liferay.com/dxp/apps/web-experience/7.0.11/taglibdocs/liferay-journal/journal-article.html

简单地将 templateKey 添加到您的标签调用中

类似于:

<@liferay_journal["journal-article"]
            articleId=journalArticle.getArticleId()
            ddmTemplateKey="654321"
            groupId=journalArticle.getGroupId()/> 

我想你正在寻找这个方法

    _journalArticleLocalService.getArticleDisplay(
                    themeDisplay.getScopeGroupId(), articleId, 
                    templateKey, null, themeDisplay.getLanguageId(), 
                    themeDisplay).getContent();

您可以在 docs 上看到更多相关信息。

由于您想通过 Ajax 调用来调用此代码,因此您可能应该使用 MVCResourceCommand。代码将是这样的:

package com.your.packace;

import com.liferay.journal.service.JournalArticleLocalService;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.portlet.bridges.mvc.BaseMVCResourceCommand;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCResourceCommand;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.WebKeys;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

@Component(
        immediate = true,
        property = {
                "javax.portlet.name=" + YourPortletKeys.YOUR_PORTLET_NAME,
                "mvc.command.name=/your/command/name"
        },
        service = MVCResourceCommand.class
)
public class GetArticleDisplayMVCResourceCommand extends BaseMVCResourceCommand {

    @Override
    protected void doServeResource(
            ResourceRequest resourceRequest, ResourceResponse resourceResponse)
        throws Exception {

        ThemeDisplay themeDisplay =
                (ThemeDisplay) resourceRequest.getAttribute(WebKeys.THEME_DISPLAY);

        String articleId = ParamUtil.getString(resourceRequest, "articleId");
        String templateKey = ParamUtil.getString(resourceRequest, "templateKey");

        JSONObject response = JSONFactoryUtil.createJSONObject();

        String html = _journalArticleLocalService.getArticleDisplay(
                themeDisplay.getScopeGroupId(), articleId,
                templateKey, null, themeDisplay.getLanguageId(),
                themeDisplay).getContent();

        response.put("html", html);

        resourceResponse.setContentType(ContentTypes.APPLICATION_JSON);
        resourceResponse.getWriter().write(response.toString());
    }

    @Reference
    private JournalArticleLocalService _journalArticleLocalService;
}

我没有测试这段代码,如果有问题请告诉我。