如何在 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;
}
我没有测试这段代码,如果有问题请告诉我。
在 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;
}
我没有测试这段代码,如果有问题请告诉我。