如何从代码中以编程方式删除 Liferay 6.1 中的 portlet

How to delete a portlet in Liferay 6.1 programmatically from code

我正在使用 Liferay 6.1
我想从我的代码中删除 Liferay 6.1 中的一个 portlet。 到目前为止我所做的是:

<a onclick="Liferay.Portlet.close('#p_p_id_28_'); return false;">Remove</a>

以上代码运行良好。但它只在当前页面上工作,即它只能删除当前页面上的 portlet。

但我想使用其布局 ID 删除门户菜单上某个位置的 portlet。

请提出出路。 提前致谢。

此致,
Varun Jain

方法是: 在数据库中查询 portlet 所在的所有布局,而不是迭代和删除。 如果我不监督某些事情,您将需要实施自定义查询或动态查询。也许已经有一个服务功能来获取所需的布局 ID,但我对此表示怀疑。

从未尝试过,但我认为,您可以使用 Liferay 的服务实现您想要的。

这个过程似乎很简单,如下所示:
1. 使用 com.liferay.portal.service.LayoutLocalServiceUtil.getLayouts(long groupId, boolean privateLayout)
获取所有页面/布局的列表 2. 迭代布局列表并从投射到 com.liferay.portal.model.LayoutTypePortlet
的布局对象中提取 portletId 列表 3. 迭代 portletIds 并将每个 porteltId 与您的 portletId 字符串进行比较。
4. 如果匹配调用 com.liferay.portal.model.layoutTypePortlet.removePortletId(long userId, String portletId) 并使用 LayoutLocalServiceUtil.updateLayout(Layout layout)

更新布局

因此,示例代码如下所示:

String portletId = "#p_p_id_28_";
long userId = user.getUserId();
ArrayList<Layout> layouts = LayoutLocalServiceUtil.getLayouts(10180, true);

for(Layout layout : layouts){
    if(!layout.isHidden()){
        LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();
        ArrayList<String> layoutPortletIds = layoutTypePortlet.getPortletIds();

        for(String layoutPortletId : layoutPortletIds){
            if(layoutPortletId.equalsIgnoreCase(portletId)){
                layoutTypePortlet.removePortletId(userId, portletId);
                LayoutLocalServiceUtil.updateLayout(layout);
            }
        }
    }
}
public void removePortlets(ActionRequest request, ActionResponse response)
            throws PortletException {
        ThemeDisplay themeDisplay = (ThemeDisplay) request
                .getAttribute(WebKeys.THEME_DISPLAY);
        long groupId = themeDisplay.getScopeGroupId();
        String friendlyURL = "/demochildpage";
        boolean privateLayout = false;
        long userId = themeDisplay.getUserId();
        try {
            Layout layout = LayoutLocalServiceUtil.getFriendlyURLLayout(
                    groupId, privateLayout, friendlyURL);
            LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout
                    .getLayoutType();
            layoutTypePortlet.removePortletId(userId, "28");
            LayoutLocalServiceUtil.updateLayout(layout.getGroupId(),
                    layout.getPrivateLayout(), layout.getLayoutId(),
                    layout.getTypeSettings());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }