Thursday, September 2, 2021

Liferay DXP Theme Template Context Contributor

 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