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

时间:2015-05-26 10:35:08

标签: java liferay liferay-6

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

/* script pseudo code */
if object1.date() - today() < SOME_CONSTANT 
    return true;
else
   if object2.field1 == 123 && oject1.date() > object2.field2
       return true;
   else
       return false;

/* Main block of code */
$obj1 = New path\to\Object1();
$obj2 = New Path\To\Object2();

$result = eval($script);

if $result
    doSomething();

以上代码工作正常。但它只在当前页面上工作,即它只能删除当前页面上的portlet。

但是我想删除门户网站上的portlet,它可能是我的门户网站菜单上的布局ID。

请建议出路。 提前谢谢。

此致
Varun Jain

3 个答案:

答案 0 :(得分:2)

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();
        }
    }

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

这个过程似乎很简单如下:
1。使用com.liferay.portal.service.LayoutLocalServiceUtil.getLayouts(long groupId, boolean privateLayout)获取所有页面/布局的列表 2. :迭代布局列表并从布局对象中提取portletIds列表com.liferay.portal.model.LayoutTypePortlet
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);
            }
        }
    }
}