如何从代码中以编程方式删除 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();
}
}
我正在使用 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();
}
}