How to add nested portlets(liferay) through code

岁酱吖の 提交于 2019-12-30 06:41:31

问题


We have something called nested portlets in liferay. I want to add this portlet dynamically through code. Does anyone know the code for adding nested portlets, and add other portlets inside it?

Thanks !!!


回答1:


for complete example i'll assume that you want to add nested portlet to current page using another portlets action handler. (if used from render action you would not see nested portlet until next view of the page)

Add these methods to your code

private static String addPortlet(final long p_userId, final Layout p_layout, final String p_portletId, final String p_columnId, final int p_position, final boolean p_checkPermission)
                throws PortalException, SystemException
{
    if (p_layout.isTypePortlet()) {
        final LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) p_layout.getLayoutType();

        final String portletId = layoutTypePortlet.addPortletId(p_userId, p_portletId, p_columnId, p_position, p_checkPermission);
        if (portletId != null) {
            final String rootPortletId = PortletConstants.getRootPortletId(portletId);
            final String portletPrimaryKey = PortletPermissionUtil.getPrimaryKey(p_layout.getPlid(), portletId);
            ResourceLocalServiceUtil.addResources(p_layout.getCompanyId(), p_layout.getGroupId(), 0, rootPortletId, portletPrimaryKey, true, true, true);
            LayoutLocalServiceUtil.updateLayout(p_layout.getGroupId(), p_layout.isPrivateLayout(), p_layout.getLayoutId(), p_layout.getTypeSettings());
        }
        return portletId;
    }

    return null;
}

private static void addNestedPortlet(final PortletRequest p_request) throws PortalException, SystemException {
    final ThemeDisplay themeDisplay = (ThemeDisplay) p_request.getAttribute(WebKeys.THEME_DISPLAY);
    final Layout layout = themeDisplay.getLayout();
    long userId = themeDisplay.getUserId();

    //create nested portlet and add it to "column-1"
    final String nestedPortletId = addPortlet(userId, layout, "118", "column-1", -1, false);

    //this will be used to target nested portlet's columns
    final String nestedColumnPrefix = "_" + nestedPortletId + "__";

    //default page layout (used by nested portlet) has two columns
    //we'll add two portlets (in this example two iframe portlets), one portlet to each column
    addPortlet(userId, layout, "48", nestedColumnPrefix + "column-1", -1, false);
    addPortlet(userId, layout, "48", nestedColumnPrefix + "column-2", -1, false);
}


If you would like, and probably you would, to add nested portlet to another page or not from portlet, you can lookup Layout and User instead of getting them from ThemeDisplay.



来源:https://stackoverflow.com/questions/8395944/how-to-add-nested-portletsliferay-through-code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!