Create project in Liferay Developer Studio:
Right click on project workspace -> New -> Liferay Module Project -> Select Project Template Name as "template-context-contributor"
package com.test.context.contributor;
import com.liferay.portal.kernel.template.TemplateContextContributor;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(
immediate = true,
property = {"type=" + TemplateContextContributor.TYPE_THEME},
service = TestTemplateContextContributor.class
)
public class TestTemplateContextContributor
implements TemplateContextContributor {
@Override
public void prepare(
Map<String, Object> contextObjects, HttpServletRequest request) {
contextObjects.put("testVar", "Liferay");
contextObjects.put("navItemHelper", navItemHelper);
}
@Reference(unbind="-")
NavItemHelper navItemHelper;
}
Note: Use public methods of NavItemHelper class by annotate with @Reference and NavItemHelper class must be a component. We can access public methods through navItemHelper variable from context in theme ftl.
/**
*
*/
package com.test.context.contributor;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.theme.NavItem;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.WebKeys;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.osgi.service.component.annotations.Component;
@Component(
immediate = true,
service = NavItemHelper.class
)
public class NavItemHelper {
public List<NavItem> fromLayouts(
HttpServletRequest request, List<Layout> layouts,
Map<String, Object> contextObjects) {
if ((layouts == null) || layouts.isEmpty()) {
return Collections.emptyList();
}
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
List<NavItem> navItems = new ArrayList<>(layouts.size());
for (Layout layout : layouts) {
navItems.add(
new NavItem(request, themeDisplay, layout, contextObjects));
}
return navItems;
}
}
Usage: In theme navigation.ftl use below code to retrieve public pages through context contributor variable i.e., navItemHelper.fromLayouts(request,publicPages, null)
<#assign
layoutlocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")
publicPages = layoutlocalService.getLayouts(themeDisplay.getScopeGroupId(),false,0)
navItemClass = staticUtil["com.liferay.portal.kernel.theme.NavItem"]
public_nav_items = navItemHelper.fromLayouts(request,publicPages, null)
/>
<#list public_nav_items as nav_item>
<#assign
nav_item_attr_has_popup = ""
nav_item_attr_selected = ""
nav_item_css_class = ""
nav_item_layout = nav_item.getLayout()
/>
</#list>
No comments:
Post a Comment