Liferay 7.3:如何预配置嵌入页面片段的 portlet?

Liferay 7.3: How to preconfigure a portlet embedded in a page fragment?

我们正在使用 Liferay 7.3 (CE) 并尝试将 "Content Pages" 的相对较新的功能与 "Page Fragments" 相结合。我们能够使用 <lfr-widget-WIDGETALIAS> 标记开发已经包含 portlet(在内容页面上下文中名为 "widgets")的页面片段。到目前为止,这有效。

现在我们正在尝试准备嵌入 portlet 的页面片段应用了特殊的 portlet 配置。例如,我们想要准备一个页面片段,它只显示一个资产发布者 portlet,该 portlet 配置为列出来自预定义类别的 WebContent 文章。用户应该能够直接将该片段放到页面上,而不必关心资产发布者 portlet 的配置。

我们没有找到任何直接的方法来实现这一点——我们最初的猜测是配置可以写成 <lfr-widget-...> 标签的属性或内容,但被 liferay 文档中的提示打消了没有可附加到该标签的有效属性或内容。

是否有人对如何在应用了预定义 portlet 配置的页面片段中实现嵌入 portlet 有所了解? (包括开箱即用的 Liferay portlet?)

我自己想出来了。

片段编辑器没有告诉您的一件事是片段的 HTML 部分实际上被解释为 Freemarker 模板,但需要注意的是只允许 Freemarkers alternative syntax

反过来,这意味着 Liferays 标签库可用,这意味着我们可以使用标签 <liferay-portlet:runtime>(当然,移植到 freemarker 替代语法),它接受 defaultPreferences 属性.现在我们可以只配置一次 portlet,在数据库中找到它的 portletPreferences XML 数据(参见 table PortletPreferences),删除我们不想预配置的值,然后只使用生成的首选项 XML 作为 <liferay-portlet:runtime> 标签的 defaultPreferences 属性的值。

必须注意任何 ID(例如,如果您想预配置 AssetCategory 过滤器)。最好从相应的服务中获取相应的对象,并从该对象中获取 ID。

此示例为将 AssetPublisher 放置到页面上的页面片段提供 HTML 部分,预配置为显示 12 个项目(而不是默认的 20 个)。 (CSS,片段的JS和配置是页面片段编辑器默认的。)

<div class="fragment-12345">
  [#assign assetPublisherPortletPreferences="<portlet-preferences>
    <preference>
        <name>delta</name>
        <value>12</value>
    </preference>
</portlet-preferences>" /]
  [@liferay_portlet["runtime"]
    instanceId="${fragmentEntryLinkNamespace}assets"
    portletName="com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet"
    defaultPreferences="${assetPublisherPortletPreferences}"
  /]
</div>

谢谢你,@orithena。你帮我省了很多麻烦。

要获得相同结果但语法更简单的另一种选择是使用 built-in freeMarkerPortletPreferences:

[#assign assetPublisherPortletPreferences=freeMarkerPortletPreferences.getPreferences({
    "delta": "12",
} /]