如何根据portlet中的值在liferay主题中创建动态项

时间:2017-02-01 06:28:28

标签: liferay velocity liferay-theme

我在liferay中有一个主题,侧面菜单中有一些项目,我想根据我在portlet控制器中获得的值动态地向菜单中添加一些项目。

我的主题是这样的:

<div id="menu">
    <ul class="link" style="height: 609px;">    
        <li><a href="$themeDisplay.getPortalURL()/x" id="x" class="active">My Account<i class="pull-right" ></i></a></li>
        <li><a href="$themeDisplay.getPortalURL()/y" id="y" class="active">Settings<i class="pull-right" ></i></a></li>
    </ul>
</div>

我有一个portlet,我从列表中获取了一些值

List<String> list= new ArrayList<String>();
list.add("test1");
renderRequest.setAttribute("list", list);

列表可能有不同的值。

我想要的是如果我在列表中有一个名为test1的参数,我想在主题中添加一个新参数,以供该特定用户使用。

<li><a href="$themeDisplay.getPortalURL()/z" id="z" class="active">Bonus<i class="pull-right" ></i></a></li>

如果是JSP,我会使用但是如何在liferay主题中完成。(我使用的是速度主题)。

2 个答案:

答案 0 :(得分:2)

在您的问题评论中已经对此进行了相当多的讨论。您的主题无法访问“您的portlet的控制器”,这是思考问题的错误方法:如果portlet确定要显示的内容,则应将portlet嵌入主题中。毕竟,您可能希望与它进行交互,这是最简单的方法。

即使在页面上存在一个portlet,主题也不能随意使用任何portlet的请求属性 - 它们可以很好地避免通过设计相互访问:否则你将拥有所有流氓portlet和主题之间的各种冲突。

只要你不能保证页面上有一个portlet,你就不能只调用portlet上的任意方法。 (不是你可以的话)。

如果您想在主题中实现此功能,请告别“portlet控制器”。您应该将代码放在一个独立的实用程序类中,因为在这种情况下,portlet只是实现的错误位置。

我不完全理解你的完整用例,所以我不能告诉你哪个实现最有意义。只有你在问题中勾勒出的组合对我来说才是最不合理的。

答案 1 :(得分:2)

根据奥拉夫的回复,您可能应该采用更好的方法来进行此设计。但是,您可以在主题中使用Servlet上下文中的属性。 在您的portlet类中:

    HttpServletRequest request=PortalUtil.getHttpServletRequest(req);
    ServletContext servletContext=request.getSession().getServletContext();
    servletContext.setAttribute("param", "Product3");

然后可以通过主题速度模板中提供的请求变量在主题中检索:

    $request.getSession().getServletContext().getAttribute("param")