Hi Friends,
Liferay provides the menu (root navigation). But it always shows from the current community. Sometimes, there is a need of creating a navigation from base community and not from the current community.
For e.g., In your Liferay portal, there are lot of communities and a single base community (with name BASE) which is common for all users and we need the root navigation based on that community only.
To achieve this, we need to create a ServicePreAction, which will create a new custom NavItem object and a change in navigation.vm of the theme, which will show the custom navigation.
Here are the steps to create the custom navigation
1) Create a new ServicePreAction say CustomServicePreAction using hook ( Refer http://www.liferay.com/community/wiki/-/wiki/Main/Portal+Hook+Plugins on creating ServicePre hook)
2) In the run() method of CusomServicePreAction, retrieve the BASE community group object
Group baseCommunity = GroupLocalServiceUtil.getGroup( themeDisplay.getCompanyId(), "BASE");
3) After that, retrieve the default layout and layout set of the base community. If you need to show private pages, then pass "true" in the getLayouts() method, else pass "false" to retrieve the public pages.
long defaultLayoutId = LayoutLocalServiceUtil .getDefaultPlid(baseCommunity.getGroupId());
Layout defaultLayout = LayoutLocalServiceUtil .getLayout(defaultLayoutId);
List
baseCommunity.getGroupId, true);
4) Create the RequestVars object from the defaultLayout and layoutSet
RequestVars requestVars = new RequestVars(req,themeDisplay, defaultLayout.getAncestorPlid(),
defaultLayout.getAncestorLayoutId());
5) finally, create the List of NavItems using RequestVars and layoutSet
List
6) Now, create a new HashMap like
Map
7) Save the NavItems into that
vmVariables.put("baseNavItems", navItems);
8). Save the HashMap into the request
req.setAttribute(WebKeys.VM_VARIABLES, vmVariables);
---------------------------------------------------------------------------------------
Now, in the navigation.vm of the Theme,
replace
#foreach ($nav_item in $nav_items) with #foreach ($nav_item in $baseNavItems)
---------------------------------------------------------------------------------------
Deploy the theme and the hook.
Now your top navigation will show the menu items from the BASE community and not from the current community.
Enjoy!
No comments:
Post a Comment