【问题标题】:How to delete a portlet in Liferay 6.1 programmatically from code如何以编程方式从代码中删除 Liferay 6.1 中的 portlet
【发布时间】:2015-08-07 23:33:26
【问题描述】:

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

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

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

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

请提出一条出路。 提前致谢。

问候,
瓦伦·贾恩

【问题讨论】:

    标签: java liferay liferay-6


    【解决方案1】:

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

    【讨论】:

    • 嘿 Gevatterjan,这是一个好主意,我也试过了,但问题是它只有在重新启动服务器后才会删除 portlet。我也尝试了其他东西,其中一个效果很好,我把它贴在这里作为答案。所以你可以看看它。顺便说一句,感谢您的帮助。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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();
              }
          }
      

      【讨论】:

      • “我想删除可能在我的门户菜单上使用其布局 ID 的某个位置的 portlet”与您的答案的关系不清楚。
      • 上述逻辑将只从 demochildpage 页面中删除 portlet。
      • 为了演示目的,我只删除了这个页面上的portlet,但它可以被动态删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多