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

Posted

技术标签:

【中文标题】Liferay 7.3:如何预配置嵌入在页面片段中的 portlet?【英文标题】:Liferay 7.3: How to preconfigure a portlet embedded in a page fragment? 【发布时间】:2020-08-19 23:06:52 【问题描述】:

我们正在使用 Liferay 7.3 (CE) 并尝试将“内容页面”这一相对较新的功能与“页面片段”结合起来。我们能够使用<lfr-widget-WIDGETALIAS> 标记开发已经包含portlet(在内容页面上下文中称为“小部件”)的页面片段。到目前为止,这是可行的。

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

我们没有找到任何直接的方法来实现这一点——我们的第一个猜测是配置可以写为<lfr-widget-...> 标签的属性或内容,但由于 Liferay 文档中没有有效属性或要附加到该标签的内容。

是否有人知道如何在应用了预定义的 portlet 配置的情况下将 portlet 嵌入到页面片段中? (包括开箱即用的 Liferay portlet?)

【问题讨论】:

【参考方案1】:

我自己想通了。

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

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

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

此示例为页面片段提供了 HTML 部分,该页面片段将 AssetPublisher 放置在页面上,预配置为显示 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="$fragmentEntryLinkNamespaceassets"
    portletName="com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet"
    defaultPreferences="$assetPublisherPortletPreferences"
  /]
</div>

【讨论】:

【参考方案2】:

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

另一种方法是使用内置的freeMarkerPortletPreferences,以实现相同的结果但语法更简单:

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

【讨论】:

不知道模板上下文中的那个对象,谢谢! (我仍然会使用 XML 而不是这种类似 JSON 的语法,因为所有 TemplatePortletPreferences.getPreferences method 所做的只是构建一个 XML 字符串......我可以简单地从数据库中复制和粘贴。)

以上是关于Liferay 7.3:如何预配置嵌入在页面片段中的 portlet?的主要内容,如果未能解决你的问题,请参考以下文章

Liferay 7.3 广告

当我链接到另一个页面时,Liferay 6.1 PortletSession ID 在 Google Chrome 的 iframe 中发生了更改

如何使用管理员 Liferay 将我的自定义 portlet 拖/添加到 liferay 页面?

如何链接到另一个 liferay 页面

Liferay:如何配置 Liferay 门户

Liferay:如何从布局集中检索布局?